我想测试一个类似的分区创建软件parted
。
我找到了一个旧的 USB 盘,每次我尝试读取它时,程序都会崩溃。为了保存这个测试用例,我需要尽可能准确地复制 USB 盘,保留 IO 错误。
我知道在读取该文件的某些字节时可能无法让我的 HDD 抛出 IO 错误,但也许可以通过某种程序来模拟,该程序对整个 USB 记忆棒内容进行硬编码并记住何时抛出 IO 错误?
我正在使用 Arch Linux,并且希望有可以适应它的解决方案(可能通过某种 VM 或机器模拟器)。
答案1
对于复制,请使用ddrescue
、、safecopy
或dd_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(基于闪存)磁盘上运行得如何。
警告- 如果你搞砸了块大小,那么第一个非读取块之后的所有数据都会被搞砸 - 你需要将块大小设置为你正在复制的设备的块大小从。