17

我正在寻找一种更简单的方法来针对在读取某些块时生成 i/o 读取错误的故障块设备来测试我的应用程序。尝试使用具有已知坏块的物理硬盘驱动器是一种痛苦,如果存在,我想找到一个软件解决方案。

我确实找到了Linux 磁盘故障模拟驱动程序,它允许创建一个接口,该接口可以配置为在读取特定范围的块时生成错误,但它适用于 2.4 Linux 内核并且尚未针对 2.6 进行更新。

完美的是一个 lostup 和 loop 驱动程序,它还允许您将其配置为在尝试从给定的一组块中读取时返回读取错误。

4

4 回答 4

31

它不是您要查找的环回设备,而是设备映射器。

用于dmsetup创建由“错误”目标支持的设备。它会出现在/dev/mapper/<name>.

设备映射器演示文稿 (PDF)的第 7 页正是您正在寻找的内容:

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 逻辑卷管理器管理”中的设备映射器附录。


还有一个flakey目标——linear有时 error会成功。还delay引入了故意延迟测试。

于 2009-12-09T01:11:42.083 回答
5

似乎 Linux 的内置故障注入功能是一个好主意。

博客:http
://blog.wpkg.org/2007/11/08/using-fault-injection/ 参考:https ://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt

于 2013-04-27T20:48:52.733 回答
4

使用块设备最简单的方法是使用nbd

git://github.com/yoe/nbd.git下载用户空间源并修改nbd-server.c为在您希望它失败的任何区域读取或写入失败,或者以可控的随机模式失败,或者基本上任何你想要的.

于 2009-12-09T04:02:57.877 回答
0

我想详细说明 Peter Cordes 的回答。

bash中,使用 ext4 在回送设备上设置一个图像,然后将一个名为binary.bin.

imageName=faulty.img
mountDir=$(pwd)/mount

sudo umount $mountDir ## make sure nothing is mounted here

dd if=/dev/zero of=$imageName bs=1M count=10
mkfs.ext4 $imageName
loopdev=$(sudo losetup -P -f --show $imageName); echo $loopdev
mkdir $mountDir
sudo mount $loopdev $mountDir
sudo chown -R $USER:$USER mount

echo "2ed99f0039724cd194858869e9debac4" | xxd -r -p > $mountDir/binary.bin

sudo umount $mountDir

python3中(因为 bash 难以处理二进制数据)在binary.bin

import binascii

with open("faulty.img", "rb") as fd:
    s = fd.read()
    
search = binascii.unhexlify("2ed99f0039724cd194858869e9debac4")

beg=0
find = s.find(search, beg); beg = find+1; print(find)

start_sector = find//512; print(start_sector)

然后回到bash挂载有故障的块设备

start_sector=## copy value from variable start_sector in python
next_sector=$(($start_sector+1))
size=$(($(wc -c $imageName|cut -d ' ' -f1)/512))
len=$(($size-$next_sector))

echo -e "0\t$start_sector\tlinear\t$loopdev\t0" > fault_config
echo -e "$start_sector\t1\terror" >> fault_config
echo -e "$next_sector\t$len\tlinear\t$loopdev\t$next_sector" >> fault_config

cat fault_config | sudo dmsetup create bad_drive
sudo mount /dev/mapper/bad_drive $mountDir

最后我们可以通过读取文件来测试故障块设备

cat $mountDir/binary.bin

这会产生错误:

cat: /path/to/your/mount/binary.bin: Input/output error

完成测试后清理

sudo umount $mountDir
sudo dmsetup remove bad_drive
sudo losetup -d $loopdev
rm fault_config $imageName
于 2020-06-25T19:13:13.990 回答