Sim, há uma maneira muito plausível de fazer isso com o mapeador de dispositivos.
O mapeador de dispositivo pode recombinar os dispositivos de bloco em um novo mapeamento / ordem de sua escolha. LVM faz isso. Ele também suporta outros alvos, (alguns que são bem novos) como 'flakey' para simular um disco com falha e 'erro' para simular regiões com falha de disco.
Pode-se construir um dispositivo que deliberadamente tenha pontos negros de OI sobre ele, que reportará erros de E / S quando cruzados.
Primeiro, crie um volume virtual para usar como alvo e torne-o endereçável como um dispositivo de bloco.
dd if=/dev/zero of=/var/lib/virtualblock.img bs=512 count=1048576
losetup /dev/loop0 /var/lib/virtualblock.img
Então, para começar, criamos um arquivo de 512M que é a base do nosso dispositivo de bloco virtual, no qual faremos um 'buraco'. Nenhum buraco existe ainda. Se você fosse para mkfs.ext4 /dev/loop0 , você obteria um sistema de arquivos perfeitamente válido.
Então, vamos usar o dmsetup que, usando este dispositivo de bloco, criará um novo dispositivo com alguns buracos. Aqui está um exemplo primeiro
dmsetup create errdev0
0 261144 linear /dev/loop0 0
261144 5 error
261149 787427 linear /dev/loop0 261139
Isto irá criar um dispositivo chamado 'errdev0' (normalmente em / dev / mapper). Quando você digitar dmsetup create errdev0 , ele aguardará stdin e terminará com ^ D sendo inserido.
No exemplo acima, fizemos um furo de 5 setores (2.5kb) nos setores 261144 do dispositivo de loop. Em seguida, continuamos pelo dispositivo de loop normalmente.
Este script tentará gerar uma tabela que colocará buracos em locais aleatórios aproximadamente espalhados em torno de 16Mb (embora seja bastante aleatório).
#!/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}"
O script assume que você também criou um dispositivo de 512Mb e que seu dispositivo de bloco virtual está em /dev/loop0 .
Você pode enviar esses dados para um arquivo de texto como uma tabela e enviá-los para dmsetup create errdev0 .
Depois de criar o dispositivo, você poderá começar a usá-lo como um dispositivo de bloco normal, primeiro formatando-o e, em seguida, colocando os arquivos nele. Em algum momento você deve se deparar com alguns problemas de IO, nos quais você atinge setores que são realmente buracos de IO no dispositivo virtual.
Quando terminar, use dmsetup remove errdev0 para remover o dispositivo.
Se você quiser aumentar a probabilidade de receber um erro de ES, poderá adicionar furos com mais frequência ou alterar o tamanho dos furos criados. Note que colocar erros em certas seções pode causar problemas no início, ou seja, 32E em um dispositivo que você não pode escrever em um superbloco que normalmente tenta fazer, então o formato não funciona ..
Para maior diversão, você pode, na verdade, apenas losetup e mkfs.ext4 /dev/loop0 e preenchê-lo com dados. Uma vez que você tenha um bom sistema de arquivos funcionando, simplesmente desmonte o sistema de arquivos e adicione alguns buracos usando o dmsetup e remonte-o!