Різниця Rsync між параметрами --checksum та --ignore-time


95

Чи може хтось уточнити відмінності між --checksumі --ignore-timesпараметрами rsync?

Моє розуміння таке:

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

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

Це технічна різниця, але наскільки я можу сказати, вони семантично одне і те ж.

Отже, мені цікаво:

  • У чому полягає практична відмінність двох варіантів?
  • У яких випадках ви б використовували один, а не інший?
  • Чи є різниця між продуктивністю між ними?

Відповіді:


99

Зазвичай 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контрольна сума лише джерела файлів на машині призначення або всі файли в каталозі призначення?
Грег

16

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


4

Одна деталь: опція контрольної суми перевіряє цілий файл на одному кінці, потім весь файл на іншому. Якщо ваші файли дещо великі, цей вид вбиває паралелізм.

Крім того, якщо у вас є величезні файли, ви, швидше за все, зіткнетесь із тайм-аутом --checksum, як і у вас -I.


2

З info rsyncвідносно до --checksumопції - «Оскільки весь цей файл контрольної суми всіх файлів на обох сторонах з'єднання відбувається на додаток до автоматичної перевірки контрольних сум , які відбуваються під час передачі файлу, ця опція може бути досить повільним.»


1
Це речення, схоже, не міститься на моїх сторінках людини ... так, чи означає це, що параметр контрольної суми використовує контрольні суми для визначення того, чи файли однакові, і якщо вони не є, вони перенесуть, тим самим генеруючи контрольні суми знову як частина передачі? Опція --ignore-time просто пропускає чек і припускає, що вони змінилися? Тому ефективність - кращі часи - це кращий спосіб досягти того самого? Я все ще намагаюся зрозуміти, чому існують 2 різні варіанти (крім того, що --checksum є більш прозорим)
Енді Медж

Подивіться останню редакцію
Олександр Левчук

2

Цей --ignore-timesпараметр, ймовірно, призведе до того, що всі файли кодуються дельтою, а алгоритм передачі дельта (кодування дельти) принаймні такий же повільний, як контрольна сума.

Я не знаю, чи rsync --ignore-timesдосить розумний, щоб уникнути "автоматичної перевірки після передачі" у тому частому випадку, коли передача дельта не призведе до того, що нічого не буде передано.

Для --ignore-times:

  • Якщо rsync не є розумним (або не довіряє кодуванню дельти), то перевірка (контрольна сума та кодування) буде здійснена двічі.
  • Також може статися так, що кодування дельти відбувається набагато повільніше, ніж 128-бітна контрольна сума MD4.

І те, --checksumі --ignore-timesінше буде "досить повільним", але --ignore-times, ймовірно, ще повільніше (через 2 можливості вище).

Хороше запитання. Будь ласка, опублікуйте, якщо ви знайдете якісь відмінності в ефективності на практиці.


Я бачу, що ти маєш на увазі. Я проведу кілька тестів і відправлю назад.
Енді Медж
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.