![比较两个文件,同时覆盖第二个文件的大小](https://linux22.com/image/78993/%E6%AF%94%E8%BE%83%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%8C%E5%90%8C%E6%97%B6%E8%A6%86%E7%9B%96%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E5%A4%A7%E5%B0%8F.png)
我正在尝试使用以下命令验证我所做的备份:
dd if=/dev/sda of=/dev/sdc2
/dev/sda
我将(内部硬盘驱动器) 的内容备份到/dev/sdc2
(外部备份驱动器,通过 USB 连接),但是 (要备份到的/dev/sdc2
分区)比 /dev/sda 稍大。/dev/sda
我无法确定/dev/sdc2
的大小,/dev/sda
因为 的大小(以字节为单位)/dev/sda
不能被 4096(驱动器 上的扇区大小)整除/dev/sdc
。
我想知道 diff (Unix 命令)是否会让您假设 的大小/dev/sdc2
为 的大小/dev/sda
(仅比较前 x 个字节,(x 是 的大小/dev/sda
)/dev/sdc2
)
我想验证这一点的原因是,当我运行
dd
(然后diff /dev/sda /dev/sdc2
)时,我在系统日志中收到错误。
我运行 diff /dev/sda
/dev/sdc2
,它说设备不同,可能/dev/sdc2
是因为 大于/dev/sda
。
错误(每隔一段时间就会重复一次,数量不同)如下所示:
ata5.00: exception Emask 0x50 SAct 0x0 SErr 0x280900 action 0x6 frozen
ata5.00: irq_stat 0x08000000, interface fatal error
ata5: SError: { UnrecovData HostInt 10B8B BadCRC }
ata5.00: failed command: READ DMA
ata5.00: cmd c8/00:00:e0:57:f9/00:00:00:00:00/e9 tag 4 dma 131072 in
res 50/00:00:df:57:f9/00:00:09:00:00/e9 Emask 0x50 (ATA bus error)
ata5.00: status: { DRDY }
ata5: softreset failed (device not ready)
我执行此操作的计算机正在运行 Arch Linux 的 ISO 版本(安装程序),并且目前未连接到互联网(稍后会)。我应该尝试不同的 Linux 发行版吗?
答案1
也许cmp
在这种情况下就足够了:
SYNOPSIS
cmp [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]
DESCRIPTION
Compare two files byte by byte. (...)
-n, --bytes=LIMIT
compare at most LIMIT bytes
您需要将cmp -n
源设备的大小(以字节为单位)作为参数传递给 ,它blockdev --getsize64
可以计算:
cmp --bytes=$(blockdev --getsize64 /dev/sda) /dev/sda /dev/sdc2
但请注意,您粘贴的错误消息似乎表明实际的读取错误,因此您可能面临数据的实际问题,而不仅仅是与diff
操作方式相关的问题。
答案2
有点晚了,但vbindiff
可以在这里提供帮助。它提供了两个文件的分屏十六进制视图,突出显示任何差异。使用Enter
can Move to the next difference between the files
,在克隆分区的情况下,它应该位于较短源文件的末尾。因此,它会发现任何数据损坏,尽管它没有进度指示器,并且在触发比较后可能需要几个小时才能更新屏幕。