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 ドライバでは故障のしかたをここに指定する. 指定できるモードの一部を以下に示す.

モード説明
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

子ボリュームの数を指定するオプション. これは 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 -------------------------

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-02-18 (月) 20:05:30 (5934d)