为什么 ddrescue 不使用不同的映射文件来处理读取和写入错误? (以及如何检测写入错误?)

为什么 ddrescue 不使用不同的映射文件来处理读取和写入错误? (以及如何检测写入错误?)

有时,我必须将一个硬盘克隆到另一个看起来健康的硬盘(SMART 值正常),但无法完全检查其表面是否存在可能的坏扇区。

通常,如果我克隆一个健康的硬盘驱动器,我可能会使用之前未擦除的目标驱动器,因此也没有完全检查

如果我错了,请告诉我:我相信 ddrescue 仅报告读取错误。 这也意味着 ddrescue 将指示克隆成功且没有错误,即使某些扇区由于写入错误而无法复制到目标驱动器。同样,映射文件不会让您知道目标驱动器上是否有错误。

所以,我一直想知道为什么 ddrescue 不允许生成两个映射文件(read.log)(write.log),我认为简短的答案可能是“这尚未实现。”。

这就引出了第二个问题:有没有办法检测写入错误?

注意:我假设克隆后在两个 1TB 驱动器上计算校验和需要一段时间。有更好的解决方案吗?

答案1

ddrescue不记录写入错误,因为写入错误是致命的。每次需要写入一个块时,它都会跟踪预期写入的字节数,如果未成功写入那么多字节,则会中止并显示错误消息。你可以通过运行看到这一点

$ ddrescue --force /dev/zero /dev/full
GNU ddrescue 1.23
Press Ctrl-C to interrupt
     ipos:        0 B, non-trimmed:        0 B,  current rate:       0 B/s
     opos:        0 B, non-scraped:        0 B,  average rate:       0 B/s
non-tried:    9223 PB,  bad-sector:        0 B,    error rate:       0 B/s
  rescued:        0 B,   bad areas:        0,        run time:          0s
pct rescued:    0.00%, read errors:        0,  remaining time:         n/a
                              time since last successful read:         n/a
Copying non-tried blocks... Pass 1 (forwards)
ddrescue: Write error: No space left on device

如果ddrescue成功完成,那么就其所知,它设法读取的所有数据都已正确写入。

答案2

badblocks程序报告读取错误、写入错误和损坏错误,请参见例如这里

如果您想确保目标磁盘正常,请badblocks在其上以破坏性模式运行。但请记住,坏扇区将在写入时重新映射,如其他答案中所述。

至于“是否ddrescue报告写入错误”,最简单的方法是查看代码,或者尝试并设置一些会导致错误的目标。但我的假设是,写入只遵循标准的 unix 约定,并且将被报告为异常错误,就像在任何其他工具中一样。

至于“为什么”,你的猜测和我的一样好,但 unix 的一个基本原则是“保持简单,并将关注点分离到不同的工具中”。

重点ddrescue是从损坏的磁盘中获取数据。还有其他工具可以确保您有可靠的东西来写入结果。

答案3

现代磁盘通过将故障扇区重新映射到专门针对这种情况的备用扇区之一,透明且自动地处理写入故障。

您可以在 SMART 结果中查看状态:

smartctl -a /dev/sda

...
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   253   000    Old_age   Offline      -       0

在此示例中,ID #5 行的最后一个值显示没有重新分配任何扇区。 #197 的值是报告读取错误但尚未写入和重新分配的扇区数。 #198 的值是存在读/写错误且无法重新分配的扇区数 - 通常是因为许多其他扇区发生故障,以至于没有更多可用的备用扇区。

只有在最后一种情况下,写入才会被报告给操作系统失败。ddrescue当错误从内核依次报告给应用程序时,或者任何其他工具都可能会失败。

相关内容