拯救坏扇区的硬盘:dd vs gddrescue

XXL*_*XXL 11 linux hard-drive dd bad-blocks

我在互联网上的某个地方读到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 秒,0.1 KB/s 4+0 记录中的
3+1
记录输出
2048复制的字节 (2.0 kB),18.6707 s,0.1 kB/s

真实 0m18.672s
用户 0m0.000s
系统 0m0.004s

顺便说一句,直接标志真的很有帮助,没有它我只能读取 4 个扇区中的 1 个(与 3/4 相比)。然而,这明显降低了传输速度——对我来说至少慢了大约 5 倍:5MB/s vs 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中断
rescued: 1536 B, errsize: 512 B, current rate: 53 B/s
ipos: 460976 MB, errors: 1, average rate: 53 B/s
opos: 1536 B, time from last success read: 0 秒
完成

真实 0m18.736s
用户 0m0.004s
系统 0m0.000s

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

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

的输出

差异?.bin

为空(退出 0),意味着文件完全相同。

现在这是我明白的部分:

dd即使在无错误的东西上也很慢,因为它正在执行微小的读取和写入。它花费了大量时间来检查驱动器的错误部分,而不是尽可能多地阅读无错误的内容,然后再回去做困难的事情。

那是怎么回事?尤其是“它花了很多时间来检查驱动器的错误部分,而不是尽可能多地阅读无错误的东西,然后再回去做困难的事情”?花费的时间与上面显示的相同(即使我检查了非常小的一部分数据,但这是否重要?)。

gddrescue提供了-r开关,它应该控制“坏扇区”上的重新读取量,但是,dd似乎一直与-r0一起运行(因为它花费了相同的时间)。那么,这个选项仅用于“后处理”吗?我的意思是,最初ddgddrescue似乎都在使用-r0运行,而dd似乎并没有像gddrescue 一样咀嚼错误的部分(它们似乎都在坏块上 15-18秒给予或接受,所以有什么关系,gddrescue如何更快???)

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

任何人都可以评论整件事吗?谢谢。

J. *_*ker 6

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

另一方面,关于这个声明......

gddrescue 至少在能够区分对故障扇区执行的磁盘读取量方面优于 dd。

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

所以引用的作者可能是正确的,他可能不是......但整个陈述都没有抓住gddrescue的重点。

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

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

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

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