2

Я тестирую 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 передач, так как файл не был изменен. Это ожидаемое поведение.

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

Благодарю.

1 ответ1

2

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


Всё ещё ищете ответ? Посмотрите другие вопросы с метками .