I/Oエラーを引き起こす特殊ファイル

I/Oエラーを引き起こす特殊ファイル

重要なSQLite DBファイルを読み取れない場合(I / Oエラーが発生した場合)、ソフトウェアが期待どおりに反応するかどうかを自動的にテストしたいと思います。これは、数日前の顧客から起こったことです。手動で問題を解決しましたが、問題を解決するための自動コードを作成してテストするには、破損したファイルにアクセスする必要があります。

Unixのすべてはファイルなので、人々が読もうとすると常にI / Oエラーを引き起こす特別なファイル(/ devなど)があると思います。

いくつかの類似ファイル(imo)は次のとおりです。

  • /dev/full書き込もうとすると、常に「デバイスに残りのスペースがありません」というメッセージが表示されます。
  • /dev/nullそして/dev/zero

だから私の考えにはこのようなファイルがあればいいようです(まだ見つかりませんでした)。

目的の結果を得るためのファイルや他の方法を知っている人はいますか(open()の周りにLD_PRELOADラッパーを使用して意図的に誤ったパーティションイメージ...)?
ここに行く最良の方法は何ですか?

答え1

スタックオーバーフローとサーバーエラーに関するこの質問に対する答えはすでにたくさんありますが、いくつかの技術が欠けています。人生を容易にするために、VM/Linux ブロックデバイス/Linux ファイルシステム/Linux ユーザー空間ライブラリ I/O エラー注入メカニズムのリストは次のとおりです。

追加の事実:SQLiteには、エラーシミュレーション用のVFSドライバがあります。これは良いテストの適用範囲につながります。

関連:

答え2

または、ターゲットを使用してdmsetupデバイスマッパーデバイスを作成してエラーをシミュレートすることもできます。errorflakey

dmsetup create test --table '0 123 flakey 1 0 /dev/loop0'

ここで、123はセクタ単位のデバイス長であり、/ dev / loop0はエラーがシミュレートされるネイティブデバイスです。エラーの場合は常にエラーを返すため、後続のパラメーターは必要ありません。

答え3

あなたは一つが欲しい欠陥注入I/O メカニズム。

Linuxでは、プリセットを必要とせず、例外エラー(EIO「入力/出力エラー」ではなくESRCH「該当プロセスなし」)を生成する方法があります。

cat /proc/1234/mem

ここで、1234はテスト中のプロセスと同じユーザーで実行されているプロセスのPIDですが、プロセス自体ではありません。感謝の言葉ルバソフ~のため考える~の/proc/$pid/mem

プロセス自体のPIDを使用すると、EIOを取得しますが、プロセスのメモリにマップされていない領域から読み取る場合にのみ適用されます。最初のページはマップされていないので、順番にファイルを読み取るのは問題ありませんが、ファイルの途中を直接見るデータベースプロセスには適していません。

ルートとしてさらに設定するには、次の手順を実行します。デバイスマッパーの活用有効なセクタと不良セクタを持つファイルを作成します。

もう一つのアプローチは、小さな規模を実装することです。ヒューズファイルシステムEIO は、ユーザー空間ファイルシステムドライバでエラーが発生した場合のデフォルトのエラーコードなので、実装が簡単です。これら二つ真珠そしてPythonバインディングには、既存のファイルをほとんどミラーリングしますが、慎重に選択した場所にEIOを注入するファイルシステムをすばやく作成するための開始例が付属しています。次の既存のファイルシステムがあります。petarddevs記事)、それが基本的にどれだけうまく機能するかわかりません。

別の方法はLD_PRELOAD包装紙。既存のもの図書館(ユーザー空間へのエラー注入)。 POSIX API呼び出しをオーバーロードするライブラリを事前にロードして機能します。簡単な指示や任意のCコードを書くことで、通常の動作をオーバーライドできます。

答え4

この目的のために特別に作成されたCharybdeFSを使用できます。

PetardFSに似ていますが、より構成可能なパススルーヒューズファイルシステムです。

ここでCharybdeFSレシピをご覧ください。http://www.scyladb.com/2016/05/02/fault-injection-filesystem-cookbook/

データベースをテストするのに十分な進歩を遂げました。

関連情報