如何在测试期间模拟故障磁盘?

Mar*_*rkR 27 linux testing io scsi disk

在Linux VM(Vmware工作站或类似工具)中,如何模拟以前工作的光盘上的故障?

我在生产中遇到光盘发生故障(可能是控制器,电缆或固件问题)的情况.显然这是不可预测或可重现的,我想测试我的监控,以确保它正确警报.

理想情况下,我希望能够模拟写入失败但成功读取的情况,以及完全失败,即scsi接口将错误报告给内核.

mar*_*k4o 26

有几个层可以模拟磁盘错误.如果您正在测试单个用户空间程序,可能最简单的方法是插入适当的调用(例如write())并让它们有时返回错误.该libfiu故障注入图书馆可以做到这一点使用其fiu-run工具.

另一种方法是使用可以向/从另一个设备传递数据的内核驱动程序,但是沿途注入错误.然后,您可以挂载设备并在任何应用程序中使用它,就像它是一个有故障的磁盘一样.该fsdisk驱动程序是这样的一个例子.

还有一个故障注入基础结构已合并到Linux内核中,但您可能需要重新配置内核才能启用它.它记录在Documentation/fault-injection/fault-injection.txt中.这对于测试内核代码很有用.

也可以使用SystemTap在内核级别注入故障.请参阅使用SystemTap进行SCSI故障注入测试内核故障注入.


Ano*_*non 6

要添加到mark4o的答案,您还可以使用Linux的Device Mapper生成失败的设备.

Device Mapper的延迟设备可用于将同一块的读写I/O发送到不同的底层设备(它也可以根据其名称延迟I/O).Device Mapper的错误设备可用于在访问特定块时生成永久性错误.通过组合这两者,您可以创建一个设备,其中写入始终失败但读取始终对给定区域成功.

以上是模拟具有读取错误的故障块设备的问题中描述的更复杂的示例(有关简单的Device Mapper示例,请参阅/sf/answers/130972061/).

还有一个的Linux磁盘故障注入机制名单,导致I/O错误的特殊文件的Unix和Linux的问题.


caf*_*caf 5

使 SCSI 磁盘在 2.6 内核中消失的一个简单方法是:

echo 1 > /sys/bus/scsi/devices/H:B:T:L/delete
Run Code Online (Sandbox Code Playgroud)

(H:B:T:L 是主机、总线、目标、LUN)。不过,要模拟只读情况,您必须使用 mark4o 提到的错误注入方法。