17

特定のブロックが読み取られたときにi/o読み取りエラーを生成する障害のあるブロックデバイスに対してアプリケーションをテストする簡単な方法を探しています。既知の不良ブロックのある物理ハードドライブを使用しようとするのは苦痛であり、ソフトウェアソリューションが存在する場合はそれを見つけたいと思います。

特定の範囲のブロックが読み取られたときにエラーを生成するように構成できるインターフェイスを作成できるLinuxディスク障害シミュレーションドライバーを見つけましたが、これは2.4 Linuxカーネル用であり、2.6用に更新されていません。

完璧なのは、losetupとloopドライバーで、特定のブロックのセットから読み取ろうとしたときに読み取りエラーを返すように構成することもできます。

4

4 に答える 4

31

これは、探しているループバックデバイスではなく、デバイスマッパーです。

dmsetup「エラー」ターゲットに裏打ちされたデバイスを作成するために使用します。に表示され/dev/mapper/<name>ます。

デバイスマッパープレゼンテーション(PDF)の7ページには、まさにあなたが探しているものがあります。

dmsetup create bad_disk << EOF
  0 8       linear /dev/sdb1 0
  8 1       error
  9 204791 linear /dev/sdb1 9
EOF

または、sdb1パーツを省略し、「エラー」ターゲットをブロック0〜8のデバイスとして(の代わりにsdb1)配置して、純粋なエラーディスクを作成します。

「RHEL5論理ボリュームマネージャーの管理」の「デバイスマッパー」の付録も参照してください。


flakeyターゲットもあります-との組み合わせはlinear時々 error成功します。また、delayテストのための意図的な遅延を導入します。

于 2009-12-09T01:11:42.083 に答える
5

Linuxに組み込まれているフォールトインジェクション機能を使用することをお勧めします。

ブログ:http
://blog.wpkg.org/2007/11/08/using-fault-injection/ リファレンス:https ://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt

于 2013-04-27T20:48:52.733 に答える
4

ブロックデバイスで遊ぶ最も簡単な方法は、nbdを使用することです。

git://github.com/yoe/nbd.gitからユーザーランドのソースをダウンロードし、nbd-server.c失敗させたい領域での読み取りまたは書き込みに失敗するように、または制御可能なランダムパターンで失敗するように、または基本的に必要なものに変更します。 。

于 2009-12-09T04:02:57.877 に答える
0

ピーター・コーデスの答えについて詳しく説明したいと思います。

bashで、ext4を使用してループバックデバイスにイメージをセットアップしてから、。という名前のファイルをそのデバイスに書き込みますbinary.bin

imageName=faulty.img
mountDir=$(pwd)/mount

sudo umount $mountDir ## make sure nothing is mounted here

dd if=/dev/zero of=$imageName bs=1M count=10
mkfs.ext4 $imageName
loopdev=$(sudo losetup -P -f --show $imageName); echo $loopdev
mkdir $mountDir
sudo mount $loopdev $mountDir
sudo chown -R $USER:$USER mount

echo "2ed99f0039724cd194858869e9debac4" | xxd -r -p > $mountDir/binary.bin

sudo umount $mountDir

python3で(bashはバイナリデータの処理に苦労しているため)で魔法のバイナリデータを検索しますbinary.bin

import binascii

with open("faulty.img", "rb") as fd:
    s = fd.read()
    
search = binascii.unhexlify("2ed99f0039724cd194858869e9debac4")

beg=0
find = s.find(search, beg); beg = find+1; print(find)

start_sector = find//512; print(start_sector)

次に、障害のあるブロックデバイスをbashマウントに戻します

start_sector=## copy value from variable start_sector in python
next_sector=$(($start_sector+1))
size=$(($(wc -c $imageName|cut -d ' ' -f1)/512))
len=$(($size-$next_sector))

echo -e "0\t$start_sector\tlinear\t$loopdev\t0" > fault_config
echo -e "$start_sector\t1\terror" >> fault_config
echo -e "$next_sector\t$len\tlinear\t$loopdev\t$next_sector" >> fault_config

cat fault_config | sudo dmsetup create bad_drive
sudo mount /dev/mapper/bad_drive $mountDir

最後に、ファイルを読み取ることで、障害のあるブロックデバイスをテストできます

cat $mountDir/binary.bin

エラーが発生します:

cat: /path/to/your/mount/binary.bin: Input/output error

テストが終了したらクリーンアップします

sudo umount $mountDir
sudo dmsetup remove bad_drive
sudo losetup -d $loopdev
rm fault_config $imageName
于 2020-06-25T19:13:13.990 に答える