Чи rsync перевіряє файли, скопійовані між двома локальними дисками?


65

Я хочу зробити нову копію великої кількості файлів з одного локального диска на інший.

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

  1. Чи зробить rsync порівняння при копіюванні файлів між двома локальними дисками?

  2. Якщо це робить перевірку - це безпечна ставка? Або краще робити байт за порівнянням байтів?

Відповіді:


77

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

Після отримання даних про файл rsync записує дані у файл і довіряє, що якщо ядро ​​вказує на успішне записування, дані записуються без пошкодження на диск. rsync не читає дані та порівнюється з відомою контрольною сумою як додаткова перевірка.

Що стосується самої верифікації, для протоколу 30 і пізніше (вперше підтримується в 3.0.0) rsync використовує MD5 . Для старих протоколів використовується контрольна сума MD4 .

Хоча довго вважаються застарілими для безпечних криптографічних хешей, MD5 та MD4 залишаються достатніми для перевірки пошкодженості файлів.

Джерело: сторінка "man" та підсвічування вихідного коду rsync для підтвердження.


3
Я ненавиджу розривати міхур кожного, але rsync перевіряє лише перевірку суми, якщо додано прапор -c!

27
@clint Ні, відповідь правильна. З пояснення -cпрапора чоловічої сторінки : "Зауважте, що rsync завжди перевіряє, що кожен переданий файл був реконструйований правильно на приймальній стороні, перевіряючи контрольну суму цілого файлу, що генерується під час передачі файлу, але автоматично після передачі. перевірка не має нічого спільного з цим параметром перед передачею "Чи потрібно оновити цей файл?".
Майкл Мрозек

7
Ця відповідь не дає зрозуміти, чи дійсно він перевіряє файл після копіювання. Якщо контрольна сума обчислюється під час отримання файлу, це не контрольна сума після копіювання, і ви не можете бути впевнені, що файл записаний правильно. Тоді вам потрібно буде провести додаткове порівняння.
Андре Міллер

7
Неможливо голосувати, тому що мені не подобається, що ця відповідь детально написана і технічно правильна, і в той же час настільки поза темою, що вводить в оману читачів. Проблема полягає в тому, що відповідь детально описує те, що відбувається під час передачі, тоді як запитуючий конкретно заявляє, що дбає про локальні копії, а не про мережеві передачі. Я впевнений, що Кайл Джонс не хотів когось вводити в оману, але ця відповідь (ІМХО).
ndemou

4
Кайл, я не вірю, що ти відповів неправильно. Я вже зазначив, що це "детально добре написано та технічно правильно", але він вимагає від читача бути надмірно зосередженим та обережним. Навіщо покривати відсутність перевірки даних диска, які ставлять під сумнів на півдорозі вашої відповіді після 117 слів, які неодноразово описують інший нерелевантний процес перевірки? Все одно дякую за ваш час та інтерес до цієї дискусії. Я щиро ціную це.
ndemou

40

rsyncце НЕ робити перевірку після копіювання для локальних копій файлів. Ви можете переконатися, що це не вдалося rsyncскопіювати великий файл на повільний (тобто USB) диск, а потім скопіювати той самий файл cp, тобто:

time rsync bigfile /mnt/usb/bigfile

time cp bigfile /mnt/usb/bigfile

Обидві команди займають приблизно однакову кількість часу, тому, rsyncможливо, не можна робити контрольну суму - оскільки це передбачає повторне зчитування файлу призначення з повільного диска.

На manжаль, сторінка з цього приводу вводить в оману. Я також перевірив це: straceпісля того, як копія буде завершена, rsyncне видає read()дзвінка в цільовий файл, тому його неможливо перевірити . Ще один ви можете перевірити це чимось на кшталт iotop: ви бачите, rsyncщо читаєте і пишете одночасно (копіюючи з джерела до місця призначення), після чого він виходить. Якби це перевіряло цілісність, була б фаза лише для читання.


1
"Сторінка man, на жаль, з цього приводу вводить в оману. Я також це підтверджував за допомогою" strace ". Чи ви напружили віддалений, запущений процес rsync чи локальний? Є два ... один запуск у пункті призначення, навіть коли ви використовуєте ssh.
користувач129070

8
Не існує підтвердження після копіювання жодних копій, локальних чи віддалених. Ви rsync -cзнову запустите, якщо хочете змусити його перевірити.
psusi

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

17

rsyncпроводить порівняння контрольної суми перед копіюванням (у деяких випадках), щоб уникнути копіювання того, що вже є. Суть порівняльної контрольної суми не в тому, щоб перевірити, чи була копія успішною. Це завдання основної інфраструктури: драйверів файлової системи, драйверів дисків, мережевих драйверів тощо. Окремі додатки, такі як rsyncне потрібно морочитися цим безумством. Все, що rsyncпотрібно зробити (і робить!) - перевірити значення повернення системних викликів, щоб переконатися у відсутності помилок.


1
Це, здається, суперечить прийнятій відповіді ...
djule5

2
@ djule5 Яким чином? Звичайно, прийнята відповідь стосується того, як rsync перевіряє передані файли, але питання та моя відповідь стосуються локальних копій.
Жиль

3
Гаразд, у цьому контексті я погоджуюся, що це має більше сенсу. Отже, «суть порівняння контрольної суми - не підтвердження того, що копія була успішною» справедлива лише для локальних копій; і "контрольні суми завжди використовуються для даних, переданих між процесами rsync надсилання та отримання" , справедливо лише для переданих копій. Я вважаю прийняту відповідь оманливою стосовно питання і вважаю, що ваша відповідь повинна бути прийнятою (лише мої 2 копійки).
djule5

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

1
@Ken Я не розумію, що ти намагаєшся зробити. Я підозрюю, що ви щось неправильно прочитали. Мережеві драйвери грають лише за наявності мережевої копії. Сама Rsync проводить порівняння контрольної суми перед тим, як робити будь-яку копію, щоб вирішити, чи потрібно її копіювати. Rsync не проводить ніякого порівняння контрольної суми після копіювання (тому що це було б безглуздо: він знає, що це просто скопійовано).
Жиль

4

Швидкі та брудні відповіді, безпосередньо на запитання.

З: Чи rsyncпроведемо порівняння під час копіювання файлів між двома локальними дисками? A: Зробимо порівняння, щоб зрозуміти, що скопіювати.

Питання: Якщо вона робить перевірку - це безпечна ставка? Або краще робити байт за порівнянням байтів? Відповідь: настільки ж безпечна, як математика, що стоїть за контрольною сумою файлу MD5. Ви можете спробувати зробити простий експеримент, щоб навчитися та довіряти інструменту.

Довга відповідь: я думаю, ви хотіли rsyncзробити порівняння файлів (побіжно або за контрольною сумою) після копіювання файлів. Якщо ви одна з небагатьох, яка цінує цілісність даних, вам може здатися нижче корисне:

rsync -avh [source] [destination] && rsync -avhc [source] [destination] 

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


1

Використання rsync для перевірки цілісності дубліката

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

Якщо також не перезапустити Linux, вам слід принаймні скинути кеші ( * ) за допомогою:

sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

Потім перечитайте обидва дерева та порівняйте їх контрольні суми:

rsync --dry-run --checksum --itemize-changes --archive SRC DEST

Сучасна контрольна сума rsync використовує MD5, що становить 128 біт. Ймовірність цього не виявити помилку в окремому файлі є астрономічно низькою (деяке обговорення тут ), але не неможливою.



Удачі в правильному підведенні косої риски.
nobar

Жодна новина не є хорошою новиною.
nobar

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