В опубликованной на днях статье про резервное копирование в WebDav мы касались того, что davfs2 из репозитория OpenWrt не всегда способен успешно загружать файлы в удаленное хранилище, и зачастую они заканчивают свой путь в каталоге lost+found. При этом чтение файлов из WebDav, получение их атрибутов, а также и удаление – всегда работает корректно.
Как оказалось, эта проблема имеет простое решение.
Логирование в davfs2, размещенном на роутере под управлением OpenWrt, организовано не самым удобным образом. Лог всегда пишется в системный кольцевой буфер, прочитать который можно при помощи команды logread, и объем оного весьма незначителен. А отладочные сообщения davfs2 в зависимости от выбранного уровня отладки либо слишком подробны и многочисленны, либо слишком кратки и по ним ничего невозможно понять.
Так или иначе, при работе стандартного пакета davfs2 с выставленным в davfs2.conf параметре debug most в системном логе можно наблюдать следующие строки при попытке загрузки файла в удаленное хранилище:
Mon Dec 22 19:15:36 2014 mark.debug syslog: Running pre_send hooks Mon Dec 22 19:15:36 2014 mark.debug syslog: Sending request headers: Mon Dec 22 19:15:36 2014 mark.debug syslog: PUT /testfile HTTP/1.1 User-Agent: davfs2/1.5.2 neon/0.30.0 Connection: TE TE: trailers Host: webdav.yandex.ru Transfer-Encoding: chunked Authorization: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Mon Dec 22 19:15:36 2014 mark.debug syslog: Sending request-line and headers: Mon Dec 22 19:15:36 2014 mark.debug syslog: Sending request body: Mon Dec 22 19:15:36 2014 mark.debug syslog: Request body provider failed with Mon Dec 22 19:15:36 2014 mark.debug syslog: - Mon Dec 22 19:15:36 2014 mark.debug syslog: 1 Mon Dec 22 19:15:36 2014 mark.debug syslog: Mon Dec 22 19:15:36 2014 mark.debug syslog: sess: Closing connection. Mon Dec 22 19:15:36 2014 mark.debug syslog: sess: Connection closed. Mon Dec 22 19:15:36 2014 mark.debug syslog: Request ends, status Mon Dec 22 19:15:36 2014 mark.debug syslog: 0 Mon Dec 22 19:15:36 2014 mark.debug syslog: class Mon Dec 22 19:15:36 2014 mark.debug syslog: 0 Mon Dec 22 19:15:36 2014 mark.debug syslog: xx, error line: Mon Dec 22 19:15:36 2014 mark.debug syslog: Failed reading request body file: Bad address Mon Dec 22 19:15:36 2014 mark.debug syslog: Mon Dec 22 19:15:36 2014 mark.debug syslog: Running destroy hooks. Mon Dec 22 19:15:36 2014 mark.debug syslog: Request ends. Mon Dec 22 19:15:36 2014 mark.debug syslog: tidy: neon error Mon Dec 22 19:15:36 2014 mark.debug syslog: Failed reading request body file: Bad address
Как видим, выводится не самая информативная ошибка Bad address, происходящая из используемой в davfs2 для коммуникации библиотеки neon – текста Failed reading request body file в исходных кодах davfs2 найти не получится.
После некоторой изыскательной деятельности удалось обнаружить, что причина кроется в том простом факте, что библиотека neon и пакет davfs2 по умолчанию компилируются с разными параметрами. Так, в Makefile пакета neon указаны следующие флаги:
TARGET_CPPFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
А в Makefile пакета davfs2 такая строка отсутствует. И именно это отличие приводит к фатальной нестыковке, когда дело доходит до загрузки файлов в удаленное хранилище. Простым добавлением означенных флагов в Makefile проблема полностью решается и davfs2 начинает всегда корректно загружать файлы в WebDav.
PS: Кстати, интересно отметить, что данная проблема не была зафиксирована в устаревшей версии davfs2, размещенной в нашем архиве – в нашем случае Makefile содержал все необходимые флаги для корректной сборки. Вопрос, отчего требуемые флаги потерялись в Makefile из официального репозитория OpenWrt, оставим на совести его мейнтейнеров. Да, кстати, версия davfs2 в нашем хранилище теперь обновлена до актуальной 1.5.2. А также приложен дополнительный патч, корректирующий вывод отладочного текста в системный лог.
Спасибо за пакеты =)
Привет на релизе Chaos Calmer 15.05 davfs2 не собирается с поддержкой языков =(