Вопрос: rsync всегда загружает все файлы из macOS => Linux


Я тестирую rsync с сервером WebDAV в контейнере Docker:

  • локальный каталог: / Пользователи / пользователь / файлы /
  • «удаленный» сервер: / Объемы / webdav /

Вот начальное состояние:

# remote
➜  cat /Volumes/webdav/remotefile
change
➜  ls -la  /Volumes/webdav/remotefile
-rwx------  1 user  staff  7 Dec  2 01:39 /Volumes/webdav/remotefile

# local
➜  cat /Users/user/files/remotefile
change
➜  ls -la  /Users/user/files/remotefile
-rwx------  1 user  staff  7 Dec  2 01:39 /Users/user/files/remotefile

Теперь давайте сменим локальный файл и загрузим его на «удаленный» сервер:

➜  files echo 'add#0' > ./remotefile
➜  files cat remotefile
add#0
➜  files \rsync -varP /Users/user/files/* /Volumes/webdav/ --delete
building file list ...
1 file to consider
remotefile
           6 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1)

sent 132 bytes  received 42 bytes  348.00 bytes/sec
total size is 6  speedup is 0.03

Файл загружается успешно, так как он был изменен. Но если я снова запустил rsync local => remote, он повторно загрузит его:

➜  files \rsync -varP /Users/user/files/* /Volumes/webdav/ --delete
building file list ...
1 file to consider
remotefile
           6 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1)

sent 132 bytes  received 42 bytes  348.00 bytes/sec
total size is 6  speedup is 0.03

Теперь я тестирую противоположное направление:

➜  files \rsync -varP /Volumes/webdav/* /Users/user/files/ --delete
building file list ...
1 file to consider
remotefile
           6 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1)

sent 132 bytes  received 42 bytes  348.00 bytes/sec
total size is 6  speedup is 0.03

Загрузка файлов выполняется успешно. И еще один раз ...

➜  files \rsync -varP /Volumes/webdav/* /Users/user/files/ --delete
building file list ...
1 file to consider

sent 80 bytes  received 20 bytes  200.00 bytes/sec
total size is 6  speedup is 0.06

... показывает 0 передач, так как файл не был изменен. Это ожидаемое поведение.

Почему он не работает с local => удаленной загрузкой и всегда перезагружает файл?

Благодарю.


2
2017-12-01 22:58


Источник




Ответы:


Подтвердили ли вы, что часы синхронизированы на обоих local а также remote?

Из rsync man page:

 Rsync finds files that need to be transferred using a lqquick checkrq algorithm 
 (by default) that looks for files that have changed in size 
 or in last-modified time.

Если часы находятся и вы не можете отредактировать его, попробуйте сказать rsync, чтобы он был немного «более сумасшедшим», как он проверяет время. Снова с Rsync

 --modify-window
    When comparing two timestamps, rsync treats the timestamps 
    as being equal if they differ by no more than the modify-window value. 
    This is normally 0 (for an exact match), but you may find it useful 
    to set this to a larger value in some situations. 
    In particular, when transferring to or from an MS Windows FAT filesystem 
    (which represents times with a 2-second resolution), 
    --modify-window=1 is useful (allowing times to differ by up to 1 second).

Попробуйте запустить rsync с помощью --size-only вариант и видя, является ли поведение rsync изменения.

Другой альтернативой является использование --checksum опция rsync. Для этого требуется большее количество операций ввода-вывода и циклов для генерации контрольных сумм, поэтому это может быть медленнее. Было бы интересно узнать, переносит ли это проблему.



2
2017-12-01 23:11



Блестящая догадка! date && docker exec 1c3f5cb52a55 date => Fri Dec 2 02:18:09 MSK 2016 Thu Dec 1 23:18:09 UTC 2016 - f1nn
--size-only работает, как ожидалось, но если изменился только символ файла в файле, очевидно, что файл не был изменен. - f1nn
К сожалению, я не могу контролировать время удаленного сервера, так как это сторонний сервер webdav. размер-только ненадежен. Есть ли обходные пути? Например, как Dropbox решает подобные проблемы? Полагаю, они должны использовать аналогичный алгоритм. - f1nn
Московское стандартное время (MSK) - UTC +3, что заставляет меня думать о часах находятся в синхронизации. Может быть, здесь есть что-то другое. - StandardEyre
Ах, у меня есть ты. Rsync уважает сдвиги TZ, поэтому время технически одинаково. Прямо сейчас я играю с --checksum вариант, и, похоже, он работает с первого взгляда. Но не уверен, как он будет работать с удаленным сервером 50 ГБ с миллионами файлов. Спасибо, что указал направление. - f1nn