rsync mkstemp потерпел неудачу Неверный аргумент (22) при монтировании davfs в облаке Box.com

10

Я смонтировал облачное хранилище Box.com, используя davfs в соответствии с этими инструкциями . Я подключил свой аккаунт Box.com в / home / me / Cloud / Box

Я могу получить доступ к смонтированной файловой системе через Dolphin, а также через терминал. Это немного медленно, но я могу перечислить (ls) и перемещаться по всей структуре каталогов без ошибок.

Затем я попытался запустить rsync следующим образом:

rsync -auvz  --max-size=250M --exclude '.*' /home/me/Music/ /home/me/Cloud/Box/Music

Я также попробовал:

rsync -auv  /home/me/Music/A /home/me/Cloud/Box/Music

и другие варианты команд rsync. Команда копирует мою музыку из моей локальной файловой системы (/ home / me / Music /) в облако Box (/ home / me / Cloud / Box / Music) через монтирование davfs.

Я всегда получаю много ошибок этой формы:

rsync: mkstemp <filename> failed: Invalid argument (22)

Конкретный пример:

rsync: mkstemp "/home/me/Cloud/Box/Music/VariousArtists/.01_Track_1.mp3.YVmFI9" failed: Invalid argument (22)

Все это происходит на 64-битном Kubuntu 12.04 LTS, серверном оборудовании, с быстрым / надежным подключением через кабельный модем (скорость загрузки 12 Мбит / с).

MountainX
источник

Ответы:

7

Проблема возникает из-за rsyncсоздания временных файлов с именами файлов, которые box.com и / или davfs не понимают. Таким образом, файл .01_Track_1.mp3.YVmFI9не существует в вашей системе, но это временный артефакт из rsync. Некоторые предположения с моей стороны: если вы не получите ошибку для всех файлов, вы, вероятно, получите ошибки только для файлов, которые уже были загружены (и изменены).

Он используется , чтобы невозможно выключить это поколение временного файла, но вы можете в настоящее время имеют больше удачи, добавив опцию --inplace. Однако преимущества использования rsync, если вы не общаетесь с rsync-демоном (которым вы не являетесь, если вы используете davfs), мне неясны.

Поэтому, в качестве альтернативы, вы можете попробовать cp --update, который копирует файл только тогда, когда источник новее, чем место назначения. Новые файлы и любые файлы с изменениями в тегах ID3 будут скопированы, другие - нет.

Или, если вам нужно больше контроля использовать find:

cd /home/me/Music/
find * -size -250M -print0 | cpio -pdmv0 /home/me/Cloud/Box/Music

это сохраняет структуру иерархии и cpioне перезаписывает существующие файлы, которые не являются более старыми.

Энтон
источник
1
Одна из причин использования rsync заключается в том, что я уже знаю, как ограничить его копированием файлов размером менее 250 МБ и файлов или каталогов, которые не являются скрытыми. Я использую --max-size=250M --exclude '.*' . Я уверен, что cpможно сделать это ... может быть, отправив вывод find в cp? Но я пока не знаю, как это сделать. Если мы придумаем решение, я попробую cp -ru. Спасибо
MountainX
В этом случае вам вообще не нужен cp -u, используйте cpio (см. Обновленный ответ)
Anthon
Спасибо. Я верю, что это решит это для меня. Вы обучили меня в процессе, который я ценю. (К вашему сведению, в моем случае я хочу файлы размером менее 250 МБ, но не больше.)
MountainX
Это то ... -size -250M, что нужно, иначе вы бы использовали +250M(здесь была краткая неверная версия, но я понял это до того, как исправление было исправлено)
Anthon
3

1. Проблемы со специальными символами в именах файлов

Есть ли специальные символы в именах файлов? В зависимости от файловой системы, в которую вы записываете эти файлы, они могут не позволять вам добавлять к файлам префикс, например, с точкой ( .).

2. Проблемы со временем модификации rsync и webdav2

Я наткнулся на это сообщение в блоге, где описана rsyncпроблема с проблемой записи / отслеживания времени изменения файла в подключенных к webdav2 каталогах box.com.

Проблема проявляется следующим образом в смонтированной файловой системе:

david@sydney:~/Pictures$ ls -l /mnt/box/bwca/08/09/IMG_3084.CR2
-rw-r--r-- 1 david david 12564061 Aug 14 16:08 /mnt/box/bwca/08/09/IMG_3084.CR2
david@sydney:~/Pictures$ ls -l 2012/08/09/IMG_3084.CR2
-rw-rw-r-- 1 david david 12564061 Aug  9 13:00 2012/08/09/IMG_3084.CR2

Та же статья показала обходной путь:

$ rsync -avhP --size-only --bwlimit=64 2012/08 /mnt/box/bwca/

Это нормальный способ использования rsync, но теперь он сравнивает файлы только по размеру, а не по контрольным суммам.

3. Проблемы с davfs2 (WebDAV)

