如何在测试文件中模拟磁盘分区坏块?

如何在测试文件中模拟磁盘分区坏块?

我想在实际应用一些磁盘救援方法之前对其进行测试,特别是 ddrescue 从多个磁盘副本中恢复坏块的能力,假设每个副本中都有一个坏块。

由于 Linux 下设备由文件表示,我认为可以在文件中标记坏块。假设我创建了一个参考文件和两个副本,如下所示:

dd if=/dev/random of=/tmp/file bs=1024 count=32768
cp /tmp/file /tmp/file1
cp /tmp/file /tmp/file2

如何模拟文件 1 和文件 2 中的坏块,就像它们是设备文件一样?

解决方案这里这里作者:Kamil Maciorowski这里是解决问题的良好途径,但没有为我的用例提供完整的方法

答案1

感谢 Kamil Maciorowski 的建议和他在其他地方的回答,我可以构建以下流程并对其进行测试:

1)创建一个测试文件并计算其哈希值以检查未来的恢复

dd if=/dev/urandom of=/tmp/file bs=512 count=32768 status=progress
sha256sum /tmp/file
f90c19308f9f216bf7dece09dd849eb40e97cdef86c6c37f28fbaf9a7bd07503  /tmp/file

2)用它创建一个设备

loopdev=\`losetup -f --show /tmp/file\`
echo $loopdev
/dev/loop1

3)通过 devicemapper 创建损坏的设备,其中包含坏块

dmsetup create file1 << EOF
    0  2048 linear $loopdev 0
 2048  4096 error
 6144  26624 linear $loopdev 6144
EOF

dmsetup create file2 << EOF
    0  30720 linear $loopdev 0
 30720  2048 error
EOF

ls -l /dev/mapper/
lrwxrwxrwx 1 root root       7 mai   30 09:27 file1 -> ../dm-2
lrwxrwxrwx 1 root root       7 mai   30 09:27 file2 -> ../dm-3

请注意,在每一行中,第一个数字是位置,第二个数字是大小,因此在最后一行中,总和是文件的大小:6144 + 26624 = 32768,30720 + 2048 = 32768

该行6144 26624 linear $loopdev 6144含义为:将设备 $loopdev 从偏移量 6144(以字节为单位)复制到文件 1 的偏移量 6144(以字节为单位),大小为 26624 字节。

4)检查预期位置的 i/o 错误

dd if=/dev/mapper/file1 of=/dev/null count=2048
ok
dd if=/dev/mapper/file1 of=/dev/null count=2049
dd: error reading '/dev/mapper/file1': Input/output error
dd if=/dev/mapper/file2 of=/dev/null count=30720
ok
dd if=/dev/mapper/file2 of=/dev/null count=30721
dd: error reading '/dev/mapper/file2': Input/output error

至此,OP的问题已经得到回答。让我们进一步完成测试:

5)测试 ddrescue:仅好块

ddrescue -B -v -n /dev/mapper/file1 /tmp/file1 /tmp/log
percent rescued:  87.50%
sha256sum /tmp/file1
0d344253f69688e23dd4558c2ffdabb0325f85848f7e65788ea5c9441e7a700c  /tmp/file1

6)使用第二个副本成功修复坏块

ddrescue -B -v -c 16 -r 2 /dev/mapper/file2 /tmp/file1 /tmp/log
percent rescued: 100.00%
sha256sum /tmp/file1
f90c19308f9f216bf7dece09dd849eb40e97cdef86c6c37f28fbaf9a7bd07503  /tmp/file1

7)如果需要(不是 100%),尝试使用第一个副本挽救坏块

ddrescue -B -v -c 16 -r 2 /dev/mapper/file1 /tmp/file1 /tmp/log

8)清理

dmsetup remove file1
dmsetup remove file2
unset loopdev
rm /tmp/file* /tmp/log

相关内容