Linux RAID の faulty ドライバ †今回は Linux のソフトウェア RAID の faulty ドライバについて書いていく. これを「ドライバ」というかどうかは疑問があるが,ここではそう呼ぶことにする. faulty ドライバとは †faulty ドライバはボリュームの故障をシミュレートするドライバである. 例えば,このドライバを使って更に RAID5 ボリュームを組み,RAID の動作を確かめることができる. で,faulty ドライバ自身も Linux のソフトウェア RAID の枠組みの中で動作している. 子ボリューム −−−(faulty ドライバ)−−→ 仮想ボリューム 1つの子ボリュームから1つの仮想ボリュームを生成する RAID (のようなもの)として実装されている. 下準備 †例によって sparse file と loopback デバイスを使って子ボリュームを作成する. # dd if=/dev/zero of=d0 bs=1M seek=128 count=0 # losetup /dev/loop0 d0 これで 128MB の loopback デバイスボリュームを作成する. このボリュームは /dev/loop0 として使用することができる. 作成 †faulty 仮想ボリュームの作成にも mdadm コマンドを使用する. # mdadm --build --level=faulty --layout=read-transient --raid-devices=1 /dev/md0 /dev/loop0 --build †まず,作成には --create (-C) ではなく,--build を使用する. bulid オプションを使用した場合,子ボリューム上に RAID の管理領域が確保されない. # blockdev --getsz /dev/loop0 262144 # blockdev --getsz /dev/md0 262144 確かに子ボリュームのサイズが丸ごと親ボリュームとなっている. --level=faulty †RAID5 の場合は --level=raid5 と指定するが,今回は faulty ドライバを使うので faulty を指定する. --layout=read-transient †layout オプションでは通常,RAID のパリティの配置を指定する. が,faulty ドライバでは故障のしかたをここに指定する. 指定できるモードの一部を以下に示す.
ところで,--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 †子ボリュームの数を指定するオプション. これは RAID の場合と同じ. faulty ドライバでは子ボリュームは1つなのでここは必ず1となる. 使用例 †もう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 ------------------------- |