刻录的 CD-R 与输入的 iso 映像不相同,为什么?

Gru*_*bel 5 dd

我有一个问题,有时当我将 ISO 映像刻录到 CD-R 时:

sudo wodim -v driveropts=burnfree -data dev=/dev/scd0 input.iso
Run Code Online (Sandbox Code Playgroud)

然后再读一遍:

sudo dd if=/dev/cdrom of=output.iso
dd: reading `/dev/cdrom': Input/output error
...
Run Code Online (Sandbox Code Playgroud)

我最终得到了两个不相同的 iso 映像,即最后output.iso缺少 2048 个字节。然而,当我挂载 iso 映像或 CD-R 并比较挂载点上的实际文件时,两者是相同的。

这是预期的行为还是实际上不正确的数据刻录?如果符合预期,我如何验证刻录过程是否成功?

我首先问的原因是它似乎是可重现的行为,即使在重复刻录时,某些 ISO 映像也会短 2048 字节,但所有刻录的 CD-R 本身都是相同的。

还有背后的原因是什么:

dd: reading `/dev/cdrom': Input/output error
Run Code Online (Sandbox Code Playgroud)

像往常一样,我认为这是正常的,但背后的技术原因是什么?我认为 CD 不允许设备直接检测大小,因此dd读取直到遇到困难。

编辑: superusers.com 上的用户 karol 提到大小问题和读取错误都是-tao在 wodim 而不是-dao模式中使用(默认)的结果。我还不能测试它,但这听起来是迄今为止最合理的解释。

Nic*_*ght 3

确实,这可能是填充。检查文件大小,是否output.iso稍大一些?

看看最后output.iso

dd if=output.iso bs=1 seek=658562000 count=1071 | hexdump -C
Run Code Online (Sandbox Code Playgroud)

我猜是零?

您可以尝试运行ls -l input.iso以获取其确切大小,然后:

dd if=output.iso bs=1 count=<INPUT.ISO SIZE> | md5sum
Run Code Online (Sandbox Code Playgroud)

请注意,这会非常慢,因为您一次读取一个字节。如果大小可以被整数整除,则用该整数替换 in1并将 inbs=1除以count该数字。即使一次 2 个字节也会快得多!

至于你的第二个问题,当dd到达设备末端时,会发生输入/输出错误。完全不用担心。


小智 0

这个问题可能与你使用dd有关。尝试conv=direct在使用dd读盘时添加,即:

sudo dd if=/dev/cdrom of=output.iso conv=direct
Run Code Online (Sandbox Code Playgroud)

这告诉我们绕过内核块层来dd使用它的 I/O。O_DIRECT(通常情况下,即使调用程序请求的数据块较少,块层也会读取 4KB 数据块。对于扇区数为奇数的光盘来说,这可能是一半错误的原因???)