如何检查 ISO 是否正确写入我的 U 盘?

Vil*_*age 14 filesystems usb checksum

我按照Debian Wiki 上的这些 DebianEeePC HowTo InstallUsingStandardInstaller说明,将 Debian ISO 写入我的 USB。

dd if=debian-*-netinst.iso of=/dev/sdX
Run Code Online (Sandbox Code Playgroud)

使用sha1sum,我可以检查我下载的 ISO 文件的校验和。如何检查 U 盘设备的校验和,以确保 U 盘没有任何问题并且 ISO 已被完美复制?

max*_*zig 21

您可以cmp用于检查是否所有内容都被正确复制:

$ cmp -n `stat -c '%s' debian-X-netinst.iso` debian-X-netinst.iso /dev/sdX
Run Code Online (Sandbox Code Playgroud)

此解决方案不会显式计算您的校验和/dev/sdX- 但您不需要这样做,因为您已经为比较源(即debian-X-netinst.iso)执行了此操作。

仅执行 add if=/dev/sdX | sha1sum可能会产生不匹配的校验和,因为您得到尾随块(/dev/sdX很可能比 iso 文件大)。

通过cmp -n您确保没有/dev/sdX比较您的尾随字节。

如果您对所调用的 USB 大容量存储设备的质量感到偏执sync,请将其弹出,重新插入,然后进行比较 - 否则所有或某些块可能仅来自内核 VM(缓存) - 而实际上可能是位在硬件上搞砸了。

  • @16851556 `-n` 开关是必要的,因为您的 USB 记忆棒设备可能比写入的 ISO 映像更大。因此,如果没有它,“cmp”总是会报告失败的比较,因为它从“/dev/sdX”中读取一些 ISO 文件中不存在的尾随字节。 (3认同)

Jul*_*ard 5

仅使用ddmd5sum/sha1sum就足够了,但如前所述,请注意,您的设备与文件的大小不同,因此总和会有所不同。

在这里你仍然可以做到

首先,您需要知道文件的大小:

$ stat -c '%s' debian-live-8.2.0-amd64-lxde-desktop.iso
1003487232
Run Code Online (Sandbox Code Playgroud)

然后,为了让你的系统调用很酷,你最好把它作为一个很好的 2 次幂4096的倍数,比如,两者的乘法必须产生文件的大小,在其他方面,你会检查太少或字节太多,产生错误的校验和。

$ bc
bc 1.06.95
scale = 9
1003487232 / 4096
244992.000000000
Run Code Online (Sandbox Code Playgroud)

我很高兴,4096 × 244992 = 1003487232所以 4096 对我有好处(并且可能对你有用)所以我可以使用4096(典型)的块大小和244992.

不要忘记将文件写入USB密钥...

$ dd if=debian-live-8.2.0-amd64-lxde-desktop.iso of=/dev/sd? && sync
Run Code Online (Sandbox Code Playgroud)

并且知道,使用已知的块大小和块数,您可以从密钥中读取确切的字节数并检查它们:

$ dd if=/dev/sdb bs=4096 count=244992 | sha1sum
b0dbe4ca8f526d1e43555459c538607d4a987184
Run Code Online (Sandbox Code Playgroud)

(是的,md5sumsha1sum这快得多,但这显然不是您的瓶颈,瓶颈是 USB 吞吐量,感谢您的注意)。

或者,简而言之:

dd if=/dev/sdb bs=4096 count=$(($(stat -c '%s' the.iso) / 4096)) | sha1sum
Run Code Online (Sandbox Code Playgroud)


小智 5

朱利安的回答可以完成这项工作,但有一种更简单、更快捷的方法来做到这一点:

sudo head -c <image size> /dev/sdX | sha1sum
Run Code Online (Sandbox Code Playgroud)

  • 因此,在一行中: `head -c $(stat -c '%s' the.iso) /dev/sdc | sha1sum` (4认同)