とにかく、Linuxで、意図的にブロックデバイスにI / Oエラーを報告させたり、テスト目的でブロックエラーをシミュレートしたりすることはできますか?
modprobe
、ブロックデバイスのように動作してioctl()'s
から、ドライバーに送信して必要な値を返す別の小さなプログラムを作成します。
とにかく、Linuxで、意図的にブロックデバイスにI / Oエラーを報告させたり、テスト目的でブロックエラーをシミュレートしたりすることはできますか?
modprobe
、ブロックデバイスのように動作してioctl()'s
から、ドライバーに送信して必要な値を返す別の小さなプログラムを作成します。
回答:
はい、デバイスマッパーでこれを行う非常にもっともらしい方法があります。
デバイスマッパーは、ブロックデバイスを新しいマッピング/選択の順序に再結合できます。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を使用していくつかの穴を追加し、再マウントします!
その出力が失敗した場合には、プログラムの堅牢性を確認するためには、擬似デバイスを使用することができます/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
テストする内容によって異なります。LD_PRELOAD
edライブラリを使用すると、アプリケーションをだまして、「すべての書き込みが失敗する」ENOSPC
やEIO
「など」などのことを考えさせることができます。
あなたはそれを非常に多くの興味深い方法で行うことができます。https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txtを参照してください
fail_make_request
か()。リンクの腐敗を防ぐのも素晴らしいでしょう。