Celowo powodować błąd we / wy w systemie Linux?

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?

Dok
źródło
Czy symulujesz awarię dysku? Być może mógłbyś zamontować katalog, a następnie odmontować go, gdy był w użyciu.
Shef,
2
Napiszę mały moduł jądra, który można załadować modprobe, zachowując się jak urządzenie blokowe, a następnie inny mały program, który wysyła ioctl()'sdo sterownika, aby zwrócił odpowiednią wartość.
ott--
To samo pytanie na temat przepełnienia stosu oraz w systemach Unix i Linux .
Gilles „SO- przestań być zły”
Aby śledzić komentarz napisany przez @Gilles, został on również zadany na stackoverflow.com/questions/1361518/... (kilka różnych odpowiedzi na wstrzyknięcie błędów) i stackoverflow.com/questions/1870696/... (użyj mapera urządzeń).
Anon

Odpowiedzi:

54

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 errdev0zaczeka 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 errdev0urzą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 losetupwtedy mkfs.ext4 /dev/loop0i 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!

Matthew Ife
źródło
6
Nie wiedziałem, że możesz to zrobić. Całkiem fajne.
15

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.

$ 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
Raúl Salinas-Monteagudo
źródło
7

Zależy od tego, co chcesz przetestować. Korzystając z LD_PRELOADbiblioteki ed, możesz nakłonić aplikacje do myślenia na przykład: „wszystkie zapisy kończą się niepowodzeniem z ” ENOSPClub EIO”na przykład.

Dennis Kaarsemaker
źródło
1

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.

Jure1873
źródło