Rsync разница между опциями --checksum и --ignore-times

96

Кто-нибудь может прояснить разницу между опциями --checksumи --ignore-timesопциями rsync?

Мое понимание таково:

--checksum
Если размер файла и время совпадают, он выполнит контрольную сумму на обоих концах, чтобы увидеть, действительно ли файлы идентичны.

--ignore-times
«Передача» каждого файла, независимо от того, одинаковое ли время файла на обоих концах. Поскольку он по-прежнему будет использовать алгоритм дельта-передачи, если файл фактически идентичен, ничего не передается.

В этом и заключается техническая разница, но, насколько я могу судить, это семантически одно и то же.

Итак, что мне интересно, это:

  • В чем практическая разница между двумя вариантами?
  • В каких случаях вы бы использовали один, а не другой?
  • Есть ли разница в производительности между ними?
Энди Мэдж
источник

Ответы:

100

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

--ignore-timesговорит rsyncотключить эвристику файлов-раз-и-размеров и, таким образом, безоговорочно передавать ВСЕ файлы из источника в место назначения. rsyncзатем приступит к чтению каждого файла на стороне источника, поскольку ему нужно будет либо использовать свой алгоритм дельта-передачи, либо просто отправить каждый файл целиком, в зависимости от того, --whole-fileбыла ли указана опция.

--checksumтакже изменяет эвристику файла-времени и размеров, но здесь он игнорирует времена и рассматривает только размеры. Файлы на исходной и целевой сторонах, которые различаются по размеру, передаются, поскольку они, очевидно, различаются. Файлы с одинаковым размером rsyncпроверяются контрольной суммой (с MD5 в версии 3.0.0+ или с MD4 в более ранних версиях), а также передаются файлы с разными суммами.

В тех случаях, когда исходная и целевая стороны в основном совпадают, --checksumбольшинство контрольных сумм файлов будет с обеих сторон. Это может занять много времени, но в результате минимальный объем данных будет передаваться по проводам, особенно если используется алгоритм дельта-передачи. Конечно, это только выигрыш, если у вас очень медленные сети и / или очень быстрый процессор.

--ignore-timesс другой стороны, отправит больше данных по сети, и это приведет к чтению всех исходных файлов, но, по крайней мере, это не налагает дополнительную нагрузку на вычисление многих криптографически стойких хеш-сумм на исходном и целевом ЦП. Я ожидаю, что эта опция будет работать лучше, чем --checksumкогда ваши сети работают быстро и / или ваш процессор относительно медленный.

Я думаю, что я буду использовать только --checksumили --ignore-timesесли бы я передавал файлы в место назначения, где подозревалось, что содержимое некоторых файлов было повреждено, но время изменения которых не изменилось. Я не могу придумать какой-либо другой веской причины использовать любую из этих опций, хотя, возможно, есть и другие варианты использования.

Стивен Понедельник
источник
12
Я нашел --checksumполезным наряду с --itemize-changesпроверкой резервных копий. Время от времени мои скрипты резервного копирования запускаются для полного сравнения таким образом после завершения текущих ежедневных / еженедельных обновлений. Я получаю письмо, помеченное как срочное, если --itemize-changesвыдает что-то неожиданное, поэтому я знаю, что есть потенциальная проблема, которую я должен изучить
Дэвид Спиллетт
10
--checksum полезен при работе в Git и переключении между ветками с измененными файлами, что постоянно меняет время обновления файлов, которые вы не собираетесь отправлять из определенной ветви.
FriendlyDev
6
--ignore-timesи особенно --checksumнеобходимы, если один из ваших «файлов» является контейнером файлов Truecrypt, поскольку по умолчанию временная метка файла не обновляется. См. Productforums.google.com/forum/#!topic/drive/gnmDp3UXEgs и ask-leo.com/why_wont_my_truecrypt_volume_backup.html
Маркус Юниус Брутус,
Примечание: я провел быстрый эксперимент, и ctime не сравнивается, только mtime. На Mac, по крайней мере. Это может быть полезно знать. Вот почему у меня так много проблем с файловыми системами Windows, которые сообщают одно и то же время (ctime) для atime, mtime и ctime.
Эдвард Фальк
Проверяет ли --checksumконтрольная сумма только исходные имена файлов на конечном компьютере или все файлы в конечном каталоге?
Грег
17

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

Паулюс
источник
4

Одна деталь: опция контрольной суммы проверяет весь файл на одном конце, а затем весь файл на другом конце. Если ваши файлы несколько большие, это убивает параллелизм.

Кроме того, если у вас есть огромные файлы, вы, скорее всего, столкнетесь с тайм-аутом --checksum, а не с -I.

Francois
источник
2

С info rsyncв отношении к --checksumопции - «Поскольку весь этот-файл контрольной суммы всех файлов на обеих сторонах соединения происходит в дополнение к автоматической проверки контрольных сумм , которые происходят во время передачи файла, эта опция может быть довольно медленным.»

LeoB
источник
1
Это предложение, по-видимому, отсутствует в моих справочных страницах ... значит, подразумевает ли это, что опция контрольной суммы будет использовать контрольные суммы, чтобы идентифицировать, являются ли файлы идентичными, и если они не будут переданы, таким образом, генерируя контрольные суммы снова, как часть передачи? Опция --ignore-times просто пропускает проверку и предполагает, что они изменились? Поэтому с точки зрения производительности - игнорировать время - это лучший способ достичь того же? Я все еще пытаюсь понять, почему есть 2 разных варианта (кроме того факта, что --checksum более прозрачен)
Энди Мэдж
Вы должны посмотреть на последнюю редакцию
Александр Левчук
2

Эта --ignore-timesопция, вероятно, приведет к тому, что все файлы будут закодированы дельтой, а алгоритм дельта-передачи (дельта-кодирование) будет по меньшей мере таким же медленным, как контрольная сумма.

Я не знаю, достаточно ли --ignore-timesумен rsync , чтобы избежать «автоматической проверки после передачи» в частом случае, когда дельта-передача не приводит к передаче.

Для --ignore-times:

  • В случае, если rsync не является умным (или не доверяет дельта-кодированию), тогда проверка (контрольное суммирование и кодирование) будет выполняться дважды.
  • Возможно также, что дельта-кодирование намного медленнее, чем 128-битная контрольная сумма MD4.

И то, --checksumи другое --ignore-timesбудет «довольно медленным», но --ignore-times, вероятно, будет даже медленнее (из-за 2 возможностей выше).

Хороший вопрос - пожалуйста, напишите, если вы обнаружите какие-либо различия в производительности на практике.

Александр Левчук
источник
Я понимаю, что вы имеете ввиду. Я проведу несколько тестов и отправлю ответ.
Энди Мэдж