Linuxで意図的にI / Oエラーが発生しますか?


42

とにかく、Linuxで、意図的にブロックデバイスにI / Oエラーを報告させたり、テスト目的でブロックエラーをシミュレートしたりすることはできますか?


ディスク障害をシミュレートしていますか?おそらく、ディレクトリをマウントし、使用中にアンマウントすることができます。
シェフ

2
でロードできる小さなカーネルモジュールを作成しmodprobe、ブロックデバイスのように動作してioctl()'sから、ドライバーに送信して必要な値を返す別の小さなプログラムを作成します。
-ott--


@Gillesが行ったコメントをフォローアップするために、これはstackoverflow.com/questions/1361518/…(いくつかの異なるフォールト注入の回答)およびstackoverflow.com/questions/1870696/…(デバイスマッパーを使用)でも尋ねられました。
アノン

回答:


54

はい、デバイスマッパーでこれを行う非常にもっともらしい方法があります。

デバイスマッパーは、ブロックデバイスを新しいマッピング/選択の順序に再結合できます。LVMはこれを行います。また、障害のあるディスクをシミュレートする「flakey」や障害のあるディスクの領域をシミュレートする「エラー」など、他のターゲット(非常に斬新なもの)もサポートしています。

意図的にIOブラックホールが存在するデバイスを構築すると、クロスしたときにIOエラーが報告されます。

最初に、ターゲットとして使用する仮想ボリュームを作成し、ブロックデバイスとしてアドレス指定可能にします。

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

したがって、これを開始するには、仮想ブロックデバイスの基礎となる512Mファイルを作成し、そこに「穴」を開けます。まだ穴はありません。あなたがいればmkfs.ext4 /dev/loop0、完全に有効なファイルシステムを手に入れるでしょう。

したがって、dmblockを使用して、このブロックデバイスを使用して、いくつかの穴がある新しいデバイスを作成します。最初に例を示します

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

これにより、「errdev0」というデバイスが作成されます(通常は/ dev / mapperにあります)。入力dmsetup create errdev0すると、stdinを待機し、^ Dが入力されると終了します。

上記の例では、ループデバイスのセクター261144に5セクターの穴(2.5kb)を作成しました。その後、通常どおりループデバイスを通過します。

このスクリプトは、おおよそ16Mb前後に広がるランダムな位置にホールを配置するテーブルを生成しようとします(ただし、かなりランダムです)。

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

このスクリプトでは、512Mbデバイスも作成済みであり、仮想ブロックデバイスがオンになっていると想定しています/dev/loop0

このデータをテーブルとしてテキストファイルに出力し、それをにパイプするだけdmsetup create errdev0です。

デバイスを作成したら、まずフォーマットしてからファイルを配置することで、通常のブロックデバイスのように使用を開始できます。ある時点で、実際に仮想デバイスのIOホールであるセクターにヒットするIOの問題に遭遇するはずです。

使用が終了したらdmsetup remove errdev0、デバイスを削除します。

IOエラーが発生する可能性を高めるには、より頻繁に穴を追加するか、作成する穴のサイズを変更します。特定のセクションにエラーを入れると、get-goの問題が発生する可能性があります.IEは32 mbで、extが通常しようとするスーパーブロックを書き込むことができないデバイスに入れられるため、フォーマットは機能しません。

追加の楽しみのために-あなたは実際にはできlosetup、その後mkfs.ext4 /dev/loop0、データとそれを埋めます。作業用のファイルシステムができたら、ファイルシステムをアンマウントし、dmsetupを使用していくつかの穴を追加し、再マウントします!


6
これができるとは知りませんでした。かなりクール。

15

その出力が失敗した場合には、プログラムの堅牢性を確認するためには、擬似デバイスを使用することができます/dev/fullに書き込まれたときに、常に「ENOSPACE」を返し、。

$ 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

7

テストする内容によって異なります。LD_PRELOADedライブラリを使用すると、アプリケーションをだまして、「すべての書き込みが失敗する」ENOSPCEIO「など」などのことを考えさせることができます。



1

パーティションテーブルを変更して、パーティションを実際より大きくすることもできます。それはおそらくI / Oエラーの原因になります。または、ディスクがホットプラグ可能な場合は、1つを抜くだけで済みます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.