模拟有读取错误的故障块设备?
我正在寻找一种更简单的方法来针对有故障的块设备测试我的应用程序,这些设备在读取某些块时会生成 I/O 读取错误。尝试使用具有已知坏块的物理硬盘是一种痛苦,我想找到一种软件解决方案(如果存在)。
我确实找到了 Linux 磁盘故障模拟驱动程序,它允许创建一个可配置为的接口当读取某些范围的块时会生成错误,但它适用于 2.4 Linux 内核,并且尚未针对 2.6 进行更新。
完美的是一个lostup和循环驱动程序,它还允许您将其配置为在尝试从给定的一组块读取时返回读取错误。
I'm looking for an easier way to test my application against faulty block devices that generate i/o read errors when certain blocks are read. Trying to use a physical hard drive with known bad blocks is a pain and I would like to find a software solution if one exists.
I did find the Linux Disk Failure Simulation Driver which allows creating an interface that can be configured to generate errors when certain ranges of blocks are read, but it is for the 2.4 Linux Kernel and hasn't been updated for 2.6.
What would be perfect would be an losetup and loop driver that also allowed you to configure it to return read errors when attempting to read from a given set of blocks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
它不是您正在寻找的环回设备,而是设备映射器。
使用
dmsetup
创建由“错误”目标支持的设备。它将显示在/dev/mapper/
中。设备映射器演示文稿 (PDF) 的第 7 页正是您所需要的寻找:
或者省略 sdb1 部分并将“错误”目标作为块 0 - 8 的设备(而不是 sdb1 )以制作纯错误磁盘。
另请参阅设备映射器附录来自“RHEL 5
逻辑卷管理器管理”。
还有一个
flakey
目标 - 有时会成功的线性
和错误
的组合。还有一个延迟
来引入故意延迟测试。It's not a loopback device you're looking for, but rather device-mapper.
Use
dmsetup
to create a device backed by the "error" target. It will show up in/dev/mapper/<name>
.Page 7 of the Device mapper presentation (PDF) has exactly what you're looking for:
Or leave out the
sdb1
parts to and put the "error" target as the device for blocks 0 - 8 (instead ofsdb1
) to make a pure error disk.See also The Device Mapper appendix from "RHEL 5
Logical Volume Manager Administration".
There's also a
flakey
target - a combo oflinear
anderror
that sometimes succeeds. Also adelay
to introduce intentional delays for testing.使用 Linux 的内置故障注入功能似乎是个好主意。
博客:http://blog.wpkg.org/2007/11/ 08/使用故障注入/
参考: https://www.kernel.org/doc/Documentation /故障注入/故障注入.txt
It seems like Linux's built-in fault injection capabilities would be a good idea to use.
Blog: http://blog.wpkg.org/2007/11/08/using-fault-injection/
Reference: https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt
使用块设备的最简单方法是使用 nbd。
从 git://github.com/yoe/nbd.git 下载用户层源代码并修改
nbd-server.c
在您希望它失败的任何区域上读取或写入失败,或者以可控的随机模式失败,或者基本上任何您想要的失败。The easiest way to play with block devices is using nbd.
Download the userland sources from git://github.com/yoe/nbd.git and modify
nbd-server.c
to fail at reading or writing on whichever areas you want it to fail on, or to fail in a controllably random pattern, or basically anything you want.我想详细说明彼得·科德斯的回答。
在 bash 中,使用 ext4 在环回设备上设置一个映像,然后向其中写入一个名为
binary.bin
的文件。在python3中(因为bash很难处理二进制数据)在
binary.bin
中搜索神奇的二进制数据,然后返回bash安装错误的块设备
的文件来测试有故障的块设备
最后,我们可以通过读取产生错误
:完成测试后清理
I would like to elaborate on Peter Cordes answer.
In bash, setup an image on a loopback device with ext4, then write a file to it named
binary.bin
.in python3 (since bash struggles to deal with binary data) search for the magic binary data in
binary.bin
then back in bash mount the faulty block device
finally we can test the faulty block device by reading a file
which produces the error:
clean up when you're done with testing