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

Ouz*_*wer 2 ddrescue

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

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

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

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

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

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

Ste*_*itt 7

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

\n
$ ddrescue --force /dev/zero /dev/full\nGNU ddrescue 1.23\nPress Ctrl-C to interrupt\n     ipos:        0 B, non-trimmed:        0 B,  current rate:       0 B/s\n     opos:        0 B, non-scraped:        0 B,  average rate:       0 B/s\nnon-tried:    9223 PB,  bad-sector:        0 B,    error rate:       0 B/s\n  rescued:        0 B,   bad areas:        0,        run time:          0s\npct rescued:    0.00%, read errors:        0,  remaining time:         n/a\n                              time since last successful read:         n/a\nCopying non-tried blocks... Pass 1 (forwards)\nddrescue: Write error: No space left on device\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n


dir*_*rkt 5

badblocks程序报告读取错误、写入错误和损坏错误,请参见此处

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

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

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

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