在互联网上的某个地方,我读到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。但是,尽管我可以用0x00为dd(conv = sync)填充有问题的扇区,但gddrescue似乎缺少此功能?相反,它只是跳过有问题的扇区,不向其位置写入任何内容,然后继续下一个扇区(如果我已经在输出文件中的该扇区上写入了数据,则不会覆盖它:有时可能不希望这样做) )。我不确定-t(truncate)选项对具有gddrescue的块设备如何工作(我猜想它将完全用0x00覆盖),但是在常规文件上,正如预期的那样,它将截断整个文件,而仅在偏移尺寸内(即-o1)将其截断。因此,这有点类似于dd sync,但是与之完全不同的是,如果您准备好覆盖整个输出设备/文件,它只会模仿相同的功能。
虽然,由于存在详细的选项以及记录坏扇区/块的功能,gddrescue似乎是更好的选择。重要的是要注意,这两个应用程序都是使用(几乎)相同的参数启动的。
输出
diff?.bin
为空(退出0),表示文件完全相同。
现在,这是我的一部分,不要理解:
即使在没有错误的情况下,dd也很慢,因为它只进行很小的读取和写入操作。它花费大量时间仔细检查驱动器的错误部分,而不是尽可能多地读取无错误的内容,然后再去做困难的事情。
这是怎么回事?尤其是“ 它花费大量时间仔细检查驱动器的错误部分,而不是尽可能多地读取无错误的内容,然后又去做那些困难的部分 ”吗?它花费了与上面所示相同的时间(即使我检查了非常小的数据部分,但这是否重要?)。
gddrescue提供了-r开关,该开关应该控制“坏扇区” 上的重读次数,但是,dd似乎一直都在-r0的情况下运行(因为花费了相同的时间)。那么,此选项仅用于“后处理”吗?我正在逐渐,指的是原来这两个DD和gddrescue似乎与运行-R 0和DD似乎并没有被咀嚼过的错误部分的任何超过gddrescue(他们似乎都停止坏块15-18上秒的付出或付出,这是怎么回事,gddrescue如何更快???
另外,-D选项(对输出文件使用同步写入)有什么作用?我没有发现与进行的某些测试有任何区别。
谁能对整个事情发表评论?谢谢。