如何在 Debian 8.x 中将 CDROM 复制到 ISO?

如何在 Debian 8.x 中将 CDROM 复制到 ISO?

我需要复制科多尼克斯医疗数据从 CD 到 ISO。我将 CDROM 插入 CD 驱动器TSSTcorp DVD+-RW TS-H653H我的戴尔 Precision T1600。当您将 CD 插入 Debian 时,系统会检测并安装该 CD。在复制中,dd系统性地失败了,但却readom是唯一成功的差异化工具。然而,cp也失败了,所以必须有更好的差异工具在命令行中将 CD 复制到 ISO,相关 LinuxJournal 的文章这里。工作流程

  1. 卸载光驱

    root@masi:/home/masi# unmount /dev/sr0
    
  2. 作为伪代码运行复制命令

    readom... / cp... / dd... / ...
    

成功的工作流程,readom但有一些错误

Atoponce 的命令建议readom

# http://www.commandlinefu.com/commands/view/1396/create-a-cddvd-iso-image-from-disk.
readom dev=/dev/scd0 f=/path/to/image.iso
  • 它的文档

    Create a CD/DVD ISO image from disk.
    

    许多人喜欢使用“dd”来创建 CD/DVD iso 映像。这不好。很坏。原因是“dd”没有任何内置的错误检查。所以,你不知道你是否得到了所有的比特。因此,它不是完成这项工作的正确工具。相反,您应该使用 wodim 包中的“reaom”(读取光学介质)。它具有内置的错误检查功能。同样,如果您想刻录新创建的 ISO,请远离“dd”,并使用:wodim -v -eject /path/to/image.iso

工作流程

root@masi:/home/masi# umount /dev/sr0

root@masi:/home/masi# readom dev=/dev/sr0 f=/home/masi/Desktop/image.iso
Read  speed:  8467 kB/s (CD  48x, DVD  6x).
Write speed:  8467 kB/s (CD  48x, DVD  6x).
Capacity: 35829 Blocks = 71658 kBytes = 69 MBytes = 73 prMB
Sectorsize: 2048 Bytes
Copy from SCSI (3,0,0) disk to file '/home/masi/Desktop/image.iso'
end:     35829
Errno: 5 (Input/output error), read_g1 scsi sendcmd: no error
CDB:  28 00 00 00 8B C0 00 00 35 00
status: 0x2 (CHECK CONDITION)
Sense Bytes: 70 00 03 00 00 00 00 0A 00 00 00 00 11 00 00 00
Sense Key: 0x3 Medium Error, Segment 0
Sense Code: 0x11 Qual 0x00 (unrecovered read error) Fru 0x0
Sense flags: Blk 0 (not valid) 
cmd finished after 7.038s timeout 40s
readom: Input/output error. Cannot read source disk
readom: Retrying from sector 35776.
.....................................................~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~+~~~-~~~
readom: Input/output error. Error on sector 35828 not corrected. Total of 1 errors.

Time total: 1259.495sec
Read 71552.00 kB at 56.8 kB/sec.
Max corected retry count was 0 (limited to 128).
The following 1 sector(s) could not be read correctly:
35828

输出:似乎已正确地将 CDROM 复制到 .iso,但不确定为什么会出现错误。测试的 CD:3。

不成功的cp 工作流程

root@masi:/home/masi# unmount /media/

root@masi:/home/masi# cp /dev/sr0 /home/masi/Desktop/image.iso
cp: error reading ‘/dev/sr0’: Input/output error
cp: failed to extend ‘/home/masi/Desktop/image.iso’: Input/output error

尝试失败dd,因此不建议使用 dd 执行该任务

dd if=/dev/cdrom of=/home/masi/Desktop/image.iso我在 Debian 中使用命令收到以下消息

dd: error reading '/dev/cdrom': Input/output error
143312+0 records in
143312+0 records out
73375744 bytes (73 MB) copied, 37.6356 s, 1.9 MB/s

其他使用 dd 失败的复制命令

  1. bsconv

    # http://crunchbang.org/forums/viewtopic.php?id=23659
    dd if=/dev/scd0 of=whatever.iso bs=2048 conv=sync,notrunc
    
  2. conv仅与

    dd if=/dev/scd0 of=whatever.iso conv=sync,notrunc
    

成功测试 jc___ 分析提案

root@masi:/home/masi# mkdir /media/cdMP

root@masi:/home/masi# mount /dev/cdrom /media/cdMP/
mount: /dev/sr0 is write-protected, mounting read-only

root@masi:/home/masi# umount /dev/cdrom

root@masi:/home/masi# mount /dev/cdrom /media/cdMP/
mount: /dev/sr0 is write-protected, mounting read-only

