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 errdev0
attenderà 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 errdev0
per 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 losetup
momento mkfs.ext4 /dev/loop0
riempirlo di dati. Una volta che hai un bel filesystem funzionante lì, semplicemente smonta il filesystem e aggiungi alcuni buchi usando dmsetup e rimontalo!