Causare intenzionalmente un errore I / O in Linux?


42

Esiste comunque, con Linux, causare intenzionalmente un dispositivo a blocchi per segnalare un errore I / O o eventualmente simularne uno a scopo di test?


Stai simulando un errore del disco? Forse potresti montare una directory e poi smontarla mentre era in uso.
Shef,

2
Scriverei un piccolo modulo del kernel che potresti caricare modprobe, comportandomi come un dispositivo a blocchi, e poi un altro piccolo programma che invia ioctl()'sal driver per farlo restituire il valore desiderato.
ott--


Per dare seguito al commento fatto da @Gilles, questo è stato chiesto anche su stackoverflow.com/questions/1361518/… (diverse risposte sull'iniezione di errori) e stackoverflow.com/questions/1870696/… (usa il mappatore del dispositivo).
Anon,

Risposte:


54

Sì, esiste un modo molto plausibile per farlo con Device Mapper.

Il mappatore dei dispositivi può ricombinare i dispositivi a blocchi in un nuovo mapping / ordine di tua scelta. LVM fa questo. Supporta anche altri target (alcuni piuttosto innovativi) come "flakey" per simulare un disco guasto e "errore" per simulare regioni del disco guaste.

Si può costruire un dispositivo che deliberatamente ha buchi neri IO su di esso che segnalerà errori IO quando attraversati.

Innanzitutto, crea un volume virtuale da utilizzare come destinazione e rendilo indirizzabile come dispositivo a blocchi.

dd if=/dev/zero of=/var/lib/virtualblock.img bs=512 count=1048576
losetup /dev/loop0 /var/lib/virtualblock.img

Quindi, per iniziare questo crea un file da 512 M che è la base del nostro dispositivo a blocchi virtuali in cui punteremo un 'buco'. Tuttavia, non esiste ancora alcun buco. Se dovessi mkfs.ext4 /dev/loop0, otterrai un filesystem perfettamente valido.

Quindi, usiamo dmsetup che, usando questo dispositivo a blocchi, creerà un nuovo dispositivo con alcuni buchi. Ecco un esempio per primo

dmsetup create errdev0
0 261144 linear /dev/loop0 0
261144 5 error
261149 787427 linear /dev/loop0 261139

Questo creerà un dispositivo chiamato 'errdev0' (in genere in / dev / mapper). Durante la digitazione dmsetup create errdev0attenderà lo stdin e terminerà con ^ D immesso.

Nell'esempio sopra, abbiamo realizzato un foro a 5 settori (2.5kb) nei settori 261144 del dispositivo ad anello. Quindi continuiamo attraverso il dispositivo loop come di consueto.

Questo script tenterà di generare una tabella che posizionerà buchi in posizioni casuali approssimativamente distribuite intorno a 16 Mb (sebbene sia piuttosto casuale).

#!/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}"

Lo script presuppone che tu abbia anche creato un dispositivo da 512 Mb e che il tuo dispositivo di blocco virtuale sia acceso /dev/loop0.

Puoi semplicemente generare questi dati in un file di testo come una tabella e inoltrarli dmsetup create errdev0.

Dopo aver creato il dispositivo, puoi iniziare a usarlo come un normale dispositivo a blocchi, prima formattandolo e quindi posizionando i file su di esso. Ad un certo punto dovresti incontrare alcuni problemi di I / O in cui colpisci settori che sono veramente buchi di I / O nel dispositivo virtuale.

Una volta terminato, utilizzare dmsetup remove errdev0per rimuovere il dispositivo.

Se si desidera aumentare la probabilità che si verifichi un errore I / O, è possibile aggiungere fori più frequentemente o modificare le dimensioni dei fori creati. Nota che mettere errori in alcune sezioni può causare problemi al di fuori di tutto, IE a 32 MB in un dispositivo che non puoi scrivere un superblocco che ext normalmente cerca di fare, quindi il formato non funzionerà.

Per ulteriore divertimento, puoi effettivamente in quel losetupmomento mkfs.ext4 /dev/loop0riempirlo di dati. Una volta che hai un bel filesystem funzionante lì, semplicemente smonta il filesystem e aggiungi alcuni buchi usando dmsetup e rimontalo!


6
Non sapevo che potessi farlo. Abbastanza bello

15

Per verificare la solidità del programma nel caso in cui il loro output non riesca, è possibile utilizzare lo pseudodispositivo /dev/full, che restituisce sempre "ENOSPACE" quando viene scritto.

$ dd if=/dev/zero of=/dev/full
dd: writing to `/dev/full': No space left on device
1+0 records in
0+0 records out

7

Dipende da cosa vuoi testare. Usando una LD_PRELOADlibreria ed, puoi indurre le applicazioni a pensare cose come "tutte le scritture falliscono ENOSPCo EIO" per esempio.



1

Forse potresti cambiare la tabella delle partizioni e ingrandirla di più. Ciò probabilmente causerebbe un errore I / O. O se i tuoi dischi sono inseribili a caldo, puoi semplicemente estrarne uno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.