http://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html
ddrescue 的算法如下(用户可以随时中断进程,但要注意坏的驱动器会阻塞 ddrescue 很长时间,直到内核放弃):
1) 可选择读取描述多部分或先前中断救援状态的日志文件。如果未指定日志文件或为空或不存在,则将所有救援域标记为未尝试。
2)(第一阶段;复制)读取输入文件中未尝试的部分,将失败的块标记为未修剪并跳过它们,直到尝试所有救援域。仅以大块读取未尝试的区域。修剪、拆分和重试是逐个扇区完成的。每个扇区最多尝试两次;此步骤中的第一个作为大块读取的一部分,以下步骤之一中的第二个作为单个扇区读取。
3)(第二阶段;修剪)从最大的未修剪块的前沿一次读取一个扇区,直到找到坏扇区。然后从同一块的后沿一次向后读取一个扇区,直到找到坏扇区。对于每个未修剪的块,将找到的坏扇区标记为坏扇区,并将该块的其余部分标记为未拆分。重复直到没有更多未修剪的块。
4)(第三阶段;拆分)从最大的非拆分块的中心一次读取一个扇区,直到找到坏扇区。然后从同一块的中心一次向后读取一个扇区,直到找到坏扇区。如果日志文件大于
--logfile-size', read the smallest non-split blocks until the number of entries in the logfile drops below
--logfile-size'。重复直到所有剩余的非分割块少于 5 个扇区。然后依次读取剩余的非拆分块。5)(第四阶段;重试)可选地尝试再次读取坏扇区,直到达到指定的重试次数。
6) 可选地写一个日志文件供以后使用。
我的理解:**当他在复制时**他只是一个一个地复制块,从不退缩复制旧块。任何包含有缺陷扇区的块都被标记为坏块(整个块)。坏块被标记为未修剪。
传奇:
=1 2 3= is a bad BLOCK
[1 2 3] is a good block
x is a bad sector
@ is the read cursor
in a =1 2 3= center sector(2) is always bad
当他在 Trimming Read 时,从最大的未修剪块的前沿一次转发一个扇区,直到找到坏扇区。
=1 2 3= [4 5 6] =7 8 9=@ [10 11 12] =13 14 15=
=1 2 3= [4 5 6] =7 8 9= [10 11 12] =13 @14 15=
然后从同一块的后沿一次向后读取一个扇区,直到找到坏扇区。
=1 2 3= [4 5 6] @=7 8 9= [10 11 12] =13 14 15=
=1 @2 3= [4 5 6] =7 8 9= [10 11 12] =13 14 15=
对于每个未修剪的块,将找到的坏扇区标记为坏扇区,并将该块的其余部分标记为未拆分。
=1 x 3= [4 5 6] =7 8 9= [10 11 12] =13 x 15=
他为什么要这样做??为什么他不能线性复制并且每次遇到坏扇区时都跳过它-在我看来,他所做的只是从坏块中提取工作扇区。
我被困在“修剪”中,而拆分更糟 - 有人可以阅读该文档来解释这一切吗?
他怎么可能重试!他可以重试坏扇区,但由于他已经修剪了块并将它们写了出来——他将如何插入重试后恢复的数据?