克隆磁盘而不丢失 IO 错误信息

克隆磁盘而不丢失 IO 错误信息

我想测试一个类似的分区创建软件parted

我找到了一个旧的 USB 盘,每次我尝试读取它时,程序都会崩溃。为了保存这个测试用例,我需要尽可能准确地复制 USB 盘,保留 IO 错误

我知道在读取该文件的某些字节时可能无法让我的 HDD 抛出 IO 错误,但也许可以通过某种程序来模拟,该程序对整个 USB 记忆棒内容进行硬编码并记住何时抛出 IO 错误?

我正在使用 Arch Linux,并且希望有可以适应它的解决方案(可能通过某种 VM 或机器模拟器)。

答案1

对于复制,请使用ddrescue、、safecopydd_rescue。它们都会记录失败的区域,并自动重试,直到可以获取数据为止。

一般用法是:

  • ddrescue:(不要与旧版 dd_rescue 混淆)

    ddrescue /dev/sdc3 sdc3.img sdc3.map
    

    如果需要,可以使用--retrim或`--try-again重复:

    ddrescue --try-again /dev/sdc3 sdc3.img sdc3.map
    

    不要忘记指定用于记录坏区域的地图文件。

  • 安全副本:

    safecopy --stage1 /dev/sdc3 sdc3.img
    safecopy --stage2 /dev/sdc3 sdc3.img
    safecopy --stage3 /dev/sdc3 sdc3.img
    

    第 3 阶段之后,您将获得一个stage3.badblocks列出各个坏扇区的文件。

    如果您想重试,请使用:

    mv stage3.badblocks stage2.badblocks
    safecopy --stage3 /dev/sdc3 sdc3.img
    
  • dd_救援:(不要与功能更强大的 ddrescue 混淆)

    dd_rescue -o sdc3.badblocks /dev/sd3 sdc3.img
    

    (我不知道此工具是否支持通过第二次调用来恢复/重试,但至少它确实输出了坏块日志。)

这些计划强调获取尽可能多的数据快速地尽可能地恢复,并将缓慢的恢复留到以后再进行。因此,如果“第 1 阶段”仅因为一个坏块而跳过整个兆字节,请不要感到惊讶 - 它会在第 2 阶段返回到该状态。

为了模拟坏盘,请获取刚刚获得的坏块日志,并将其应用到此帖子中:

使用dmsetup创建由“错误”目标支持的设备。它将显示在 中/dev/mapper/<name>

第 7 页设备映射器演示 (PDF)有你正在寻找的内容:

dmsetup create bad_disk << EOF
  0 8       linear /dev/sdb1 0
  8 1       error
  9 204791 linear /dev/sdb1 9
EOF

或者省去sdb1部分并将“错误”目标作为块 0 - 8 的设备(而不是sdb1)以制作纯错误磁盘。

也可以看看设备映射器来自“RHEL 5 逻辑卷管理器管理”的附录。

— Peter Cordes,https://stackoverflow.com/questions/1870696/simulate-a-faulty-block-device-with-read-errors

(将 badblocks 日志或 ddrescue mapfile 转换为 dmsetup 表语法留给读者练习...)

答案2

当遇到错误时可以指示 dd 继续,这只会在无法从原始磁盘读取的空间中写入零......

dd bs=<blocksize here> conv=sync,noerror if=/dev/sdc123 of=/home/me/testFile

您也可以尝试使用 ddrescue 来尝试实际恢复数据,但我不确定它在 USB(基于闪存)磁盘上运行得如何。

警告- 如果你搞砸了块大小,那么第一个非读取块之后的所有数据都会被搞砸 - 你需要将块大小设置为你正在复制的设备的块大小

相关内容