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

Ken*_*tzo 5 dd files file-comparison

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

显然,当我通过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
Run Code Online (Sandbox Code Playgroud)

我用来读取图像的命令:

> 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
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 5

确定图像的大小,例如使用\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
Run Code Online (Sandbox Code Playgroud)

如果你想进行多次比较,那么散列是很有用的,因为你只需要读取每个实例一次,来计算它的散列。任何散列都可以,因为您担心数据损坏。如果您出于安全原因需要检查文件是否未被修改,那么cksum并且md5sum不适合,您应该使用sha256sumorsha512sum代替。

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
Run Code Online (Sandbox Code Playgroud)

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

</dev/sdc head -c "$(stat -c %s my.img)" | md5sum -c my.img.md5sum
Run Code Online (Sandbox Code Playgroud)

哦,不要使用dd,它很慢(或者充其量不是更快)并且不会检测到复制错误。