Да, есть очень вероятный способ сделать это с помощью устройства отображения.
Устройство сопоставления устройств может объединять блочные устройства в новое сопоставление / порядок по вашему выбору. LVM делает это. Он также поддерживает другие цели (некоторые из которых довольно новы), такие как «flakey» для имитации сбойного диска и «error» для имитации сбойных областей диска.
Можно построить устройство, которое намеренно имеет черные дыры ввода-вывода, которые будут сообщать об ошибках ввода-вывода при пересечении.
Сначала создайте виртуальный том для использования в качестве цели и сделайте его адресуемым как блочное устройство.
dd if=/dev/zero of=/var/lib/virtualblock.img bs=512 count=1048576
losetup /dev/loop0 /var/lib/virtualblock.img
Итак, для начала создадим файл 512M, который является основой нашего виртуального блочного устройства, в который мы пробьем «дыру». Хотя дыры пока не существует. Если бы вы были, mkfs.ext4 /dev/loop0
вы бы получили совершенно правильную файловую систему.
Итак, давайте используем dmsetup, который, используя это блочное устройство, создаст новое устройство, в котором есть некоторые дыры. Вот пример первый
dmsetup create errdev0
0 261144 linear /dev/loop0 0
261144 5 error
261149 787427 linear /dev/loop0 261139
Это создаст устройство с именем 'errdev0' (обычно в / dev / mapper). Когда вы печатаете, dmsetup create errdev0
он будет ждать ввода stdin и завершится вводом ^ D.
В приведенном выше примере мы сделали отверстие в 5 секторов (2,5 КБ) в секторах 261144 петлевого устройства. Затем мы продолжаем через устройство петли, как обычно.
Этот скрипт попытается сгенерировать вам таблицу, в которой дырки будут размещаться в случайных местах примерно на 16 Мб (хотя это довольно случайно).
#!/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}"
В сценарии предполагается, что вы также создали устройство объемом 512 МБ и ваше виртуальное блочное устройство включено /dev/loop0
.
Вы можете просто вывести эти данные в текстовый файл в виде таблицы и передать их в dmsetup create errdev0
.
После того как вы создали устройство, вы можете начать использовать его как обычное блочное устройство, сначала отформатировав его, а затем разместив на нем файлы. В какой-то момент вы столкнетесь с некоторыми проблемами ввода-вывода, когда вы сталкиваетесь с секторами, которые действительно являются дырами ввода-вывода в виртуальном устройстве.
Как только вы закончили использовать dmsetup remove errdev0
для удаления устройства.
Если вы хотите повысить вероятность ошибки ввода-вывода, вы можете чаще добавлять отверстия или изменять размер создаваемых отверстий. Обратите внимание, что размещение ошибок в определенных разделах, вероятно, вызовет проблемы с самого начала, т.е. IE на 32 МБ в устройстве, которое вы не можете написать суперблоком, который обычно пытается сделать ext, поэтому формат не будет работать.
Для дополнительного удовольствия - вы можете просто losetup
тогда mkfs.ext4 /dev/loop0
и заполнить его данными. Когда у вас есть хорошая рабочая файловая система, просто размонтируйте файловую систему и добавьте несколько дырок с помощью dmsetup и перемонтируйте это!