Vraag Opzettelijk een I / O-fout veroorzaken in Linux?


Is er toch, met Linux, om opzettelijk te veroorzaken dat een blokapparaat een I / O-fout meldt, of mogelijk een simulatie voor testdoeleinden?


40
2018-04-12 20:15


oorsprong


Simuleert u een schijfstoring? Misschien kunt u een map koppelen en vervolgens ontkoppelen terwijl deze in gebruik was. - Shef
Ik zou een kleine kernelmodule schrijven waarmee je zou kunnen laden modprobe, gedraagt ​​zich als een blokapparaat en vervolgens nog een klein programma dat verzendt ioctl()'s om de bestuurder de gewenste waarde terug te geven. - ott--
Dezelfde vraag over Stapel Overlflow en verder Unix en Linux. - Gilles
Naar aanleiding van de reactie die @ Gilles heeft gemaakt, werd dit ook gevraagd stackoverflow.com/questions/1361518/... (verschillende antwoorden voor foutinjectie) en stackoverflow.com/questions/1870696/... (gebruik device mapper). - Anon


antwoorden:


Ja, er is een zeer plausibele manier om dit te doen met device mapper.

De mapper van het apparaat kan blokapparaten opnieuw samenvoegen tot een nieuwe toewijzing / volgorde naar keuze. LVM doet dit. Het ondersteunt ook andere doelen, (sommige zijn vrij nieuw) zoals 'flakey' om een ​​defecte schijf te simuleren en 'error' om defecte delen van de schijf te simuleren.

Men kan een apparaat construeren dat weloverwogen IO-blackholes bevat, die IO-fouten rapporteren wanneer ze worden gekruist.

Maak eerst een virtueel volume om als doel te gebruiken en maak het adresseerbaar als een blokapparaat.

dd if=/dev/zero of=/var/lib/virtualblock.img bs=512 count=1048576
losetup /dev/loop0 /var/lib/virtualblock.img

Dus, om te beginnen, creëer je een 512M-bestand dat de basis is van ons virtueel blokapparaat, waarin we een 'gat' zullen slaan. Er is nog geen gat. Als je dat zou doen mkfs.ext4 /dev/loop0 je zou een perfect geldig bestandssysteem krijgen.

Dus, laten we dmsetup gebruiken die, gebruikmakend van dit block device - een nieuw apparaat zal maken dat enkele gaten bevat. Hier is eerst een voorbeeld

dmsetup create errdev0
0 261144 linear /dev/loop0 0
261144 5 error
261149 787427 linear /dev/loop0 261139

Hiermee wordt een apparaat gemaakt met de naam 'errdev0' (meestal in / dev / mapper). Wanneer je typt dmsetup create errdev0 het zal wachten op stdin en eindigt op ^ D als invoer.

In het bovenstaande voorbeeld hebben we een sectorgat (2,5kb) gemaakt in sectoren 261144 van het lusapparaat. We gaan vervolgens gewoon door het lusapparaat.

Dit script zal proberen om je een tabel te genereren die gaten zal plaatsen op willekeurige locaties ongeveer verspreid over 16Mb (hoewel het vrij willekeurig is).

#!/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}"

Het script gaat ervan uit dat je ook een 512Mb-apparaat hebt gemaakt en dat je virtuele blokapparaat is ingeschakeld /dev/loop0.

Je kunt deze gegevens gewoon als een tabel naar een tekstbestand exporteren en er een pijp in opnemen dmsetup create errdev0.

Nadat u het apparaat hebt gemaakt, kunt u het beginnen te gebruiken als een normaal blokapparaat, eerst door het te formatteren en vervolgens door er bestanden op te plaatsen. Op een gegeven moment moet je een aantal IO-problemen tegenkomen waarbij je sectoren raakt die echt IO-gaten in het virtuele apparaat zijn.

Als u klaar bent met gebruiken dmsetup remove errdev0 om het apparaat te verwijderen.

Als u het waarschijnlijker wilt maken dat er een IO-fout optreedt, kunt u vaker gaten toevoegen of de grootte van de gaten die u maakt wijzigen. Merk op dat fouten in bepaalde secties waarschijnlijk problemen veroorzaken bij het begin, I.E bij 32mb in een apparaat dat je een superblok niet kunt schrijven dat ext normaal wel probeert te doen, dus het formaat zal niet werken ..

Voor nog meer plezier - je kunt eigenlijk gewoon losetup dan mkfs.ext4 /dev/loop0 en vul het met gegevens. Zodra je daar een leuk werkend bestandssysteem hebt, ontkoppel je eenvoudig het bestandssysteem en voeg je wat gaten toe met behulp van dmsetup en monteer je dat opnieuw!


50
2018-04-12 22:33



Ik wist niet dat je dit kon doen. Best wel gaaf. - kce


Voor het controleren van de robuustheid van het programma in het geval dat hun uitvoer mislukt, kunt u het pseudodevice gebruiken /dev/full, waarbij altijd "ENOSPACE" wordt geretourneerd wanneer naar geschreven.

$ dd if=/dev/zero of=/dev/full
dd: writing to `/dev/full': No space left on device
1+0 records in
0+0 records out

13
2018-04-12 21:58





Afhankelijk van wat u wilt testen. Gebruik een LD_PRELOADed library, kun je applicaties bedriegen en dingen bedenken zoals 'alles schrijft faalt met ENOSPCof EIO' bijvoorbeeld.


6
2018-04-12 20:46





Je kunt dat op oh zo veel interessante manieren doen. Zien https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt


5
2018-04-12 22:56



Kunt u de relevante "interessante" manieren benadrukken die specifiek zijn voor schijfaanvragen (fail_make_request)? Zou ook geweldig zijn om linkrot te voorkomen. - Deer Hunter


Misschien kun je de partitietabel veranderen en de partitie groter maken dan het in werkelijkheid is. Dat zou waarschijnlijk een i / o-fout veroorzaken. Of als uw schijven hot-pluggable zijn, kunt u er gewoon een eruit trekken.


0
2018-04-12 21:01