Frage Absichtlich einen E / A-Fehler in Linux verursachen?


Gibt es unter Linux trotzdem die Absicht, absichtlich ein Blockgerät dazu zu veranlassen, einen E / A-Fehler zu melden oder möglicherweise einen zu Testzwecken zu simulieren?


40
2018-04-12 20:15


Ursprung


Simulieren Sie einen Festplattenfehler? Vielleicht könnten Sie ein Verzeichnis mounten und es dann aushängen, während es in Benutzung war. - Shef
Ich würde ein kleines Kernel-Modul schreiben, mit dem du laden könntest modprobe, benimmt sich wie ein Block-Gerät, und dann ein anderes kleines Programm, das sendet ioctl()'s an den Fahrer, damit er den gewünschten Wert zurückgibt. - ott--
Gleiche Frage an Stapelüberlauf und weiter Unix und Linux. - Gilles
Um den Kommentar @Gilles zu verfolgen, wurde dies auch gefragt stackoverflow.com/questions/1361518/... (mehrere verschiedene Fehlerinjektionsantworten) und stackoverflow.com/questions/1870696/... (Geräte-Mapper verwenden). - Anon


Antworten:


Ja, es gibt eine sehr plausible Möglichkeit, dies mit Device Mapper zu tun.

Der Geräte-Mapper kann Block-Geräte zu einer neuen Zuordnung / Reihenfolge Ihrer Wahl rekombinieren. LVM macht das. Es unterstützt auch andere Ziele (von denen einige recht neu sind) wie "flakey", um eine fehlerhafte Platte zu simulieren, und "error", um fehlerhafte Plattenbereiche zu simulieren.

Man kann ein Gerät konstruieren, das IO-Schwarze Löcher hat, die beim Überfahren IO-Fehler melden.

Erstellen Sie zunächst ein virtuelles Volume, das als Ziel verwendet werden soll, und machen Sie es als Blockgerät adressierbar.

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

Um dies zu starten, wird eine 512M-Datei erstellt, die die Basis für unser virtuelles Block-Gerät ist, in das wir ein "Loch" einbringen werden. Es existiert jedoch noch kein Loch. Wenn es so wäre mkfs.ext4 /dev/loop0 Sie würden ein perfekt gültiges Dateisystem bekommen.

Also, lasst uns dmsetup verwenden, das mit diesem Block-Gerät ein neues Gerät erstellt, das einige Lücken hat. Hier ist ein Beispiel zuerst

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

Dadurch wird ein Gerät namens 'errdev0' (normalerweise in / dev / mapper) erstellt. Wenn Sie tippen dmsetup create errdev0 es wartet auf stdin und endet mit der Eingabe von ^ D.

Im obigen Beispiel haben wir ein 5-Sektor-Loch (2,5 kB) in den Sektoren 261144 des Loop-Geräts erstellt. Wir fahren dann wie gewohnt durch das Loop-Gerät.

Dieses Skript wird versuchen, Ihnen eine Tabelle zu generieren, die Löcher an zufälligen Orten mit ungefähr 16 MB verteilt (obwohl es ziemlich zufällig ist).

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

Das Skript geht davon aus, dass Sie auch ein 512 MB-Gerät erstellt haben und dass Ihr virtuelles Blockgerät eingeschaltet ist /dev/loop0.

Sie können diese Daten einfach in eine Textdatei als Tabelle ausgeben und in diese hineinleiten dmsetup create errdev0.

Sobald Sie das Gerät erstellt haben, können Sie es wie ein normales Blockgerät verwenden, indem Sie es zunächst formatieren und dann darauf ablegen. Irgendwann sollten Sie auf IO-Probleme stoßen, bei denen Sie Sektoren treffen, die wirklich IO-Löcher im virtuellen Gerät sind.

Sobald Sie die Verwendung beendet haben dmsetup remove errdev0 um das Gerät zu entfernen.

Wenn Sie die Wahrscheinlichkeit erhöhen möchten, dass ein IO-Fehler auftritt, können Sie häufiger Löcher hinzufügen oder die Größe der von Ihnen erstellten Bohrungen ändern. Beachten Sie Putting Fehler in bestimmten Abschnitten wird wahrscheinlich Probleme aus dem Get-Go, IE bei 32MB in ein Gerät können Sie einen Superblock schreiben, die ext normalerweise versucht zu tun, so dass das Format wird nicht funktionieren ..

Für zusätzlichen Spaß - Sie können eigentlich nur losetup dann mkfs.ext4 /dev/loop0 und fülle es mit Daten. Sobald Sie ein nettes funktionierendes Dateisystem dort haben, unmounten Sie einfach das Dateisystem und fügen Sie einige Löcher mit dmsetup hinzu und montieren Sie das!


50
2018-04-12 22:33



Ich wusste nicht, dass du das tun kannst. Ziemlich cool. - kce


Um die Robustheit des Programms zu überprüfen, falls ihre Ausgabe fehlschlägt, können Sie das Pseudo-Gerät verwenden /dev/full, die beim Schreiben immer "ENOSPACE" zurückgibt.

$ 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

13
2018-04-12 21:58





Hängt davon ab, was Sie testen möchten. Mit einem LD_PRELOADed-Bibliothek können Sie Anwendungen dazu verleiten, Dinge zu denken, wie "alle Schreibvorgänge scheitern" ENOSPCoder EIO' zum Beispiel.


6
2018-04-12 20:46





Das kannst du auf so viele interessante Arten machen. Sehen https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt


5
2018-04-12 22:56



Können Sie die relevanten "interessanten" Möglichkeiten hervorheben, die spezifisch für Festplattenanforderungen sind (fail_make_request) Wäre auch toll, Linkfäule zu verhindern. - Deer Hunter


Vielleicht könnten Sie die Partitionstabelle ändern und die Partition so vergrößern, wie sie wirklich ist. Das würde wahrscheinlich einen E / A-Fehler verursachen. Oder wenn Ihre Festplatten hot-plug-fähig sind, können Sie einfach einen herausziehen.


0
2018-04-12 21:01