2009-12-08 20 views
11

我正在寻找一种更简单的方法来测试我的应用程序,以防止发生某些块读取时产生I/O读取错误的错误块设备。试图使用具有已知坏块的物理硬盘很痛苦,如果存在软件解决方案,我希望找到一个软件解决方案。模拟有读取错误的故障块设备?

我找到了Linux Disk Failure Simulation Driver,它允许创建一个接口,可以配置为在读取特定范围的块时生成错误,但它适用于2.4 Linux内核并且尚未针对2.6进行更新。

什么是完美的将是一个losetup和循环驱动程序,也允许您配置它尝试从给定的一组块读取时返回读取错误。

+0

除了答案参见[的Linux磁盘故障注入机制列表](https://unix.stackexchange.com/a/144200/61610)超过上[导致I/O错误的特殊文件Unix和Linux问题](https://unix.stackexchange.com/questions/77492/sp​​ecial-file-that-c​​auses-io-error/144200#144200)。 – Anon 2017-10-24 20:07:15

回答

19

这不是您正在寻找的回送设备,而是设备映射程序。使用dmsetup创建一个由“错误”目标支持的设备。它将显示在/dev/mapper/<name>

第7页的Device mapper presentation (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)制作一个纯粹的错误磁盘。

另请参见0123“逻辑卷管理器管理”中的“RHEL 5 ”的附录。

+0

完美工作 - 正是我需要的。谢谢! – SteveG 2009-12-10 01:03:02

+0

上面的PDF没有解释(至少我不明白)“dmsetup create”的命令行语法。手册页解释它是:dmsetup create dev_name dev_mapper_table。第二个参数(dev_mapper_table)是一个描述块如何映射的文本文件。 dmsetup手册页很简洁,并没有解释这个表的语法。这里有一个解释它的链接... [link](https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Logical_Volume_Manager_Administration/device_mapper.html#dm-mappings) – technicalbloke 2012-08-25 18:52:59

4

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

git://github.com/yoe/nbd.git下载用户空间来源和修改nbd-server.c你希望它失败,或者在一个可控随机模式,或基本上任何你想要的失败哪个地区在读或写上失败。

5

看来Linux的内置故障注入功能是一个不错的主意。

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

+0

虽然链接对于进一步阅读是有好处的,我想你应该在这里明确地提出具体的答案。 – 2017-05-05 11:12:50

+0

它也取决于您正在使用的内核:例如,在SLES11 SP4内核中,未编译该功能。 – 2017-05-08 12:59:55