从运行livecd重新生成iso文件 – dd不能可靠地运行,genisoimage有catch-22s

在这个领域,我需要一些用户能够从一个CDROM中可靠地生成ISO文件,这个CDROM也是一个安装的LiveCD,所以我在编写脚本之前编写了一个手动testing用例。 testing用例失败。

ISO复制testing程序

具体来说,手动testing程序是:

  1. 从基于ubuntu-9.10的特定定制livecd的iso文件开始
  2. 使用计算机#1的刻录机使用此iso文件刻录光盘
  3. 用电脑启动光盘#2 – 启动后请确保/ tmp有足够的容量来保存iso的副本
  4. 在计算机#2上使用dd在/ tmp中创build另一个iso文件
  5. 检查文件的大小和最后在步骤中使用的结果iso in / tmp的md5

testing案例的失败

失败模式是复制没有完成。

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 

思考? 有没有一些不太明显的select,我应该在块大小的方式给dd或告诉它重读错误?

**更新*在VirtualBox上成功

运行另一个副本 – 这次是从SUN VirtualBox而不是物理硬件。 这将部分地testing,例如,iso文件本身是否是责任,或者是否有一些特殊的软件方面。 DD工作正常,重新生成的时候,在物理大小匹配和MD5的匹配livecd运行在虚拟硬件。

更新#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损坏,它是如何启动的? 奇怪。

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

请注意,没有关于在通过文件系统时无法读取文件块的抱怨。

维基百科vs dd

与理查德T的互动使我思考基本的光盘可靠性。 iso9660的维基百科条目谈到CDROM模式1,其中包括用户数据每2048字节288个字节的纠错码。 为了生产一个忠实的副本,是否必须让一切正确,没有ECC的好处? 如果ECC是iso9660规范的一部分,我会猜测'是',因为dd正在复制ECC位和数据,而不考虑使用哪一个来影响另一个。 如果ECC是/ dev / sr0 cdrom驱动程序的一部分,我会猜测“不”。

如果获得错误更正副本的唯一方法是通过文件系统,那么我需要使用genisoimage,并用dd获取前几个扇区,以便为genisoimage启动扇区。 仍然希望从集团的头脑中的东西。

genisoimage

我很幸运有原始的genisoimage命令来掌握原始的iso文件。
所以从计算机#2,运行LiveCD,我试了一下。 这还不够,但也许我们正在接近。

 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. 

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

一个丑陋的黑客

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

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

所以现在怎么办?

必须有一些更好的方法来完成这项任务。

我不是这方面的专家,但在我看来,你的testing是不完整的:在你使用ISO映像之前,你还不知道它是否缺less那些127K。 即使在CD(和DVD)设备上,也有开销。 您的ISO映像表示LOGICAL表示,而不是物理表示,在certificate准确之前,我不相信各种磁盘报告工具只是给出了实际的数据字节信息 – 逻辑上的; 很less关心报道这一个或另一个。

如果您使用ISO制作相关磁盘,并将ISO与ISO进行比较,那么这是一回事,但到目前为止,您还没有真正使用ISO,所以您还有更多的testing要做。 从生成的ISO中创build一个磁盘,然后进行比较…

RT

更新:哎呀! 愚蠢的我:先调查你的错误! 消息日志呢? RT

更新2:你的更新说到硬件,但你从来没有回答这个问题:什么是错误消息试图告诉你? CD不像磁盘那样没有错误