Sim, há uma maneira muito plausível de fazer isso com o mapeador de dispositivos.
O mapeador de dispositivos pode recombinar os dispositivos de bloco para um novo mapeamento / ordem de sua escolha. O LVM faz isso. Ele também suporta outros destinos (alguns que são bastante novos) como 'flakey' para simular um disco com falha e 'erro' para simular regiões com falha no disco.
Pode-se construir um dispositivo que deliberadamente possua trincas de E / S que reportem erros de E / S quando cruzados.
Primeiro, crie algum volume virtual para usar como destino 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
Portanto, para começar, cria um arquivo de 512M que é a base do nosso dispositivo de bloco virtual no qual perfuraremos um 'buraco'. Ainda não existe um buraco. Se você fosse, mkfs.ext4 /dev/loop0
obteria um sistema de arquivos perfeitamente válido.
Então, vamos usar o dmsetup que, usando este dispositivo de bloco - criará um novo dispositivo que possui alguns furos. Aqui está um exemplo primeiro
dmsetup create errdev0
0 261144 linear /dev/loop0 0
261144 5 error
261149 787427 linear /dev/loop0 261139
Isso criará um dispositivo chamado 'errdev0' (normalmente em / dev / mapper). Quando você digita, dmsetup create errdev0
ele espera stdin e termina com a entrada de ^ D.
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 para 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 supõe que você também criou um dispositivo de 512 Mb e que seu dispositivo de bloco virtual está ativado /dev/loop0
.
Você pode simplesmente enviar esses dados para um arquivo de texto como uma tabela e inseri-los 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 depois colocando arquivos nele. Em algum momento, você deve encontrar alguns problemas de E / S nos quais atinge setores que realmente são buracos de E / S no dispositivo virtual.
Depois de terminar, use dmsetup remove errdev0
para remover o dispositivo.
Se você deseja aumentar a probabilidade de obter um erro de E / S, pode adicionar orifícios com mais frequência ou alterar o tamanho dos orifícios criados. Observe que colocar erros em determinadas seções provavelmente causará problemas desde o início, ou seja, a 32mb em um dispositivo que você não pode escrever um superbloco que o ext normalmente tenta, portanto o formato não funcionará.
Para maior diversão - você pode realmente apenas losetup
então mkfs.ext4 /dev/loop0
e preenchê-lo com dados. Depois de ter um bom sistema de arquivos em funcionamento, desmonte o sistema de arquivos e adicione alguns furos usando o dmsetup e remonte-o!