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

Я установил облачное хранилище 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) с помощью mount 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) 

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

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

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

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

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

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

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

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. Это то, что один из разработчиков (Werner Baumann) из 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> 

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

 rsync --temp-dir=/tmp 

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

 rsync --temp-dir=/tmp --exclude lost+found --exclude '.*'