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

306
f1nn

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

  • локальный каталог: / Users / user / files /
  • «удаленный» смонтированный сервер: / Volumes / 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 передач, так как файл не был изменен. Это ожидаемое поведение.

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

Благодарю.

2

1 ответ на вопрос

2
StandardEyre

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

Со страницы руководства rsync :

 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. Это требует больше дискового ввода-вывода и циклов для генерации контрольных сумм, поэтому это может быть медленнее. Было бы интересно узнать, решит ли это проблему.


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