使用坏扇区来拯救硬盘:dd vs gddrescue


11

互联网上的某个地方,我读到gddrescue 至少dd 更好,因为它能够区分出现故障的扇区执行的磁盘读取量。真的是这样吗?

时间dd if = / dev / sda skip = 900343967 of = a.bin count = 4 iflag = direct conv = noerror,sync

dd:读取`/ dev / sda':输入/输出错误
2 + 0条记录在
2 + 0条记录中
复制出1024个字节(1.0 kB),18.6057 s,0.1 kB / s
3 + 1条在
4 + 0条记录中输出
2048条字节(2.0 kB)已复制,18.6707 s,0.1 kB / s

真实的0m18.672s
用户0m0.000s
sys 0m0.004s

顺便说一句,直接标志确实有帮助,w / o我只能读取4个扇区中的1个(vs 3/4)。但是,这明显降低了传输速度-对我而言,它至少慢了约5倍:5MB / s与没有此标志的25MB / s 。无论如何,现在是gddrescue(ddrescue)部分。

时间ddrescue -b512 -c1 -s4b -dnvD -i900343967b -o0b / dev / sda b.bin

即将从/ dev / sda复制2048字节到b.bin
起始位置:infile = 460976 MB,outfile = 0 B
复制块大小:1

硬块硬块大小:512个字节Max_retries:0
直接:是稀疏:否拆分:截断:否

按Ctrl-C中断
抢救:1536 B,错误大小:512 B,当前速率:53 B / s
ipos:460976 MB,错误:1,平均速率:53 B / s
操作:1536 B,最近一次成功读取的时间: 0秒
完成

真实的0m18.736s
用户0m0.004s
sys 0m0.000s

如上所示,执行所花的时间完全相同。不出所料-相同的数据:3/4。但是,尽管我可以用0x00dd(conv = sync)填充有问题的扇区,但gddrescue似乎缺少此功能?相反,它只是跳过有问题的扇区,不向其位置写入任何内容,然后继续下一个扇区(如果我已经在输出文件中的该扇区上写入了数据,则不会覆盖它:有时可能不希望这样做) )。我不确定-t(truncate)选项对具有gddrescue的块设备如何工作(我猜想它将完全用0x00覆盖),但是在常规文件上,正如预期的那样,它将截断整个文件,而仅在偏移尺寸内(即-o1)将其截断。因此,这有点类似于dd sync,但是与之完全不同的是,如果您准备好覆盖整个输出设备/文件,它只会模仿相同的功能。

虽然,由于存在详细的选项以及记录坏扇区/块的功能,gddrescue似乎是更好的选择。重要的是要注意,这两个应用程序都是使用(几乎)相同的参数启动的。

输出

diff?.bin

为空(退出0),表示文件完全相同。

现在,这是我的一部分,不要理解:

即使在没有错误的情况下,dd也很慢,因为它只进行很小的读取和写入操作。它花费大量时间仔细检查驱动器的错误部分,而不是尽可能多地读取无错误的内容,然后再去做困难的事情。

这是怎么回事?尤其是“ 它花费大量时间仔细检查驱动器的错误部分,而不是尽可能多地读取无错误的内容,然后又去做那些困难的部分 ”吗?它花费了与上面所示相同的时间(即使我检查了非常小的数据部分,但这是否重要?)。

gddrescue提供了-r开关,该开关应该控制“坏扇区” 上的重读次数,但是,dd似乎一直都在-r0的情况下运行(因为花费了相同的时间)。那么,此选项仅用于“后处理”吗?我正在逐渐,指的是原来这两个DDgddrescue似乎与运行-R 0DD似乎并没有被咀嚼过的错误部分的任何超过gddrescue(他们似乎都停止坏块15-18上秒的付出或付出,这是怎么回事,gddrescue如何更快???

另外,-D选项(对输出文件使用同步写入)有什么作用?我没有发现与进行的某些测试有任何区别。

谁能对整个事情发表评论?谢谢。

Answers:


6

我不确定引用的作者是如何得出结论的。我没有在争论他是否正确,我只是没有经验。

另一方面,关于此声明...

gddrescue至少在区分能够在有问题的扇区上执行的磁盘读取量方面优于dd。

使用gddrescue的真正“至少”原因是因为gddrescue不会在重复的读/写尝试时截断输出。关于某些会停止dd的读取错误,gddrescue也是全自动的。

因此,引用的作者可能是正确的,但他可能不是。。。但整个陈述都错失了gddrescue的意义。

更新:dd和gddrescue之间的详细区别。

dd conv = noerror,将在出现错误后继续运行,但只会跳过错误的代码块。即使添加sync选项,也只会放零而不是跳过。如果使用dd使用相同的输出进行另一次读取,则只会覆盖/丢失先前恢复的任何内容。

gddrescue,也会在出错后继续运行。它可以从坏块中恢复部分收益,然后返回并逐个扇区尝试该块。gddrescue将保留详细的错误日志,其中包含好块,坏块以及任何坏块的逐扇区。如果您尝试再次执行读取,则gddrescue将切断(截断)并添加任何其他恢复的数据。

请记住,即使整个工具都无法100%读取,即使使用这两种工具也要记住。您仍然不会从中获得任何数据。如果该块中的某些扇区仍然可读,则gddrescue可能会获取更多数据。


我知道了,..关于gddrescue是全自动的,使用conv = noerror dd也不也是全自动的吗?您能否详细说明“在重复的读/写尝试中截断输出”?您的意思是“后处理”的东西,当命令gddrescue重新检查最初读取失败的扇区时?
XXL

我更新了答案,以反映您的问题。
JM Becker

我已经在硬盘驱动器和光学介质上多次使用了gddrescue。它的优点是它尝试恢复不可读的区域。您也可以停止它并稍后重新运行它,然后它会从停下来的位置开始提取。
克里斯·汤普森

1
@TechZilla - gddrescue 只是跳过坏块为好,就像DD做。就像我在上面写的那样,用零填充(conv = sync)是gddrescue丢失的确切选项,并且有时很有用(通过额外的努力,您可以使用/ dev / zero手动进行此操作,因为您将拥有每个gddrescue输出产生的坏扇区)。在恢复方面,gddrescuedd之间没有区别,gddrescue在这方面没有任何不同。为什么?因为使用相同的块大小,它们将恢复相同数量的数据。
XXL

@TechZilla-唯一的实际差异是在选择要处理的扇区数量大于块大小时。与dd相比,这将使您能够明显加快处理速度,因为dd只能在静态的不变扇区大小下工作。另一方面,gddrescue将首先读取与您指示的一样多的扇区,但是如果内部的单个块可疑并且一旦完成,它也会声明这些块是坏的 -切换到后模式检查混乱的区域逐渐减小扇区大小,直到达到最小块大小
XXL

2

取决于制造硬盘的时间以及制造商以及使用现代硬盘驱动器运行的固件版本,对于现代硬盘,当检测到坏扇区时,固件会将其从使用中删除,并且驱动器会跳过这些坏扇区。因此,就这一点而言,“从硬盘坏区中拯救硬盘”的想法可能没有意义。现在的坏扇区是否曾经具有有效数据的问题似乎是您正在寻求的案例解决方案-无双关!

grc.com上有一些名为spinrite 6的软件,该软件声称能够修复扇区损坏的硬盘。它是付费软件,我从未尝试过。值得一读,特别是如果有人试图“复活”硬盘并且它实际上按照所述方式工作时。grc.com上有关Spinrite 6的常见问题解答表示有30天退款保证(没有试用版或免费版本)。注意:我不隶属于grc.com,也不建议您根据情况使用它。我只是知道它的存在,并且可能会像广告中所说的那样工作,只是不要相信我的话-警告购买者。

关于评估gddrescue是否“优于” dd,至少在区分有问题的扇区上执行的磁盘读取量方面,对坏扇区的读取次数不限(因为它被标记为非在我看来,定性使用gddrescue或dd对在固件列表中保留的坏扇区列表中的功能扇区)无效。

您可能会发现在以下网址阅读dd(Unix)网页很有用:https : //secure.wikimedia.org/wikipedia/en/wiki/Gddrescue#Recovery-oriented_variants_of_dd

您可能还会发现以下内容很有用:如何使用UBCD,dd-rescue和P2 eXplorer创建损坏的硬盘驱动器的映像,网址为:http ://www.myfixlog.com/fix.php?fid = 21

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.