Проверяет ли rsync файлы, скопированные между двумя локальными дисками?

65

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

Я читал, что rsync сравнивает контрольные суммы файлов при отправке их на удаленный компьютер по сети.

  1. Будет ли rsync сравнивать файлы на двух локальных дисках?

  2. Если это делает проверку - это безопасная ставка? Или лучше сделать байтовое сравнение?

Фрез
источник

Ответы:

77

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

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

Что касается самой проверки, для протокола 30 и выше (впервые поддерживается в 3.0.0), rsync использует MD5 . Для старых протоколов используется контрольная сумма MD4 .

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

Источник: справочная страница и просмотр исходного кода rsync для проверки.

Кайл Джонс
источник
3
Я ненавижу раздувать пузыри у всех, но rsync проверяет только проверку суммы, если добавлен флаг -c!
27
@ clint Нет, ответ правильный. Из пояснения man-страницы к -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
«К сожалению, справочная страница вводит в заблуждение по этому поводу. Я также проверил это с помощью strace». Вы связали удаленный работающий процесс rsync или локальный? Есть два ... один работает в пункте назначения, даже когда вы используете ssh.
user129070
8
Для любых копий, локальных или удаленных, нет проверки после копирования. Вы запускаете rsync -cснова, если хотите заставить его проверить.
Псуси
Проверка выполняется на входящем потоке по мере его поступления. Нет необходимости читать его обратно с диска, если файловая система подтвердила, что она была записана.
Стоп Harm Моника
17

rsyncделает сравнение контрольной суммы перед копированием (в некоторых случаях), чтобы избежать копирования того, что уже есть. Смысл сравнения контрольной суммы не в том, чтобы убедиться, что копия была успешной. Это работа базовой инфраструктуры: драйверы файловой системы, драйверы дисков, сетевые драйверы и т. Д. Отдельные приложения, например rsync, не должны беспокоиться об этом безумии. Все, что rsyncнужно сделать (и делает!), Это проверить возвращаемые значения системных вызовов, чтобы убедиться в отсутствии ошибок.

Жиль "ТАК - перестань быть злым"
источник
1
Это, кажется, противоречит принятому ответу ...
djule5
2
@ djule5 Каким образом? Похоже, принятый ответ в основном касается того, как rsync проверяет переданные файлы, но вопрос и мой ответ касаются локальных копий.
Жиль "ТАК - перестань быть злым"
3
Хорошо, хорошо в этом контексте я согласен, что это имеет больше смысла. Так что «Смысл сравнения контрольной суммы не в том, чтобы убедиться, что копия была успешной» , верно только для локальных копий; и «контрольные суммы всегда используются для данных, передаваемых между отправляющим и получающим процессами rsync» , верно только для переданных копий. Я нахожу принятый ответ вводящим в заблуждение относительно вопроса и полагаю, что ваш ответ должен быть принятым (только мои 2 цента).
djule5
Я все еще чувствую, что этот ответ немного вводит в заблуждение. Например, в нем говорится, что сетевые драйверы, в частности, проверяют, была ли копия успешной, но если вы говорите, что сравнение контрольной суммы не проверяет, была ли копия успешной только для локальных источников, сетевые драйверы не будут задействованы.
Кен
1
@ Кен, я не понимаю, что ты пытаешься сделать. Я подозреваю, что вы что-то неправильно поняли. Сетевые драйверы вступают в игру только при наличии сетевой копии. Rsync сам выполняет сравнение контрольной суммы перед выполнением любой копии, чтобы решить, следует ли копировать. Rsync не выполняет никакого сравнения контрольной суммы после копирования (потому что это было бы бессмысленно: он знает, что он только что скопировал).
Жиль "ТАК ... перестать быть злым"
4

Быстрые и грязные ответы, прямо на вопросы.

Q: Будет ли rsyncсравнение при копировании файлов между двумя локальными дисками? A: Это сделает сравнение, чтобы выяснить, что копировать.

Q: Если это делает проверку - это безопасная ставка? Или лучше сделать байтовое сравнение? 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
источник
Удачи в получении правильных косых черт.
Нобар
Отсутствие новостей - хорошая новость.
Нобар
Не беспокойтесь, --checksumпока тест не пройдет без него.
Нобар