我正在尝试使用以下命令从损坏严重的 CD 上复制数据:
dd if=/dev/sr1 of=IDT.img conv=sync,noerror status=progress
但是,“of”设备已断开连接,并且 dd 停止了(输出如下)。
...
dd: error reading '/dev/sr1': Input/output error
1074889+17746 records in
1092635+0 records out
559429120 bytes (559 MB, 534 MiB) copied, 502933 s, 1.1 kB/s
dd: writing to 'IDT.img': Input/output error
1074889+17747 records in
1092635+0 records out
559429120 bytes (559 MB, 534 MiB) copied, 502933 s, 1.1 kB/s
我可以继续:
dd if=/dev/sr1 of=IDT.img conv=sync,noerror status=progress seek=1092635 skip=1092635
或者查找/跳过数字应该是两者1092636
,或者跳过/查找应该彼此不同,或者完全不同?
PS 我知道我可能使用了错误的命令,例如 ddrescue 可能更好。但我现在可能被 dd 困住了(?)。我预计输出文件方面不会再出现任何错误。
答案1
您遇到了读取错误,因此这些选项conv=sync,noerror
几乎肯定会更改数据流,不幸的是使您的输出文件毫无价值或至少是不准确的副本。
每次输入出现错误读取(短读取)时,该conv=sync
选项都会用 NUL 字节填充该块。该dd
命令将尝试从中断处继续输入流,但输出现在插入了未知数量的 NUL 字节。
您应该停止使用dd
并使用ddrescue
,它是为了从坏媒体中恢复数据而创建的。
类似主题的参考答案
答案2
使用解救。它可以读取损坏的介质并“保留”损坏的部分,而 dd 则不能。
想象一下你的原始数据:
+-+-+-+-+-+-+-+-+-+-+-+-+
|a b c d e f g h i j k l|
+-+-+-+-+-+-+-+-+-+-+-+-+
损坏后 ( X
) 它们看起来像这样:
+-+-+-+-+-+-+-+-+-+-+-+-+
|a b c X X X X h i j k l|
+-+-+-+-+-+-+-+-+-+-+-+-+
dd conv=sync,noerror 将读取以下内容:
+-+-+-+-+-+-+-+-+
|a b c h i j k l|
+-+-+-+-+-+-+-+-+
ddrescue 将读取什么内容。
+-+-+-+-+-+-+-+-+-+-+-+-+
|a b c 0 0 0 0 h i j k l|
+-+-+-+-+-+-+-+-+-+-+-+-+
正如您所看到的,dd 读取的原始消息是倾斜的,如果您以这种方式生成文件系统映像,它将变得不可用。您可以安装 Ddrescue 映像而不会出现任何问题,这将帮助您像往常一样访问未损坏的数据,并且可以轻松地将损坏的数据放在一边并进行下一步处理。