RAIDの障害を検証する
背景
前回のUTMによるLVMとRAID検証環境の作成では、仮想マシンに追加したディスクを使ってRAID 1とLVMを組み合わせた基本構成を作成した。今回はRAID 5を対象に、仮想ディスクを追加する代わりにddとlosetupで作成したループバックデバイス上に同様の環境を構築し、意図的にディスク障害を発生させた際の挙動を確認する。
検証目的
ディスクイメージファイルをddで作成し、losetupでブロックデバイスとして割り当てたうえでRAID 5とLVMを構築する。構築後、mdadmでディスク1台を意図的にFailed状態にし、RAIDが縮退した状態でもデータの読み書きが継続できることを確認する。
なお、ループバックデバイスは再起動によって名前が変わる可能性があるため、systemdなどによる永続化は今回の検証範囲には含めない。スクリプト化しておくことで、繰り返し検証しやすくなるメリットがある。
構成
disk001.img / disk002.img / disk003.img(dd)
↓ losetup
ループバックデバイス(loopN × 3)
↓ mdadm
ソフトウェアRAID 5(/dev/md1)
↓ LVM
vg-raid5-lab / lv-raid5-data
↓ ext4
/mnt/storage_raid5_lab
実装
-
検証用のディレクトリを作成する
sudo mkdir /var/lib/storage-raid5-lab && cd /var/lib/storage-raid5-lab -
ddコマンドで、必要な個数だけディスクイメージを作成するfor i in {1..3} do sudo dd if=/dev/zero of=disk00${i}.img bs=1M count=1024 status=progress done -
losetupコマンドで、作成したディスクイメージをブロックデバイスとして割り当てるfor i in {1..3} do LOOP00${i}=$(sudo losetup --find --show /var/lib/storage-raid5-lab/disk00${i}.img) done -
mdadmコマンドでソフトウェアRAIDを構成する。今回はRAID 5を3台のブロックデバイスで構成する。sudo mdadm --create /dev/md1 --level=5 --raid-devices=3 "$LOOP001" "$LOOP002" "$LOOP003"構成後、
lsblkで各ブロックデバイスがRAIDにアサインされているかを確認する。環境によってはloop0〜loop2が既に使用中で、loop3以降が割り当てられることがあるが、番号がずれているだけで構成自体に問題はない。
-
LVMを作成する
sudo pvcreate /dev/md1 sudo vgcreate vg-raid5-lab /dev/md1 sudo lvcreate -L 600M -n lv-raid5-data vg-raid5-lab -
ファイルシステムを作成し、マウントポイントを定義してマウントする
sudo mkfs.ext4 /dev/vg-raid5-lab/lv-raid5-data sudo mkdir -p /mnt/storage_raid5_lab sudo mount /dev/vg-raid5-lab/lv-raid5-data /mnt/storage_raid5_lab
RAID障害の検証
作成したRAID 5に対して、割り当てているブロックデバイスの1台をFailed状態に変更する。
sudo mdadm /dev/md1 --fail "$LOOP001"
/proc/mdstatを確認し、対象のブロックデバイスがRAIDから外れていることと、残りのブロックデバイスで冗長化が継続していることを確認する。
cat /proc/mdstat

[3/2]のように、構成台数に対して稼働台数が1台減っていること、失敗したデバイスに(F)が付いていることが確認できる。
続けて、対象のRAIDに対してファイルの書き込み・読み込みができることを確認する。
sudo touch /mnt/storage_raid5_lab/testdata.txt
echo "test" >> /mnt/storage_raid5_lab/testdata.txt
cat /mnt/storage_raid5_lab/testdata.txt
ディスクを1台失った状態でも、マウントしたファイルシステムへの読み書きが問題なく行えることを確認できた。
ハマった点
vgcreateで指定したボリュームグループ名と、mkfs・mountで参照する名前が一致していないと、デバイスが見つからずエラーになる- 普段シェルスクリプトを書かないため、特有のお作法を忘れがちになる。
いずれも一つ一つのコマンドを流し読みするだけでは気づきにくく、lsblkや/proc/mdstatなどの確認コマンドの出力と突き合わせて初めて気づけた。
学んだこと
losetupを使うと、通常のファイルをディスクイメージとしてブロックデバイス化でき、追加の仮想ディスクを用意しなくてもRAID検証ができる- RAID 5は構成ディスクのうち1台が故障しても、残りのディスクとパリティ情報でデータを復元しながら継続稼働できる
mdadm --failで、実際にディスクを壊さなくても故障状態を意図的に模擬できる- ループバックデバイスは環境依存でデバイス番号が変わるため、決め打ちせず
lsblkなどで都度確認する必要がある
次の課題
- TODO: 故障したディスクを新しいループバックデバイスに交換し、
mdadm --addでリビルドする手順を確認する - TODO: ループバックデバイスの永続化(
systemdのユニット化など)を検証する
