原始块设备的比较


12

有没有可以让我比较两个块设备的实用程序(或某种外壳魔术)?

详细信息:我有一个大型(0.5 TB)RAID设备,已使用dd备份到稍大的SATA设备。该设备上有几个分区,但是我从“父”设备复制而不是从分区的设备节点复制(例如,我复制/ dev / hda而不是/ dev / hda1)。

我想验证备份是否正确/正确。

我曾考虑过在每个设备上运行md5sum,但是由于第二个设备略大于第一个设备,因此这不会给我准确的结果,因此多余的字节会更改哈希值。

Answers:


13

我会使用命令

cmp /dev/hda /dev/hdb

它会停在第一个不同的字节上,写出它的偏移量,或者停在较短的字节上的EOF位置。


我在联机帮助页中没有看到有关停止在EOF的任何信息,该文件是否记录在某处?
凯文(Kevin)

实际上,退出状态显示:“ 1:文件不同;这包括其中一个文件与另一个文件的第一部分相同的情况。” 这似乎暗示着,如果一个更短,它不会报告它们相同。
凯文(Kevin)

@Kevin:from info cmp:“'cmp'命令比较两个文件,如果它们不同,则告诉它们第一个字节和行号不同。”
enzotib 2012年

1
您可以使用该--bytes=LIMIT选项,将LIMIT值设置为较小设备的字节大小,以在较小驱动器(或分区边界)的末尾停止,而不会cmp退出非零状态。
rozcietrzewiacz 2012年

如果我有/ dev / sda的/ dev / loop0副本,并且对/ dev / loop0进行了更改,如何将新更改添加到/ dev / sda中?谢谢
Milor123 '16

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

不幸的是,我无法将设备安装为NTFS卷,并且我的LiveCD上没有正确的驱动程序。对于第二个命令,您使用的子外壳程序在将其输入到diff前不要尝试将整个设备吸入内存吗?
alanxz 2012年

1
@alanxz不,diff子外壳将不会在写入之前读取整个设备。读取字节后立即dd写入bs字节(或进行处理(如果指定的话,此处不进行处理)),然后写入fifos,直到被读取为止一直阻塞。
凯文(Kevin)

我在外壳程序级别(或任何实现FIFO的级别)上进行了更多思考。但这回答了我的问题!
alanxz 2012年

2

您正在寻找二进制diff软件

rdiff
是为备份和网络传输而设计的,请看rdiff-backup和重复性以了解备份的用途

xdelta3
是一种开源二进制差异差分压缩工具VCDIFF(RFC 3284)增量压缩。

bsdiff
也是!内存不足,不适合块设备。


1

有一个名为bsdiff的实用程序,可以完成这种事情。它确实非常快,并且可以根据需要生成二进制补丁。

有关说明,请参见此帖子


bsdiff比简单地比较两个文件要复杂得多,所以我怀疑它会比简单的文件更快cmp
enzotib 2012年

链接断开。
Owen Pauling

1

您可以使用以下方法比较两个不同大小的块设备md5sum

(假设较小的设备是/dev/sda

# md5sum /dev/sda && head -c $(blockdev --getsize64 /dev/sda) /dev/sdb | md5sum

0

考虑fsck在备份上运行。您可能需要花一些技巧losetup才能在备份中嵌入的分区上设置回送设备,但是如果文件检查说文件结构一致,则数据本身可能很好。

如果您需要完整的校验和,则可以使用带偏移量的环回设备分别查看备份和md5sum的内部“分区”,但是fsck对于字节比较或校验和计算,强制执行可能比字节快得多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.