GNU/Linux >> Znalost Linux >  >> Linux

Speciální soubor, který způsobuje chybu I/O

Na Stack Overflow a Server Fault už na to existuje skvělá sada odpovědí, ale některé techniky chyběly. Pro usnadnění života je zde seznam VM/Linux blokových zařízení/Linuxového souborového systému/Linuxové knihovny uživatelského prostoru I/O mechanismů vkládání chyb:

  • Použijte zařízení Device Mapper's error/flakey/delay/dm-dust k vrácení chyb/poškození ze syntetizovaného blokového zařízení nebo zpoždění/rozdělení IO na syntetizované blokové zařízení (kernel, vyžaduje, aby bylo jádro sestaveno s podporou mapovače zařízení, vhodné další zařízení moduly mapovače (dm-dust je k dispozici pouze na jádře>=5.2) a mít bity uživatelského prostoru mapovače zařízení).
  • Použijte chybovou osobnost md k provádění periodického vkládání chyb na syntetizovaném blokovém zařízení. Viz --layout možnost na manuálové stránce mdadm, jak jej nakonfigurovat (jádro a bity uživatelského prostoru mdadm).
  • Použijte libfiu k provádění vkládání chyb při voláních POSIX API (uživatelský prostor, lze použít s LD_PRELOAD ).
  • Použijte injektor chyb linuxového jádra k vložení chyby do základního blokového zařízení (kernel, vyžaduje, aby bylo jádro sestaveno s FAIL_MAKE_REQUEST=y ).
  • Použití SystemTap k provádění vkládání chyb (jádro vyžaduje, aby bylo jádro sestaveno se spoustou věcí).
  • Injektujte chyby souborového systému pomocí CharybdeFS nebo PetardFS (uživatelský prostor přes FUSE).
  • Vytvořte syntetizované blokové zařízení pomocí ovladače scsi_debug pro Linux, který provádí vkládání chyb (kernel).
  • Spusťte svůj systém v rámci QEMU a použijte QEMU k vložení chyb blokového zařízení pomocí ovladače blkdebug (VM).
  • Vytvořte syntetizované blokové zařízení pomocí možností zařízení null_blk pro injektování chyb (jádro>=4.14, ale možnosti jako pravděpodobnosti vypršení časového limitu se objevily až ve verzi 4.17 a vyžadují, aby bylo jádro sestaveno s BLK_DEV_NULL_BLK_FAULT_INJECTION=y ).
  • Vytvořte syntetizované síťové blokové zařízení, které bude hostiteli poskytováno prostřednictvím filtrů NBDkit, jako je delay nebo error a poté k němu připojte blokové zařízení pomocí nbd-client (jádro + bity uživatelského prostoru NBD, jádro>=4.18 vytvořené s podporou NBD, doporučeno nbdclient>=3.18 a nbdkit>=1.8.1 – viz demo video NBDKit kolem 20 minut).

Bonusový fakt:SQLite má ovladač VFS pro simulaci chyb, takže může získat dobré testovací pokrytí.

Související:

  • Jak mohu během testování simulovat vadný disk?
  • Simulovat vadné blokové zařízení s chybami čtení?
  • Vygenerovat chybu čtení
  • Chcete úmyslně způsobit chybu I/O v systému Linux?

Můžete použít dmsetup k vytvoření zařízení mapujícího zařízení pomocí error nebo flakey cíle pro simulaci selhání.

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

Kde 123 je délka zařízení, v sektorech a /dev/loop0 je původní zařízení, na kterém chcete simulovat chyby. Pro chybu nepotřebujete následující argumenty, protože vždy vrátí chybu.


Chcete mechanismus vkládání chyb pro I/O.

V systému Linux je zde uvedena metoda, která nevyžaduje žádné předchozí nastavení a generuje neobvyklou chybu (nikoli EIO „Chyba vstupu/výstupu“, ale ESRCH „Žádný takový proces“):

cat /proc/1234/mem

kde 1234 je PID procesu, který běží jako stejný uživatel jako proces, který testujete, ale ne samotného procesu. Poděkování rubasovovi za to, že myslel na /proc/$pid/mem .

Pokud použijete PID samotného procesu, získáte EIO, ale pouze pokud čtete z oblasti, která není namapována v paměti procesu. První stránka není nikdy mapována, takže je v pořádku, pokud čtete soubor postupně, ale není vhodné pro databázový proces, který hledá přímo do středu souboru.

S dalším nastavením jako root můžete využít mapovač zařízení k vytváření souborů s platnými sektory a vadnými sektory.

Dalším přístupem by bylo implementovat malý souborový systém FUSE. EIO je výchozí chybový kód, když váš ovladač souborového systému v uživatelském prostoru udělá něco špatně, takže je snadné toho dosáhnout. Vazby Perl i Python přicházejí s příklady, jak začít, můžete rychle napsat souborový systém, který většinou zrcadlí existující soubory, ale vkládá EIO na pečlivě vybraná místa. Existuje takový souborový systém:petardfs (článek), nevím, jak dobře to po vybalení funguje.

Další metodou je LD_PRELOAD obal. Existující je Libfiu (injekce chyb v uživatelském prostoru). Funguje tak, že předem načte knihovnu, která přetíží volání POSIX API. Můžete napsat jednoduché direktivy nebo libovolný kód C, abyste přepsali normální chování.


Linux
  1. Co způsobuje, že soubory ztrácejí oprávnění?

  2. Odstraňování problémů s interní chybou serveru WordPress

  3. Chyba kompilace Openssl

  1. Jak provedu I/O nízké úrovně na souboru zařízení Linux v Pythonu?

  2. Ladění linuxové I/O latence

  3. Kde je uložen konfigurační soubor jádra?

  1. Naučte se základy toho, jak funguje přesměrování I/O (vstup/výstup) v systému Linux

  2. Vytvořit virtuální soubor, který je ve skutečnosti příkazem?

  3. Celkové I/O náklady procesu