Я наткнулся на эту тему под названием: rsync через davfs2? на форуме WebDAV (davfs) на sourceforge. Кто-то интересовался похожей ситуацией, когда они хотели использовать WebDAV для подключения поставщика онлайн-хранилищ и выполнения rsync для подключенного хранилища через WebDAV. Это то, что один из разработчиков (Вернер Бауманн) из WebDAV должен был сказать по этой теме .

выдержка из ответа Вернера

  • davfs2 будет загружать только полные файлы. Он не может делать инкрементные вещи, которые обычно делает rsync, и это делает rsync очень эффективным.

  • davfs2 использует локальный кеш на диске. Это сделает его более отзывчивым, и ваше приложение должно извлечь из этого выгоду. Но для этого нужно место на локальном диске. Вы должны предусмотреть большой размер кэша, чтобы rsync мог выполнять большую часть своей работы с локальным кэшем, а davfs2 будет загружать большинство файлов в фоновом режиме, когда rsync уже завершит работу.

Вернер продолжает предлагать следующее

Это может быть недостатком в этом случае. Когда rsync читает файл на удаленном хосте, он сначала должен быть передан davfs2 в локальный кеш (если его там еще нет). Это может сделать процесс действительно ненужным и медленным. Поскольку rsync в вашем случае работает только как сложная копировальная программа, может быть лучше использовать cp. У cp есть опции (-u) для копирования только тех файлов, которые новее, чем файлы в файловой системе davfs2 (= smartdrive), и ему не нужно читать файлы, а только читать метаданные файла, такие как mtime.

Команда типа "cp -pru directory / to / backup dav /" может выполнить эту работу. Он не должен загружать файлы (как может сделать rsync, но я не уверен) (пожалуйста, посмотрите руководства по cp и rsync).

Опции?

Поэтому, как предложил @Anthon, вы можете использовать cp -uметод для копирования файлов. Понимая, что этот метод рассматривает только размер файла как фактор сравнения, он не совсем надежен.

Вы не должны использовать ничего, что смотрит только на время модификации при сравнении файлов cp -pru. Вернер объясняет, почему в этой теме :

выдержка в выпуске с модом раз

Когда вы отключите файловую систему davfs2 и снова смонтируете ее через некоторое время, время файла может измениться в соответствии с информацией о времени с сервера. Такие инструменты, как cp -pu и rsync, не могут полагаться на это время, чтобы определить, какие файлы были изменены.

Поэтому, учитывая различные проблемы, связанные со временем модификации, подход, использующий чисто контрольные суммы, кажется более подходящим:

$ rsync -avvz --omit-dir-times --checksum --human-readable --progress <local dir> <remote dir>
SLM
источник
Привет. В именах файлов нет специальных символов. Мое имя файла на диске просто "01_Track_1.mp3". Точечный префикс не является частью обычного имени файла и не является дополнительным расширением (например, .mp3.YVmFI9). Также обратите внимание, что не каждый файл дает сбой. Похоже, что неудачи не имеют закономерности.
MountainX
это достаточно информации? got file_sum recv_files(Some_Music_[1999]/Some_Music_[1999]Zuni_SongVarious_Artists24.mp3) rsync: mkstemp "/home/me/Cloud/Box/Music/Some_Music_[1999]/.Some_Music_[1999]Zuni_SongVarious_Artists24.mp3.1aWWRY" failed: Invalid argument (22) got file_sum
MountainX
Другой пример:got file_sum recv_files(Carlos/Dance/05-Tapestry-Carlos.mp3) rsync: mkstemp "/home/me/Cloud/Box/Music/Carlos/Dance/.05-Tapestry-Carlos.mp3.WeGbGS" failed: Invalid argument (22) got file_sum recv_files(Carlos/Dance/06-Dance-Turquoise_Dance-Carlos.mp3)
MountainX
@MountainX - посмотрите, является ли мое обновление вашей проблемой. Кроме того, какую версию rsyncвы используете? rsync --version,
SLM
rsync version 3.0.9 protocol version 30и сейчас я тестирую ваше обновленное решение. Спасибо!
MountainX
3

Чтобы остановить Invalid argument (22)ошибку, мне пришлось остановить rsync от создания временных файлов в месте назначения davfs.

rsync --temp-dir=/tmp

Я думаю, что происходит, имена временных файлов rsync начинаются с, .и davfs не позволяет этого. Поэтому я пошел дальше и сказал rsync игнорировать исходные файлы с именами, начинающимися с .. Поскольку я использую --delete, я также сказал, чтобы не пытаться удалить lost+foundкаталог в месте назначения davfs.

rsync --temp-dir=/tmp --exclude lost+found --exclude '.*'
Дзамо Нортон
источник
Я столкнулся с этой проблемой на Cygwin, и этот вопрос был хитом поисковой системы. Принятый ответ не работал для меня, так как я работал над удаленной синхронизацией файлов через Интернет, поэтому использование rsync было обязательным. Предложение --temp-dir в этом ответе было для меня решением.
nickcrabtree