Как я могу скопировать и проверить файл, как я делаю копию?

(Еще один вопрос “скопируйте и проверьте” …)

У меня есть достаточное количество данных, которые я хочу скопировать между несколькими жесткими дисками, и я хочу быть абсолютно уверенным, что данные копируются правильно.

Мой текущий подход к копированию был довольно стандартным, копирование и проверка (с sha256). Мне не нравятся дополнительные этапы и время, затрачиваемое на контрольную сумму – достаточно 30-60 минут для прерывания streamа, поэтому мне приходится работать усерднее, чтобы не пропустить ни одного шага и все проверить правильно.

Поэтому я специально ищу пошаговый процесс копирования и проверки.

Однако я не хочу перечитывать скопированный файл из дискового кэша , так как это сведет на нет точку проверки !!

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

В Linux я также знаю, что могу уничтожить кэш диска с помощью echo 3 > /proc/sys/vm/drop_caches . Но выполнение этого каждые несколько килобайт или даже мегабайт абсолютно наверняка снизит производительность ввода-вывода. Этот специфический метод также обычно не переносим, ​​поэтому я не хочу его хранить в качестве решения этой проблемы.

Я знаю fsync(file); fdatasync(file); fsync(dir); fdatasync(dir) fsync(file); fdatasync(file); fsync(dir); fdatasync(dir) fsync(file); fdatasync(file); fsync(dir); fdatasync(dir) , вероятно, является хорошей отправной точкой (здесь хорошо подходит overkill), но я боюсь, что это убьет пропускную способность последовательной streamовой передачи?

Моя текущая идея состоит в том, чтобы сделать копию для чтения / записи, в то время как у меня также есть целевой файл, открытый на 256 МБ ниже, чем до чтения / записи, так что он находится далеко за пределами диапазона встроенного controllerа и кэш-памяти жесткого диска, а затем последовательно считывает и проверьте из этого местоположения $ copypoint-256MB.

Могу ли я сделать несколько модных O_SYNC | O_DIRECT с O_SYNC | O_DIRECT O_SYNC | O_DIRECT и получить как приемлемую скорость, так и хорошие гарантии того, что мое O_SYNC | O_DIRECT чтение получает данные с дисков?

Или … действительно ли запись-затем-проверка – лучший способ справиться с очень неоптимальным состоянием-кво, то есть “современными” операционными системами, controllerами жестких дисков и хорошим безопасным дизайном ввода / вывода файлов? : /

One Solution collect form web for “Как я могу скопировать и проверить файл, как я делаю копию?”

Вы можете cat исходный файл и направить его к tee чтобы сохранить его в месте назначения, и одновременно sha256sum вывод в sha256sum . Таким образом, вам не нужно перечитывать источник, чтобы вычислить его хеш. Если вы хотите убедиться, что место назначения перезаписывается с диска, а не из кэша, вы можете использовать dd с iflag=direct .

Linux и Unix - лучшая ОС в мире.