¿Hay alguna forma, con Linux, de hacer que un dispositivo de bloque informe intencionalmente un error de E / S, o posiblemente simule uno para propósitos de prueba?
42
¿Hay alguna forma, con Linux, de hacer que un dispositivo de bloque informe intencionalmente un error de E / S, o posiblemente simule uno para propósitos de prueba?
modprobe
, comportándose como un dispositivo de bloque, y luego otro pequeño programa que se envíaioctl()'s
al controlador para que devuelva el valor que desea.Respuestas:
Sí, hay una forma muy plausible de hacer esto con el mapeador de dispositivos.
El mapeador de dispositivos puede recombinar dispositivos de bloque en un nuevo mapeo / orden de su elección. LVM hace esto. También admite otros objetivos, (algunos que son bastante novedosos) como 'flakey' para simular un disco defectuoso y 'error' para simular regiones fallidas del disco.
Se puede construir un dispositivo que deliberadamente tenga agujeros negros de E / S que informará errores de E / S cuando se crucen.
Primero, cree un volumen virtual para usar como objetivo y haga que sea direccionable como un dispositivo de bloque.
Entonces, para comenzar, se crea un archivo de 512M que es la base de nuestro dispositivo de bloque virtual en el que perforaremos un 'agujero'. Sin embargo, todavía no existe un agujero. Si fuera
mkfs.ext4 /dev/loop0
así, obtendría un sistema de archivos perfectamente válido.Entonces, usemos dmsetup que, usando este dispositivo de bloque, creará un nuevo dispositivo que tiene algunos agujeros. Aquí hay un ejemplo primero
Esto creará un dispositivo llamado 'errdev0' (generalmente en / dev / mapper). Cuando escriba
dmsetup create errdev0
, esperará la entrada estándar y finalizará cuando se ingrese ^ D.En el ejemplo anterior, hemos realizado un agujero de 5 sectores (2.5kb) en los sectores 261144 del dispositivo de bucle. Luego continuamos a través del dispositivo de bucle como de costumbre.
Este script intentará generar una tabla que colocará agujeros en ubicaciones aleatorias aproximadamente distribuidas alrededor de 16Mb (aunque es bastante aleatorio).
El script asume que también ha creado un dispositivo de 512Mb y que su dispositivo de bloque virtual está encendido
/dev/loop0
.Puede simplemente enviar estos datos a un archivo de texto como una tabla y canalizarlos
dmsetup create errdev0
.Una vez que haya creado el dispositivo, puede comenzar a usarlo como un dispositivo de bloque normal, primero formateándolo y luego colocando archivos en él. En algún momento, deberías encontrarte con algunos problemas de E / S en los que golpeas sectores que realmente son agujeros de E / S en el dispositivo virtual.
Una vez que haya terminado de usar
dmsetup remove errdev0
para eliminar el dispositivo.Si desea que sea más probable que obtenga un error de E / S, puede agregar agujeros con más frecuencia o cambiar el tamaño de los agujeros que cree. Tenga en cuenta que colocar errores en ciertas secciones puede causar problemas desde el primer momento, es decir, a 32mb en un dispositivo que no puede escribir un superbloque que ext normalmente intenta hacer, por lo que el formato no funcionará.
Para mayor diversión, puede hacerlo en
losetup
ese momentomkfs.ext4 /dev/loop0
y llenarlo con datos. Una vez que tenga un buen sistema de archivos en funcionamiento, simplemente desmonte el sistema de archivos y agregue algunos agujeros usando dmsetup y vuelva a montar eso.fuente
Para verificar la solidez del programa en caso de que su salida falle, puede usar el pseudodispositivo
/dev/full
, que siempre devuelve "ENOSPACE" cuando se escribe en él.fuente
Depende de lo que quieras probar. Usando una
LD_PRELOAD
biblioteca ed, puedes engañar a las aplicaciones para que piensen cosas como 'todas las escrituras fallan conENOSPC
oEIO
' por ejemplo.fuente
Puedes hacerlo de muchas maneras interesantes. Ver https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt
fuente
fail_make_request
)? También sería genial para evitar la pudrición del enlace.Tal vez podría cambiar la tabla de particiones y hacer que la partición sea más grande de lo que realmente es. Eso probablemente causaría un error de E / S. O si sus discos son conectables en caliente, simplemente puede sacar uno.
fuente