如何使用 dd 重新读取图像,使其与您刚刚写入的图像相匹配?

如何使用 dd 重新读取图像,使其与您刚刚写入的图像相匹配?

我有一个约 1GB 的图像,我正在通过该工具将其写入 8GB SD 卡dd。我想通过读回它并将其哈希值与原始哈希值进行比较来验证它的编写是否没有损坏。

dd显然,当我通过结果图像的大小读回它时,它与我的 SD 卡的大小相匹配,因此检查哈希值是没有用的。

我相信我应该以某种方式解释输出写作调用来配置skip/count参数以正确读取它。

我用来写入图像的命令:

> sudo dd if=my.img of=/dev/sdc bs=1M 
8+50581 records in
8+50581 records out
3947888640 bytes (3.9 GB) copied, 108.701 s, 36.3 MB/s

我用来读取图像的命令:

> sudo dd if=/dev/sdc of=same_as_my.img
15523840+0 records in
15523840+0 records out
7948206080 bytes (7.9 GB) copied, 285.175 s, 27.9 MB/s

答案1

确定图像的大小,例如使用\ls -l my.img(不是ls -lh,这将为您提供近似大小;\ls防止出现像 之类的别名ls='ls -h')或使用stat -c %s my.img

如果您只想将副本与原始文件检查一次,则只需比较文件即可。使用哈希对于一次性比较来说是没有用的,它只会使事情变得更慢并且需要更多命令。命令cmp比较二进制文件。您需要将图像文件和SD卡的相应部分传递给它。使用head提取SD卡的开头部分。

</dev/sdc head -c "$(stat -c %s my.img)" | cmp - my.img

如果您想要执行多次比较,则哈希很有用,因为您只需读取每个实例一次即可计算其哈希。任何哈希都可以,因为您担心数据损坏。如果出于安全原因您需要检查文件是否未被修改,那么cksummd5sum不适合,您应该使用sha256sumsha512sum来代替。

md5sum <my.img >my.img.md5sum
</dev/sdc head -c "$(stat -c %s my.img)" | md5sum >sd-copy.md5sum
cmp my.img.md5sum sd-copy.md5sum

注意第一个命令中的输入重定向;这可确保校验和文件不包含文件名,因此您可以比较校验和文件。如果您有校验和文件和要验证的副本,您可以直接使用

</dev/sdc head -c "$(stat -c %s my.img)" | md5sum -c my.img.md5sum

哦,还有不要使用dd,它很慢(或者最多不会更快)并且不检测复制错误。

答案2

我们所做的是md5um实际的分区。它并不完全允许您使用磁盘对映像进行校验和,但如果您有几个磁盘(就像我们一样),您就可以建立“正确的”校验和。

例如,在我们的例子中,分区如下所示:

$ sudo fdisk -l /dev/sdc
Disk /dev/sdc: 7948 MB, 7948206080 bytes
245 heads, 62 sectors/track, 1021 cylinders, total 15523840 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/sdc2          122880     7710719     3793920   83  Linux

然后我们可以简单地在分区上生成一个哈希值:

$ sudo md5sum /dev/sdc2

然而,这假设如下:

  • 您有多个可以测试的 SD 卡
  • 您在运行哈希之前没有安装 SD 卡

另外,请注意,您无法对整个磁盘(即上例中的“/dev/sdc”)进行校验和,因为这将根据 SD 卡属性给出不同的哈希值。

答案3

md5sum将图像文件的值与 SD 卡的值进行比较,这将是一个很好的解决方案。

答案4

sudo sh -c '
     dd bs=64k if="$1" of="$2"
     ! cmp -- "$1" "$2" 2>&1 |
       grep -qvF "EOF on $1"
' -- my.img /dev/sdc

cmp将逐字节比较两个文件并根据它们是否相同返回。如果一个比另一个短,但两个文件的较短文件的整个长度相同,则将cmp返回 1 并报告EOF on <shorter file>...到标准错误。如果两个文件相同,cmp则返回 0 且不报告任何内容,但如果它们不同,cmp则返回 1 并报告不同的字节。因此,对于cmp任何在 stdout 或 stderr 上产生不匹配的输出行的运行,上述语句将返回 1EOF on $1否则为 0。

相关内容