#!/bin/bash
start_sector=0
good_sector_size=0
for sector in {0..1048576}; do
if [[ ${RANDOM} == 0 ]]; then
echo "${start_sector} ${good_sector_size} linear /dev/loop0 ${start_sector}"
echo "${sector} 1 error"
start_sector=$((${sector}+1))
good_sector_size=0
else
good_sector_size=$((${good_sector_size}+1))
fi
done
echo "${start_sector} $((${good_sector_size}-1)) linear /dev/loop0 ${start_sector}"
是的,有一种非常合理的方法可以使用设备映射器来执行此操作。
设备映射器可以将块设备重新组合成您选择的新映射/顺序。LVM 就是这样做的。它还支持其他目标(有些非常新颖),例如模拟故障磁盘的“flakey”和模拟磁盘故障区域的“错误”。
可以构建一个故意在其上设置 IO 黑洞的设备,当越过时会报告 IO 错误。
首先,创建一些虚拟卷用作目标并使其作为块设备可寻址。
因此,首先创建一个 512M 的文件,它是我们的虚拟块设备的基础,我们将在其中打一个“洞”。不过目前还没有洞。如果你这样做,
mkfs.ext4 /dev/loop0
你会得到一个完全有效的文件系统。所以,让我们使用 dmsetup,它使用这个块设备——将创建一个有一些漏洞的新设备。这里先举个例子
这将创建一个名为“errdev0”的设备(通常在 /dev/mapper 中)。当您键入
dmsetup create errdev0
时,它将等待 stdin 并在输入 ^D 时完成。在上面的示例中,我们在循环设备的扇区 261144 处创建了一个 5 扇区孔 (2.5kb)。然后我们照常继续通过循环设备。
该脚本将尝试为您生成一个表,该表将在随机位置放置孔,大约分布在 16Mb 左右(尽管它非常随机)。
该脚本假定您还创建了一个 512Mb 的设备并且您的虚拟块设备处于打开状态
/dev/loop0
。您可以将此数据作为表格输出到文本文件,然后将其通过管道传输到
dmsetup create errdev0
.一旦你创建了设备,你就可以像普通的块设备一样开始使用它了,首先是格式化它,然后在上面放置文件。在某些时候,您应该遇到一些 IO 问题,您遇到的扇区实际上是虚拟设备中的 IO 漏洞。
完成使用
dmsetup remove errdev0
后移除设备。如果你想让它更有可能出现 IO 错误,你可以更频繁地添加孔或更改你创建的孔的大小。请注意,在某些部分中放置错误可能会导致一开始就出现问题,将 32mb 的 IE 放入您无法编写 ext 通常会尝试执行的超级块的设备中,因此该格式将无法工作。
为了增加乐趣——你实际上可以就在
losetup
那时mkfs.ext4 /dev/loop0
用数据填充它。一旦你在那里有了一个很好的工作文件系统,只需卸载文件系统并使用 dmsetup 添加一些漏洞并重新安装它!为了在输出失败时检查程序的健壮性,您可以使用伪设备
/dev/full
,它在写入时总是返回“ENOSPACE”。取决于你想测试什么。使用
LD_PRELOAD
ed 库,您可以诱使应用程序思考诸如“所有写入都因ENOSPC
or失败EIO
”之类的事情。您可以通过许多有趣的方式来做到这一点。请参阅https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt
也许您可以更改分区表并使分区比实际更大。这可能会导致 i/o 错误。或者,如果您的磁盘是可热插拔的,您可以只拔出一个。