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
neboerror
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í.