通过运行 livecd 重新生成 iso 文件——dd 无法可靠运行,并且 genisoimage 存在问题

通过运行 livecd 重新生成 iso 文件——dd 无法可靠运行,并且 genisoimage 存在问题

在现场,我需要一些用户能够可靠地从用作已安装 LiveCD 的 cdrom 制作 iso 文件,因此我在编写任何脚本之前编写了一个手动测试用例。测试用例失败了。

ISO 复制测试程序

具体来说,手动测试流程为:

  1. 从基于 ubuntu-9.10 的特定定制 livecd 的 iso 文件启动
  2. 使用这个 iso 文件和计算机 #1 的刻录机刻录一张 CD
  3. 使用计算机 #2 启动 CD -- 启动后确保 /tmp 有足够的容量来保存 iso 的副本
  4. 在计算机 #2 上使用 dd 在 /tmp 中创建另一个 iso 文件
  5. 检查 /tmp 中生成的 iso 的文件大小和 md5 与步骤中最初使用的 iso 的大小和 md5

测试用例失败

故障模式是复制未完成。

Burner 是一款在 Ubuntu-9.10 上运行 Brasero 的 Gateway 桌面

Booter 是一台华硕 N 笔记本电脑。

df 将 cdrom 标识为 /dev/sr0

/tmp 显示有足够的​​空间来保存图像

dd if=/dev/sr0 of=/tmp/cdtest.iso
dd: reading '/dev/sr0' Input/Output error
1022208+0 records in
1022208+0 records out
523370496 bytes (523 MB) copied ....

原始 iso 大小为 523497472 字节,因此缺少大约 127 k。

dmesg (clipped)
[  694.212395] sr 1:0:0:0: [sr0] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[  694.212401] sr 1:0:0:0: [sr0] Sense Key : Illegal Request [current] 
[  694.212406] Info fld=0x3e67e, ILI
[  694.212407] sr 1:0:0:0: [sr0] Add. Sense: Illegal mode for this track
[  694.212413] end_request: I/O error, dev sr0, sector 1022208
[  694.212416] __ratelimit: 1 callbacks suppressed
[  694.212418] Buffer I/O error on device sr0, logical block 255552
[  694.212419] Buffer I/O error on device sr0, logical block 255553
[  694.212422] Buffer I/O error on device sr0, logical block 255554
[  694.212424] Buffer I/O error on device sr0, logical block 255555
[  694.212426] Buffer I/O error on device sr0, logical block 255556
[  694.212428] Buffer I/O error on device sr0, logical block 255557
[  694.212429] Buffer I/O error on device sr0, logical block 255558
[  694.212431] Buffer I/O error on device sr0, logical block 255559
[  694.212433] Buffer I/O error on device sr0, logical block 255560
[  694.212434] Buffer I/O error on device sr0, logical block 255561

有什么想法吗?我是否应该以块大小的方式为 dd 提供一些不太明显的选项,或者告诉它在出现错误时重新读取?

**更新* 在 VirtualBox 上成功

运行了另一次复制练习——这次是从 SUN VirtualBox 而不是物理硬件。这将部分测试,例如,是否是 iso 文件本身的问题,或者是否存在软件方面的特殊问题。当 livecd 在虚拟硬件上运行时,只要物理大小匹配且 md5 匹配,dd 就可以很好地重新创建 iso。

更新#2 启动后,从计算机#2 读取 cdrom 的 isolinux.bin 和 md5sum.txt 时出现 FAIL md5。

在 CD 的 md5 sum 文件上运行 md5sum -c md5sum.txt。

所有文件访问均未抱怨无法读取设备。我原本以为写入末尾附近的文件会出现问题。

isolinux.bin md5 和 md5sum.txt md5 不匹配。isolinux.bin 是系统启动时用来加载 linux 内核和 initrd 的启动代码——它工作正常。md5sum 文件是用于检查 cd 内容的 md5sum 文件。在可能已损坏的文件中,这对文件在安全方面是奇怪的。但 CD 上只有 12 个文件。如果 isolinux.bin 已损坏,它怎么还能正常启动?奇怪。