root@masi:/home/masi# readom dev=/dev/sr0 -scanbus
Error trying to open /dev/sr0 exclusively (Device or resource busy)... retrying in 1 second.
Error trying to open /dev/sr0 exclusively (Device or resource busy)... retrying in 1 second.

因此,请在非 root 工作的地方进行操作,确保没有任何事情使 CDROM 忙碌,并显式激活 CDROM 的文件浏览器

masi@masi:~$ readom dev=/dev/sr0 -scanbus
scsibus3:
    3,0,0   300) 'TSSTcorp' 'DVD+-RW TS-H653H' 'D700' Removable CD-ROM
    3,1,0   301) *
    3,2,0   302) *
    3,3,0   303) *
    3,4,0   304) *
    3,5,0   305) *
    3,6,0   306) *
    3,7,0   307) *

测试 ThomasSchmitt 的提议

我通过卸载和 xorriso 失败了

masi@masi:~$ umount /dev/sr0 

masi@masi:~$ xorriso -outdev /dev/sr0 -check_media use=outdev sector_map="$HOME"/cdrom_sector_map data_to="$HOME"/cdrom_copy.iso abort_file="$HOME"/cdrom_copy_abort --
xorriso 1.3.2 : RockRidge filesystem manipulator, libburnia project.

xorriso : NOTE : Disc status unsuitable for writing
Drive current: -outdev '/dev/sr0'
Media current: CD-R
Media status : is written , is closed
Media summary: 1 session, 35829 data blocks, 70.0m data,     0 free
xorriso : UPDATE : 32 blocks read in 7 seconds , 0.1xC
xorriso : UPDATE : 352 blocks read in 9 seconds , 2.8xC
xorriso : UPDATE : 1216 blocks read in 10 seconds , 11.5xC
xorriso : UPDATE : 2784 blocks read in 11 seconds , 20.7xC
xorriso : UPDATE : 4416 blocks read in 12 seconds , 21.4xC
xorriso : UPDATE : 6048 blocks read in 13 seconds , 21.6xC
xorriso : UPDATE : 7712 blocks read in 14 seconds , 21.9xC
xorriso : UPDATE : 9376 blocks read in 15 seconds , 22.1xC
xorriso : UPDATE : 11072 blocks read in 16 seconds , 22.3xC
xorriso : UPDATE : 12768 blocks read in 17 seconds , 22.5xC
xorriso : UPDATE : 14496 blocks read in 18 seconds , 22.7xC
xorriso : UPDATE : 16224 blocks read in 19 seconds , 22.9xC
xorriso : UPDATE : 17984 blocks read in 20 seconds , 23.1xC
xorriso : UPDATE : 19744 blocks read in 21 seconds , 23.3xC
xorriso : UPDATE : 21536 blocks read in 22 seconds , 23.5xC
xorriso : UPDATE : 23328 blocks read in 23 seconds , 23.7xC
xorriso : UPDATE : 25152 blocks read in 24 seconds , 23.9xC
xorriso : UPDATE : 26976 blocks read in 25 seconds , 24.1xC
xorriso : UPDATE : 28832 blocks read in 26 seconds , 24.3xC
xorriso : UPDATE : 30688 blocks read in 27 seconds , 24.5xC
xorriso : UPDATE : 32576 blocks read in 28 seconds , 24.8xC
xorriso : UPDATE : 34464 blocks read in 29 seconds , 25.0xC
libburn : SORRY : SCSI error on read_10(35828,1): [3 11 00] Medium error. Unrecovered read error.
xorriso : UPDATE : 35829 blocks read in 37 seconds , 2.4xC
xorriso : UPDATE : 35829 blocks read in 37 seconds = 13.0xC
Media checks :        lba ,       size , quality
Media region :          0 ,      35828 , + good
Media region :      35828 ,          1 , - unreadable
xorriso : NOTE : Tolerated problem event of severity 'SORRY'
xorriso : NOTE : -return_with SORRY 32 triggered by problem severity SORRY

测试输出的质量

masi@masi:~$ ls /home/masi/
cdrom_copy.iso    Desktop    Downloads  Pictures  Templates  WolframWorkspaces
cdrom_sector_map  Documents  Music      Public    Videos

masi@masi:~$ su

root@masi:/home/masi# mkdir /mnt/iso

root@masi:/home/masi# mount -o loop /home/masi/cdrom_copy.iso /mnt/iso
mount: /dev/loop0 is write-protected, mounting read-only
root@masi:/home/masi# exit
exit

