* Linux RAID の faulty ドライバ [#bb60ebcc]

今回は Linux のソフトウェア RAID の ''faulty ドライバ''について書いていく.
これを「ドライバ」というかどうかは疑問があるが,ここではそう呼ぶことにする.

** faulty ドライバとは [#rae702c0]

faulty ドライバはボリュームの故障をシミュレートするドライバである.
例えば,このドライバを使って更に RAID5 ボリュームを組み,RAID の動作を確かめることができる.

で,faulty ドライバ自身も Linux のソフトウェア RAID の枠組みの中で動作している.

 子ボリューム −−−(faulty ドライバ)−−→ 仮想ボリューム

1つの子ボリュームから1つの仮想ボリュームを生成する RAID (のようなもの)として実装されている.

** 下準備 [#cf9f53da]

例によって sparse file と loopback デバイスを使って子ボリュームを作成する.

 # dd if=/dev/zero of=d0 bs=1M seek=128 count=0
 # losetup /dev/loop0 d0

これで 128MB の loopback デバイスボリュームを作成する.
このボリュームは /dev/loop0 として使用することができる.

** 作成 [#dbbb3ff7]

faulty 仮想ボリュームの作成にも mdadm コマンドを使用する.

 # mdadm --build --level=faulty --layout=read-transient --raid-devices=1 /dev/md0 /dev/loop0

*** --build [#p426d676]
まず,作成には --create (-C) ではなく,--build を使用する.
bulid オプションを使用した場合,子ボリューム上に RAID の管理領域が確保されない.

 # blockdev --getsz /dev/loop0
 262144
 # blockdev --getsz /dev/md0
 262144

確かに子ボリュームのサイズが丸ごと親ボリュームとなっている.

*** --level=faulty [#y1106e93]

RAID5 の場合は --level=raid5 と指定するが,今回は faulty ドライバを使うので faulty を指定する.

*** --layout=read-transient [#r18c4833]

layout オプションでは通常,RAID のパリティの配置を指定する.
が,faulty ドライバでは故障のしかたをここに指定する.
指定できるモードの一部を以下に示す.

|CENTER:モード|CENTER:説明|h
|write-transient|一時的な書き込みエラー|
|wt|~|
|read-transient|一時的な読み込みエラー|
|rt|~|
|write-persistent|持続的な書き込みエラー|
|wp|~|
|read-persistent|持続的な読み込みエラー|
|rp|~|
|none|故障なし|

ところで,--layout=read-transient オプションで作成した仮想ボリュームにアクセスしてみると
 # dd if=/dev/md0 of=/dev/null bs=1M dd: reading `/dev/md0': 入力/出力エラーです
 0+0 records in
 0+0 records out
 0 bytes (0 B) copied, 0.0112992 seconds, 0.0 kB/s
最初のアクセスからエラーが発生してしまう.
これでは故障をシミュレートするのに具合がよろしくない.

実は,各故障モードの後に数値を付けると,故障間隔を指定することができる.
例えば
 --layout=read-transient1000
と指定すれば,1000 回周期で read-transient の故障が発生する.
 # mdadm --stop /dev/md0mdadm: stopped /dev/md0
 # mdadm --build --level=faulty --raid-devices=1 --layout=read-transient1000 /dev/md0 /dev/loop0
 mdadm: array /dev/md0 built and started.
 # dd if=/dev/md0 of=/dev/null bs=1M
 dd: reading `/dev/md0': 入力/出力エラーです
 3+1 records in
 3+1 records out
 4091904 bytes (4.1 MB) copied, 0.199857 seconds, 20.5 MB/s
今度は,正常なアクセスがしばらく続いてからエラーが発生している.

*** --raid-devices=1 [#p80b7a7a]
子ボリュームの数を指定するオプション.
これは RAID の場合と同じ.
faulty ドライバでは子ボリュームは1つなのでここは必ず1となる.

** 使用例 [#i3e08ddc]
もう1つ loopback ボリュームを作成し,これと faulty ボリュームで RAID1 を組んでみる.

 # dd if=/dev/zero of=d0 bs=1M seek=128 count=0
 # losetup /dev/loop0 d0
 # dd if=/dev/zero of=d1 bs=1M seek=128 count=0
 # losetup /dev/loop1 d1
 # mdadm --build --level=faulty --raid-devices=1 --layout=read-transient1000 /dev/md0 /dev/loop0
 mdadm: array /dev/md0 built and started.
 # mdadm --create --level=raid1 --raid-devices=2 /dev/md1 /dev/md0 /dev/loop1
 mdadm: array /dev/md1 started.

図にするとこんな感じか.

 d0 --(loopback)--> /dev/loop0 --(faulty)--> /dev/md0 --
                                                        |
                                                        +--(raid1)--> /dev/md1
                                                        |
 d1 --(loopback)--> /dev/loop1 -------------------------

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS