我有一个 .RAW 映像。该映像包含一个分区。
我创建了一个基于环回的设备。我在该设备上创建了一个单独的分区。
我正在将 .RAW 写入分区。
sudo dd if=/tmp/image.raw of=/dev/loop25p1 status=progress
然后我读取分区
sudo dd of=/tmp/image.dd.raw if=/dev/loop25p1 status=progress
然后我获取sha1sum
原始文件并重新创建。
sha1sum /tmp/image.dd.raw
0d31163796cda45e016f5f1459426adb4a872b57 /tmp/image.dd.raw
sha1sum /tmp/image.raw
d961e97b63472cd3f317f8823de68508e583f713 /tmp/image.raw
这些为什么不同?
答案1
假设:/tmp/image.raw
小于/dev/loop25p1
。
/dev/loop25p1
是具有特定大小的块设备。在向其写入任何内容之前,其大小就已经确定。将较小的文件复制到块设备不会也不会截断它。
我的猜测是/tmp/image.raw
小于/dev/loop25p1
。将前者复制到后者后,后者包含前者的数据以及超出前者大小的任何数据。换句话说,您的第一个dd
没有覆盖整个,/dev/loop25p1
因为它在到达输出末尾之前到达了输入末尾。
当你复制/dev/loop25p1
到时/tmp/image.dd.raw
,你会获得块设备中的所有数据,包括第一个设备dd
从未获得的部分。图像是就因为这个“尾巴”而有所不同/tmp/image.dd.raw
。
如果你
cmp /tmp/image.raw /tmp/image.dd.raw
你会得到
cmp: EOF on /tmp/image.raw after byte …
这意味着直到文件末尾/tmp/image.raw
都是相同的,但另一个文件包含更多字节。