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.
dd if=/dev/zero of=/var/lib/virtualblock.img bs=512 count=1048576
losetup /dev/loop0 /var/lib/virtualblock.img
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
dmsetup create errdev0
0 261144 linear /dev/loop0 0
261144 5 error
261149 787427 linear /dev/loop0 261139
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).
#!/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 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
dann mkfs.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!