GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Spezielle Datei, die E/A-Fehler verursacht

Auf Stack Overflow und Server Fault gibt es bereits viele Antworten darauf, aber einige Techniken haben gefehlt. Um Ihnen das Leben zu erleichtern, finden Sie hier eine Liste von VM/Linux-Blockgeräten/Linux-Dateisystemen/Linux-Userspace-Bibliotheks-E/A-Fehlerinjektionsmechanismen:

  • Verwenden Sie die error/flakey/delay/dm-dust-Geräte von Device Mapper, um Fehler/Beschädigungen von einem synthetisierten Blockgerät zurückzugeben oder E/A zu verzögern/aufzuteilen (Kernel, erfordert, dass der Kernel mit Device-Mapper-Unterstützung erstellt wurde, geeignetes zusätzliches Gerät Mapper-Module (dm-dust ist nur auf Kernel>=5.2 verfügbar) und Geräte-Mapper-Userspace-Bits zu haben).
  • Verwenden Sie die fehlerhafte Persönlichkeit von md, um eine periodische Fehlerinjektion auf einem synthetisierten Blockgerät durchzuführen. Siehe --layout Option der Manpage von mdadm für die Konfiguration (Kernel- und mdadm-Userspace-Bits).
  • Verwenden Sie libfiu, um eine Fehlerinjektion bei POSIX-API-Aufrufen durchzuführen (Userspace, kann mit LD_PRELOAD verwendet werden ).
  • Verwenden Sie den Fehlerinjektor des Linux-Kernels, um einen Fehler in das zugrunde liegende Blockgerät einzufügen (Kernel, erfordert, dass der Kernel mit FAIL_MAKE_REQUEST=y erstellt wurde ).
  • Die Verwendung von SystemTap zur Fehlerinjektion (Kernel, erfordert, dass ein Kernel mit viel Zeug gebaut wurde).
  • Injizieren Sie Dateisystemfehler mit CharybdeFS oder PetardFS (Userspace über FUSE).
  • Erstellen Sie ein synthetisiertes Blockgerät mit dem Linux-Treiber scsi_debug, der die Fehlerinjektion durchführt (Kernel).
  • Lassen Sie Ihr System innerhalb von QEMU laufen und verwenden Sie QEMU, um Blockgerätfehler mit dem blkdebug-Treiber (VM) einzufügen.
  • Erstellen Sie ein synthetisiertes Blockgerät über die Optionen des null_blk-Geräts zum Einfügen von Fehlern (Kernel>=4.14, aber Optionen wie Timeout-Wahrscheinlichkeiten kamen erst mit 4.17 und erfordern, dass der Kernel mit BLK_DEV_NULL_BLK_FAULT_INJECTION=y erstellt wurde ).
  • Erstellen Sie ein synthetisiertes Netzwerkblockgerät, das dem Host über NBDkit-Filter wie delay bereitgestellt wird oder error und dann über nbd-client ein Blockgerät daran anhängen (Kernel + NBD-Userspace-Bits, Kernel>=4.18 mit NBD-Unterstützung erstellt, nbdclient>=3.18 und nbdkit>=1.8.1 empfohlen - siehe NBDKit-Demovideo um die 20-Minuten-Marke).

Bonus-Fakt:SQLite verfügt über einen VFS-Treiber zum Simulieren von Fehlern, sodass eine gute Testabdeckung erzielt werden kann.

Verwandte:

  • Wie kann ich beim Testen eine ausgefallene Festplatte simulieren?
  • Ein fehlerhaftes Blockgerät mit Lesefehlern simulieren?
  • Lesefehler generieren
  • Absichtlich einen E/A-Fehler unter Linux verursachen?

Sie können dmsetup verwenden zum Erstellen eines Device-Mapper-Geräts entweder mit error oder flakey Ziele, um Ausfälle zu simulieren.

dmsetup create test --table '0 123 flakey 1 0 /dev/loop0'

Dabei ist 123 die Länge des Geräts in Sektoren und /dev/loop0 das Originalgerät, auf dem Sie Fehler simulieren möchten. Für error brauchen Sie die nachfolgenden Argumente nicht, da es immer einen Fehler zurückgibt.


Sie möchten einen Fehlerinjektionsmechanismus für I/O.

Unter Linux ist hier eine Methode, die keine vorherige Einrichtung erfordert und einen ungewöhnlichen Fehler generiert (nicht EIO „Input/output error“, sondern ESRCH „No such process“):

cat /proc/1234/mem

Dabei ist 1234 die PID eines Prozesses, der als derselbe Benutzer ausgeführt wird wie der Prozess, den Sie testen, aber nicht dieser Prozess selbst. Danke an rubasov für den Gedanken an /proc/$pid/mem .

Wenn Sie die PID des Prozesses selbst verwenden, erhalten Sie EIO, aber nur, wenn Sie aus einem Bereich lesen, der nicht im Speicher des Prozesses abgebildet ist. Die erste Seite wird nie abgebildet, also ist es ok, wenn Sie die Datei sequentiell lesen, aber nicht geeignet für einen Datenbankprozess, der direkt in der Mitte der Datei sucht.

Mit etwas mehr Setup als Root können Sie den Device Mapper nutzen, um Dateien mit gültigen Sektoren und fehlerhaften Sektoren zu erstellen.

Ein anderer Ansatz wäre die Implementierung eines kleinen FUSE-Dateisystems. EIO ist der Standardfehlercode, wenn Ihr Userspace-Dateisystemtreiber etwas falsch macht, also ist es einfach zu erreichen. Sowohl die Perl- als auch die Python-Bindungen enthalten Beispiele für den Einstieg. Sie können schnell ein Dateisystem schreiben, das vorhandene Dateien größtenteils widerspiegelt, aber an sorgfältig ausgewählten Stellen ein EIO einfügt. Es gibt ein solches Dateisystem:petardfs (Artikel), ich weiß nicht, wie gut es sofort einsatzbereit ist.

Noch eine andere Methode ist ein LD_PRELOAD Verpackung. Ein existierendes ist Libfiu (Fault Injection in Userspace). Es funktioniert, indem eine Bibliothek vorab geladen wird, die die POSIX-API-Aufrufe überlädt. Sie können einfache Anweisungen oder beliebigen C-Code schreiben, um das normale Verhalten zu überschreiben.


Linux
  1. Linux – Bestimmung einer bestimmten Datei, die für hohe E/A verantwortlich ist?

  2. Was führt dazu, dass Dateien Berechtigungen verlieren?

  3. Netbsd 5.1 Ndis-Kernel-Kompilierungsfehler?

  4. Eine RAR-Datei mit einem Passwort extrahieren, das Sonderzeichen enthält?

  5. Beheben Sie interne WordPress-Serverfehler

Lernen Sie die Grundlagen der Funktionsweise der E/A-Umleitung (Eingabe/Ausgabe) unter Linux kennen

So beheben Sie Konvertierungsfehler mit Calibre

Unter Linux ist alles eine Datei – Teil 1

Debuggen der Linux-I/O-Latenz

Unterschied zwischen Gerätedatei und Gerätetreibern

Wo wird die Kernel-Konfigurationsdatei gespeichert?