Tak, istnieje bardzo prawdopodobny sposób, aby to zrobić za pomocą mapera urządzeń.
Maper urządzeń może zrekombinować urządzenia blokowe w nowe wybrane przez siebie mapowanie / kolejność. LVM to robi. Obsługuje także inne obiekty docelowe (niektóre z nich są dość nowatorskie), takie jak „płatkowaty”, aby symulować awarię dysku i „błąd”, aby symulować uszkodzone obszary dysku.
Można zbudować urządzenie, które celowo ma czarne dziury IO, które będą zgłaszać błędy IO po przekroczeniu.
Najpierw utwórz wolumin wirtualny, który będzie używany jako cel i uczyń go adresowalnym jako urządzenie blokowe.
dd if=/dev/zero of=/var/lib/virtualblock.img bs=512 count=1048576
losetup /dev/loop0 /var/lib/virtualblock.img
Tak więc, aby rozpocząć, tworzy plik 512M, który jest podstawą naszego wirtualnego urządzenia blokowego, w którym wybijamy „dziurę”. Jednak nie ma jeszcze dziury. Gdybyś był mkfs.ext4 /dev/loop0
, uzyskałbyś całkowicie poprawny system plików.
Wykorzystajmy więc dmsetup, który używając tego urządzenia blokowego - utworzy nowe urządzenie, które ma w nim dziury. Oto pierwszy przykład
dmsetup create errdev0
0 261144 linear /dev/loop0 0
261144 5 error
261149 787427 linear /dev/loop0 261139
Spowoduje to utworzenie urządzenia o nazwie „errdev0” (zazwyczaj w / dev / mapper). Po wpisaniu dmsetup create errdev0
zaczeka na wejście standardowe i zakończy się po wprowadzeniu ^ D.
W powyższym przykładzie wykonaliśmy otwór 5-sektorowy (2,5 kb) w sektorach 261144 urządzenia pętli. Następnie normalnie kontynuujemy przechodzenie przez urządzenie pętli.
Ten skrypt spróbuje wygenerować tabelę, która będzie umieszczać dziury w losowych lokalizacjach w przybliżeniu rozłożonych wokół 16 Mb (choć jest dość losowa).
#!/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}"
Skrypt zakłada, że utworzyłeś również urządzenie 512 Mb i że wirtualne urządzenie blokujące jest włączone /dev/loop0
.
Możesz po prostu wyprowadzić te dane do pliku tekstowego jako tabelę i podłączyć do niego potok dmsetup create errdev0
.
Po utworzeniu urządzenia możesz zacząć używać go jak zwykłego urządzenia blokowego, najpierw formatując je, a następnie umieszczając na nim pliki. W pewnym momencie powinieneś natknąć się na pewne problemy IO, w których trafiasz na sektory, które są naprawdę dziurami IO w urządzeniu wirtualnym.
Po zakończeniu użyj dmsetup remove errdev0
urządzenia do usunięcia.
Jeśli chcesz zwiększyć prawdopodobieństwo wystąpienia błędu we / wy, możesz częściej dodawać otwory lub zmieniać rozmiar tworzonych otworów. Uwaga: umieszczanie błędów w niektórych sekcjach może powodować problemy od samego początku, tj. Przy 32 MB na urządzeniu, którego nie można napisać superbloku, który ext zwykle próbuje zrobić, więc format nie będzie działał.
Dla dodatkowej zabawy - możesz właśnie losetup
wtedy mkfs.ext4 /dev/loop0
i wypełnić je danymi. Kiedy już będziesz mieć ładny działający system plików, po prostu odmontuj system plików i dodaj kilka dziur za pomocą dmsetup i zamontuj to!