Gibt es unter Linux überhaupt die Möglichkeit, ein Block-Gerät absichtlich dazu zu bringen, einen E / A-Fehler zu melden oder zu Testzwecken zu simulieren?
42
Gibt es unter Linux überhaupt die Möglichkeit, ein Block-Gerät absichtlich dazu zu bringen, einen E / A-Fehler zu melden oder zu Testzwecken zu simulieren?
modprobe
, das sich wie ein Blockgerät verhält, und dann ein anderes kleines Programm, dasioctl()'s
an den Treiber sendet , damit es den gewünschten Wert zurückgibt.Antworten:
Ja, es gibt eine sehr plausible Möglichkeit, dies mit Device Mapper zu tun.
Der Geräte-Mapper kann Blockgeräte in einer neuen Zuordnung / Reihenfolge Ihrer Wahl neu kombinieren. LVM macht das. Es werden auch andere Ziele (von denen einige recht neu sind) unterstützt, z. B. "Flakey" zum Simulieren einer fehlerhaften Festplatte und "Error" zum Simulieren fehlerhafter Festplattenregionen.
Man kann ein Gerät bauen, das absichtlich IO-Blackholes hat, die IO-Fehler melden, wenn sie gekreuzt werden.
Erstellen Sie zunächst ein virtuelles Volume, das als Ziel verwendet werden soll, und machen Sie es als Blockgerät adressierbar.
Um dies zu starten, erstellen wir eine 512-MB-Datei, die die Grundlage für unser virtuelles Block-Gerät ist und in die wir ein 'Loch' stecken. Es ist jedoch noch kein Loch vorhanden. Wenn Sie es
mkfs.ext4 /dev/loop0
wären, würden Sie ein perfekt gültiges Dateisystem erhalten.Verwenden wir also dmsetup, das mit diesem Blockgerät ein neues Gerät erstellt, das einige Lücken aufweist. Hier ist zuerst ein Beispiel
Dadurch wird ein Gerät mit dem Namen 'errdev0' erstellt (normalerweise in / dev / mapper). Bei
dmsetup create errdev0
der Eingabe wird auf stdin gewartet und die Eingabe von ^ D beendet.Im obigen Beispiel haben wir in den Sektoren 261144 des Loop-Geräts ein Loch mit 5 Sektoren (2,5 KB) erstellt. Wir fahren dann wie gewohnt mit dem Loop-Gerät fort.
Dieses Skript wird versuchen, eine Tabelle zu generieren, die Löcher an zufälligen Stellen platziert, die ungefähr 16 MB groß sind (obwohl es ziemlich zufällig ist).
Das Skript geht davon aus, dass Sie auch ein 512-MB-Gerät erstellt haben und Ihr virtuelles Blockgerät eingeschaltet ist
/dev/loop0
.Sie können diese Daten einfach als Tabelle in eine Textdatei ausgeben und in diese umleiten
dmsetup create errdev0
.Nachdem Sie das Gerät erstellt haben, können Sie es wie ein normales Blockgerät verwenden, indem Sie es zuerst formatieren und dann Dateien darauf ablegen. Irgendwann sollten Sie auf einige E / A-Probleme stoßen, bei denen Sie auf Sektoren stoßen, die wirklich E / A-Lücken im virtuellen Gerät aufweisen.
Sobald Sie fertig sind
dmsetup remove errdev0
, entfernen Sie das Gerät.Wenn Sie die Wahrscheinlichkeit erhöhen möchten, dass ein E / A-Fehler auftritt, können Sie häufiger Löcher hinzufügen oder die Größe der von Ihnen erstellten Löcher ändern. Beachten Sie, dass das Versetzen von Fehlern in bestimmte Abschnitte wahrscheinlich Probleme auf Anhieb verursachen kann. IE bei 32 MB in einem Gerät, für das Sie keinen Superblock schreiben können, was ext normalerweise versucht, sodass das Format nicht funktioniert.
Für zusätzlichen Spaß - Sie können es tatsächlich nur
losetup
dannmkfs.ext4 /dev/loop0
und mit Daten füllen. Wenn Sie ein funktionierendes Dateisystem haben, heben Sie das Dateisystem einfach auf und fügen Sie mit dmsetup einige Lücken hinzu. Hängen Sie das wieder ein!quelle
Um die Robustheit des Programms zu überprüfen, falls die Ausgabe fehlschlägt, können Sie das
/dev/full
Pseudo-Device verwenden, das beim Schreiben immer "ENOSPACE" zurückgibt.quelle
Hängt davon ab, was Sie testen möchten. Mithilfe einer
LD_PRELOAD
ed-Bibliothek können Sie Anwendungen dazu verleiten, beispielsweise zu denken, dass alle Schreibvorgänge mitENOSPC
oder fehlschlagenEIO
.quelle
Sie können das auf so viele interessante Arten tun. Siehe https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt
quelle
fail_make_request
)? Wäre auch toll, Linkfäule zu verhindern.Vielleicht könnten Sie die Partitionstabelle ändern und die Partition größer machen, als sie wirklich ist. Das würde wahrscheinlich einen I / O-Fehler verursachen. Oder wenn Ihre Festplatten Hot-Plug-fähig sind, können Sie einfach eine herausziehen.
quelle