Czy w Linuksie jest tak, że celowo powoduje, że urządzenie blokujące zgłasza błąd we / wy, a może symuluje je do celów testowych?
42
Czy w Linuksie jest tak, że celowo powoduje, że urządzenie blokujące zgłasza błąd we / wy, a może symuluje je do celów testowych?
modprobe
, zachowując się jak urządzenie blokowe, a następnie inny mały program, który wysyłaioctl()'s
do sterownika, aby zwrócił odpowiednią wartość.Odpowiedzi:
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.
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
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).
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
wtedymkfs.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!źródło
Do sprawdzania odporności programu na wypadek awarii jego wyjścia można użyć pseudourządzenia
/dev/full
, które zawsze zwraca „ENOSPACE” po zapisaniu do.źródło
Zależy od tego, co chcesz przetestować. Korzystając z
LD_PRELOAD
biblioteki ed, możesz nakłonić aplikacje do myślenia na przykład: „wszystkie zapisy kończą się niepowodzeniem z ”ENOSPC
lubEIO
”na przykład.źródło
Możesz to zrobić na tak wiele interesujących sposobów. Zobacz https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt
źródło
fail_make_request
)? Byłoby również świetnie, aby zapobiec gniciu linków.Może mógłbyś zmienić tablicę partycji i zwiększyć partycję tak, aby była naprawdę. To prawdopodobnie spowodowałoby błąd we / wy. Lub jeśli twoje dyski można podłączyć na gorąco, możesz po prostu wyciągnąć jeden.
źródło