2

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=
  1. 他为什么要这样做??为什么他不能线性复制并且每次遇到坏扇区时都跳过它-在我看来,他所做的只是从坏块中提取工作扇区。

  2. 我被困在“修剪”中,而拆分更糟 - 有人可以阅读该文档来解释这一切吗?

  3. 他怎么可能重试!他可以重试坏扇区,但由于他已经修剪了块并将它们写了出来——他将如何插入重试后恢复的数据?

4

1 回答 1

2
  1. 坏扇区自然会成组出现...如果我用锤子轻轻敲打工作驱动器,磁头很可能会划伤表面...它正在旋转...所以它会在存储表面上形成一个漂亮的同心圆. 在坏块之后尝试坏块通常是在浪费时间......在大多数情况下,坏驱动器没有多少时间剩下......

  2. 修剪未知范围后,边缘很可能有坏扇区 - 这就是为什么分裂从中心开始......这可能是健康的......

  3. 它通过使用 fseek() 或类似的东西寻找目标扇区...ddrescue 就像类固醇上的 dd...它能够“知道”已读取哪些数据,它忽略了磁盘的所有部分不可读

于 2013-07-17T20:44:00.573 回答