Сравнение сырых блочных устройств

12

Есть ли утилита (или какая-то магия оболочки), которая позволяет мне сравнивать два блочных устройства?

Подробности: у меня есть одно большое (0,5 ТБ) RAID-устройство, которое я скопировал на немного большее SATA-устройство с использованием dd. На устройстве имеется несколько разделов, однако я копирую с «родительского» устройства, а не с разделенных узлов устройства (например, я копирую / dev / hda, а не / dev / hda1, например).

Я хотел бы убедиться, что резервная копия хорошая / правильная.

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

alanxz
источник

Ответы:

13

Я бы использовал команду

cmp /dev/hda /dev/hdb

он остановится на первом отличающемся байте, записав его смещение, или на EOF на более коротком.

enzotib
источник
Я не вижу в справочной странице ничего о том, как остановиться в EOF, это где-то задокументировано?
Кевин
Фактически, состояние выхода говорит: «1: файлы разные; это включает случай, когда один файл идентичен первой части другого». Кажется, это подразумевает, что он не сообщает об их идентичности, если кто-то короче.
Кевин
@Kevin: from info cmp: «Команда 'cmp' сравнивает два файла и, если они различаются, сообщает первый байт и номер строки, где они различаются."
энзотиб
1
Вы можете использовать эту --bytes=LIMITопцию, устанавливая LIMITзначение в байтах меньшего устройства, чтобы останавливаться на конце меньшего диска (или границы раздела), не cmpвыходя с ненулевым состоянием.
rozcietrzewiacz
если у меня есть копия / dev / loop0 из / dev / sda и я делаю изменения в / dev / loop0, как я могу добавить новые изменения в / dev / sda ?? Спасибо
Milor123
2

В зависимости от того, насколько заполнены накопители, может быть быстрее всего смонтировать файловые системы и сделать

diff -qr /mnt/root1 /mnt/root2

В противном случае я бы сказал что-то вроде этого:

diff -q <(dd bs=1M count=500K if=/dev/sda) <(dd bs=1M count=500K if=/dev/sdb)

Очевидно, выясните, насколько большой вам нужно сделать bsи countостановиться (или просто раньше, если это намного удобнее) в конце меньшего диска.

Или, благодаря комментарию enzotib, похоже, что вы можете использовать cmp, но вам понадобится -nфлаг, чтобы ограничить количество байтов до более короткого из двух дисков.

cmp /dev/sda /dev/sdb -n 500GB
Kevin
источник
К сожалению, я не могу смонтировать устройство как том NTFS, и у меня есть LiveCD без нужных драйверов. Для второй команды используемые вами оболочки не пытаются засосать все устройство в память перед загрузкой его в diff?
alanxz
1
@alanxz Нет, diffподоболочки не будут читать все устройство перед записью. ddзаписывает bsбайты сразу после чтения (или обработки, если указано, а не здесь), и они записывают в fifos, которые блокируются, пока не будут прочитаны.
Кевин
Я думал больше на уровне оболочки (или что-то еще, реализующее FIFO). Но это отвечает на мой вопрос!
alanxz
2

Вы ищете программное обеспечение для двоичных различий

rdiff
предназначен для резервного копирования и передачи по сети, посмотрите на rdiff-backup и duplicity для обеспечения резервного копирования

xdelta3
- это бинарный diff с открытым исходным кодом, инструменты дифференциального сжатия, дельта-сжатие VCDIFF (RFC 3284).

bsdiff
тоже !! Память голодна, не подходит для блочных устройств.

gustavodiazjaimes
источник
1

Существует утилита bsdiff , которая делает именно такие вещи. Он делает это очень быстро и способен генерировать бинарный патч, если вам нужно.

Смотрите этот пост для некоторых объяснений вокруг него.

Корен
источник
bsdiffРабота сложнее, чем просто сравнить два файла, поэтому я сомневаюсь, что это может быть быстрее, чем простой cmp.
энзотиб
Ссылка не работает.
Оуэн Полинг
1

Вы можете сравнить два блочных устройства разных размеров, используя md5sumэто:

(при условии, что устройство меньше /dev/sda)

# md5sum /dev/sda && head -c $(blockdev --getsize64 /dev/sda) /dev/sdb | md5sum
EmmaV
источник
0

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

Если вам нужна полная контрольная сумма, вы можете использовать петлевые устройства со смещениями для просмотра внутренних «разделов» резервной копии и md5sum каждый по отдельности, но принудительное выполнение fsckможет дать вам базовую идею гораздо быстрее, чем байтовое сравнение байтов или вычисления контрольной суммы.

Эван Ланглуа
источник