检查 VirtualBox 测试系统,复制 iso 成功后,我发现 isolinux.bin 和 md5sum.txt 的 md5 与 md5sum 文件不匹配。实际的 md5 也与物理计算机上读取的 md5 完全匹配。这可能只是意味着 md5sum 文件是在 isolinux.bin 完成之前生成的,或者在生成 md5sum 之后复制了新的 isolinux.bin。

请注意,没有人抱怨在浏览文件系统时无法读取文件块。

维基百科与 dd

与 Richard T 的互动让我开始思考基本光盘的可靠性。iso9660 的维基百科条目谈到了 CDROM 模式 1,它包含每 2048 字节用户数据的 288 字节纠错码。dd 要生成忠实的副本,是否必须在没有 ECC 的情况下使所有内容都正确无误?如果 ECC 是 iso9660 规范的一部分,我猜是“是”,因为 dd 正在复制 ECC 位和数据,而不考虑使用其中一个来影响另一个。如果 ECC 是 /dev/sr0 cdrom 驱动程序的一部分,我猜是“否”。

如果获取错误更正副本的唯一方法是通过文件系统,那么我猜我需要使用 genisoimage 并使用 dd 抓取前几个扇区,以便将引导扇区返回给 genisoimage。仍然希望从集体意识中得到一些东西。

geniso图像

我很幸运有原始的 genisoimage 命令来掌握原始 iso 文件。
因此,我从运行 LiveCD 的计算机 #2 尝试了它。这还不够,但也许我们越来越接近了。

apt-get install genisoimage
cd /cdrom
genisoimage -r -V "OurLiveCDNameIsSomethingElse" -cache-inodes -J -l -b isolinux/isolinux -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o /tmp/cdcopy.iso .
Output:
...using utf-8 (detected in locale)
Size of boot image is 4 sectors-> No emulation
genisoimage: Read-only file system.  Error opening boot image file './isolinux/isolinux.bin' for update.

至少现在我们知道为什么 isolinux.bin 上的 md5 不匹配——genisoimage 想要对它做些什么!

丑陋的黑客行为

好的,接下来要尝试的是创建一个名为 uglyhack 的目录,并将 /cdrom 中的所有文件符号链接到那里,除了 isolinux.bin,它获得一个真正的副本。genisoimage 接受这个,并写入 0MB 而没有错误消息。猜测 genisoimage 忽略了符号链接文件。

好消息是,这给出了一个答案,但不是一个很漂亮的答案:
将所有文件从 /cdrom 复制到另一个可写的文件系统,然后在其上运行 genisoimage。

所以现在怎么办?

一定有更好的方法来完成这项任务。

答案1

我不是这方面的专家,但我觉得你的测试并不完整:在使用 ISO 映像之前,你还无法真正知道它是否缺少这 127K。即使在 CD(和 DVD)设备上,也存在开销。你的 ISO 映像代表的是逻辑表示,而不是物理表示,除非证明准确,否则我不会相信各种磁盘报告工具只提供实际的数据字节信息 - 逻辑信息;很少有人关心只报告其中一种。

如果您使用 ISO 制作了相关磁盘,并且正在将 ISO 与 ISO 进行比较,那是一回事,但到目前为止,您还没有真正使用过 ISO,因此……您还需要进行更多测试。使用生成的 ISO 制作磁盘,然后进行比较……

逆转录

更新:哎呀!我真傻:先调查一下你的错误!消息日志怎么样?RT

更新 2:您的更新谈到了硬件,但您从未回答过这个问题:错误消息试图告诉您什么? CD 并不像磁盘那样没有错误……

答案2

从损坏的 CD 中获取可用的 ISO 映像的最佳方法是使用

dd bs=2048 conv=noerror,sync if=/dev/sr0 of=whatever.iso

如果出现读取错误,它会将丢失的数据写为零,并继续保持输入和输出流的搜索同步,因此漏洞出现在某个文件中的可能性比由于数据倾斜而导致文件系统的其余部分无法读取的可能性更大。

相关内容