masi@masi:~$ tar cf - /mnt/iso/ | wc
tar: Removing leading `/' from member names
 303452  886038 72867840

masi@masi:~$ tar cf - /dev/sr0 | wc
tar: Removing leading `/' from member names
      0       3   10240

 masi@masi:~$ umount /dev/sr0 

 masi@masi:~$ tar cf - /dev/sr0 | wc
 tar: Removing leading `/' from member names
       0       3   10240

看来复制的 ISO 文件确实有任何错误,因此它应该是 CD 的完整副本。通过查看两个文件树来确定

masi@masi:~$ su

root@masi:/home/masi# mkdir /mnt/orig_cd

root@masi:/home/masi# mount /dev/sr0 /mnt/orig_cd
mount: /dev/sr0 is write-protected, mounting read-only

root@masi:/home/masi# mount -o loop /home/masi/Desktop/image.iso /mnt/iso
mount: /dev/loop0 is write-protected, mounting read-only

root@masi:/home/masi# diff -q -r /mnt/orig_cd/ /mnt/iso/ | less

输出:输出中没有行less表示完全等效;我还测试了完全不同的内容,其中完全不同,因此两种情况下的输出与预期输出相同。

系统特点

  • 我做dmesg | grep cd退货

    cdrom: Uniform CD-ROM driver Revision: 3.20
    Volume set (in), Read cd: be 00 00 00 8b f3 00 00 02 00 00 00 
    
  • 做事lsscsi -s给予

     cd/dvd TSSTcorp DVD+-RW TS-H653H D700 /dev/sr0 - 
    

操作系统:Debian 8.5
Linux 内核:3.16.0-4-amd64Debin 8.5 中默认的内核
硬件:客户 Dell PC 2011(Dell Precision T1600);客户服务标签1CY515J
CD 驱动器:戴尔 PC 的默认驱动器 -TSSTcorp DVD+-RW TS-H653H
测试 CD:一张完整的和一张空白的
Debian 中 CD 的文档:磁盘映像
差异情况:CD 驱动器的驱动程序出现问题
相关主题:readom 和 dd 正在创建不同的 ISO 映像,从命令行将 CD 归档到 ISO,“dd”读取CD-ROM及其效果(回复:如何验证刻录?),dd 命令将 CD 复制到硬盘 - 输入/输出错误其中一些 I/O 循环,...

答案1

我是开发人员libburn,并使用与此处提到的相同系统已有一年了。内核 3.16 对 2.6 有一些 CD 回归,但复制数据的用例应该可以正常工作。

我宁愿在这里看到位腐烂(readom未维护)、用户错误(错误的设备文件、已安装介质上的读取)以及使用写入类型 Track-At-Once 写入的 CD 介质的“预读错误”(I/O 错误) 。 I/O 错误也可能是由可读性差的介质引起的。

详细地:

/dev/scd0在 vanilla Debian 8 上没有。只有/dev/sr0并且可能是符号链接,例如/dev/cdrom, dev/dvd, ... 因此所有失败scd0都是可以简单解释的。wodim -scanbus如果没有 ,建议运行是徒劳的/dev/scdX,因为wodim只查看这些地址。

readom文档通常是从 readcd 复制的,因此反映了 cdrecord 和 readcd 作者的独特观点。尽管如此,它当然应该有效。

对于从数据 CD、DVD 或 BD 介质进行复制,dd 和 cp 就可以了。这里很少使用 dd 选项 conv=sync,notruncconv=sync对于某些数据源来说确实很危险,因为当数据源每次读取操作传递的字节数少于 bs 字节时,它会注入零。 (CD 和 绝对不会发生这种情况bs=2048。)

"Input/output error"不是由复制程序引起的,而是从内核到这些程序的消息。这通常是由驱动器的错误指示引起的。

在这个特殊情况下,它被证明是经典的“CD 预读错误”。 CD(不是 DVD 或 BD)的最后一个或两个块可能无法读取,因为某些驱动器将一个或两个一次性轨道耗尽块报告为有效负载数据的一部分,但事实并非如此。

在大多数情况下ddcp在内核 3.16 上,所有有效负载块都会在因 I/O 错误而中止之前传递。对于较旧的内核或不幸的情况,mkisofs传统上会在生成 ISO 时添加 300 kB 的填充。如果这 300 KB 中的某些内容不是由内核提供的,则不会损坏 ISO 中的文件内容。

如果 I/O 错误发生在 CD 的最后两个块之前,则很可能是由可读性差的介质引起的。在这种情况下,建议是查看 dmesg 输出或/var/log/messages 类似的报告:

Aug 29 15:51:12 NN kernel: [9852911.947547] sr 2:0:0:0: [sr0] Unhandled sense code
Aug 29 15:51:12 NN kernel: [9852911.947549] sr 2:0:0:0: [sr0]
Aug 29 15:51:12 NN kernel: [9852911.947550] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Aug 29 15:51:12 NN kernel: [9852911.947551] sr 2:0:0:0: [sr0]
Aug 29 15:51:12 NN kernel: [9852911.947552] Sense Key : Medium Error [current]
Aug 29 15:51:12 NN kernel: [9852911.947554] Info fld=0x710
Aug 29 15:51:12 NN kernel: [9852911.947554] sr 2:0:0:0: [sr0]
Aug 29 15:51:12 NN kernel: [9852911.947555] Add. Sense: Unrecovered read error
Aug 29 15:51:12 NN kernel: [9852911.947556] sr 2:0:0:0: [sr0] CDB:
Aug 29 15:51:12 NN kernel: [9852911.947557] Read(10): 28 00 00 00 06 f8 00 00 40 00

这是一个典型的中等错误。软件没有问题。第一手资料甚至不是驱动器问题。

"(Device or resource busy)"错误来自于尝试打开Linux 设备的非可移植open(2)角色的设备文件。O_EXCL这里了解open()CD 刻录机设备文件的特性。

mount(8)使用该标志打开设备。表现良好的刻录程序也应该使用该标志,从而在尝试使用已安装或刻录驱动器时进行学习。

readom使用它是为了避免破坏正在进行的刻录运行。

因此,对于readom或刻录程序,必须首先卸载介质。dd和并不强制建议在复制之前卸载cp

关于基于 libburn 的数据读取的问题的回答:

可以尝试 xorriso 的 dd_rescue-ish 命令

xorriso -outdev /dev/sr0 -check_media use=outdev sector_map="$HOME"/cdrom_sector_map data_to="$HOME"/cdrom_copy.iso abort_file="$HOME"/cdrom_copy_abort --

该副本应作为 file 出现~/cdrom_copy.iso。将报告读取错误,并尝试复制下一个块。该文件~/cdrom_sector_map将记录失败和成功读取的模式。另一个读取运行将加载它,然后仅尝试那些尚未成功复制的块。

成功的运行应该以类似这样的消息结束

Media checks :        lba ,       size , quality
Media region :          0 ,     359062 , + good

带有剩余坏块的运行将在质量列中出现带有“-”字符的“媒体区域”行。 “+”表示成功读取块的间隔。 “0”表示尚未尝试的块。 (在曲目之间,它们可能会保持这种状态。CD-ROM 应该只有一个曲目。)

CD Track-At-Once 耗尽块会导致“-”质量。如果这种情况仅发生在 CD 的最后两个块之一,则很可能所有有效负载块都已复制到~/cdrom_copy.iso.

如果您想中止这个相当顽固的程序运行,那么最好在另一个 shell 中执行:

touch "$HOME"/cdrom_copy_abort

如果您终止该进程,则不会写入扇区映射,并且下一次运行将重新读取已复制的块。

完全成功或仅丢失最后一两个块后,您接下来应该测试复制的 ISO 中是否没有文件指向丢失的块地址。

作为超级用户(或通过sudo):

mkdir /mnt/iso
mount -o loop ...your.users.home.../cdrom_copy.iso /mnt/iso

应该报告此注释,但没有进一步的错误消息:

mount: /dev/loop0 is write-protected, mounting read-only

作为普通用户,让我们tar读取所有文件并使用输出wc

tar cf - /mnt/iso | wc

应该不报告任何 I/O 错误,而只报告警告,最后是三个数字

tar: Removing leading `/' from member names
1343012 7725571 331386880

如果 CD 的可读性足以安装,则cdrom_copy.iso通过创建另一个安装目录和 mount 来比较 CD 和 CD的文件/dev/sr0

mkdir /mnt/orig_cd
mount /dev/sr0 /mnt/orig_cd

然后比较两个文件树。将输出通过管道传输到less,以便在存在许多差异的情况下不会淹没您的终端

diff -q -r /mnt/orig_cd /mnt/iso 2>&1 | less

空输出表示没有差异。尝试安装不同的 CD,您应该会收到很多消息,例如

Only in /mnt/iso: ...some_name...
...
Only in /mnt/orig_cd: ...some_other_name...

如果两个树中具有相同相对路径的文件具有不同的内容,您将看到类似的消息

Files /mnt/cd_orig/...some_file... and /mnt/iso/...some_file... differ

当一切正常后,然后删除文件~/cdrom_sector_map,以便它无法阻止xorriso从您必须应用整个过程的下一张 CD 读取块。

相关内容