Existe alguma maneira, com o Linux, de fazer com que um dispositivo de bloco intencionalmente relate um erro de E / S ou simule um para fins de teste?
42
Existe alguma maneira, com o Linux, de fazer com que um dispositivo de bloco intencionalmente relate um erro de E / S ou simule um para fins de teste?
modprobe
, comportando-se como um dispositivo de bloco e, em seguida, outro pequeno programa enviadoioctl()'s
ao driver para fazer com que ele retornasse o valor desejado.Respostas:
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.
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
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).
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ãomkfs.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!fonte
Para verificar a robustez do programa, caso sua saída falhe, você pode usar o pseudodispositivo
/dev/full
, que sempre retorna "ENOSPACE" quando gravado em.fonte
Depende do que você deseja testar. Usando uma
LD_PRELOAD
biblioteca ed, você pode induzir os aplicativos a pensar em coisas como 'todas as gravações falhamENOSPC
ouEIO
', por exemplo.fonte
Você pode fazer isso de muitas maneiras interessantes. Consulte https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt
fonte
fail_make_request
)? Também seria ótimo para evitar a podridão do link.Talvez você possa alterar a tabela de partições e torná-la maior do que realmente é. Isso provavelmente causaria um erro de E / S. Ou, se seus discos estiverem conectáveis a quente, você pode simplesmente puxá-lo para fora.
fonte