- 追加された行はこの色です。
- 削除された行はこの色です。
* 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 -------------------------