Log Entry
RAIDLinux

RAIDの障害を検証する

背景

前回のUTMによるLVMとRAID検証環境の作成では、仮想マシンに追加したディスクを使ってRAID 1とLVMを組み合わせた基本構成を作成した。今回はRAID 5を対象に、仮想ディスクを追加する代わりにddlosetupで作成したループバックデバイス上に同様の環境を構築し、意図的にディスク障害を発生させた際の挙動を確認する。

検証目的

ディスクイメージファイルを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

実装

  1. 検証用のディレクトリを作成する

    sudo mkdir /var/lib/storage-raid5-lab && cd /var/lib/storage-raid5-lab
  2. ddコマンドで、必要な個数だけディスクイメージを作成する

    for i in {1..3}
    do
      sudo dd if=/dev/zero of=disk00${i}.img bs=1M count=1024 status=progress
    done
  3. losetupコマンドで、作成したディスクイメージをブロックデバイスとして割り当てる

    for i in {1..3}
    do
      LOOP00${i}=$(sudo losetup --find --show /var/lib/storage-raid5-lab/disk00${i}.img)
    done
  4. mdadmコマンドでソフトウェアRAIDを構成する。今回はRAID 5を3台のブロックデバイスで構成する。

    sudo mdadm --create /dev/md1 --level=5 --raid-devices=3 "$LOOP001" "$LOOP002" "$LOOP003"

    構成後、lsblkで各ブロックデバイスがRAIDにアサインされているかを確認する。環境によってはloop0loop2が既に使用中で、loop3以降が割り当てられることがあるが、番号がずれているだけで構成自体に問題はない。

    lsblkでRAID5とLVMの階層構成を確認

  5. LVMを作成する

    sudo pvcreate /dev/md1
    sudo vgcreate vg-raid5-lab /dev/md1
    sudo lvcreate -L 600M -n lv-raid5-data vg-raid5-lab
  6. ファイルシステムを作成し、マウントポイントを定義してマウントする

    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

障害発生後の/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で指定したボリュームグループ名と、mkfsmountで参照する名前が一致していないと、デバイスが見つからずエラーになる
  • 普段シェルスクリプトを書かないため、特有のお作法を忘れがちになる。

いずれも一つ一つのコマンドを流し読みするだけでは気づきにくく、lsblk/proc/mdstatなどの確認コマンドの出力と突き合わせて初めて気づけた。

学んだこと

  • losetupを使うと、通常のファイルをディスクイメージとしてブロックデバイス化でき、追加の仮想ディスクを用意しなくてもRAID検証ができる
  • RAID 5は構成ディスクのうち1台が故障しても、残りのディスクとパリティ情報でデータを復元しながら継続稼働できる
  • mdadm --failで、実際にディスクを壊さなくても故障状態を意図的に模擬できる
  • ループバックデバイスは環境依存でデバイス番号が変わるため、決め打ちせずlsblkなどで都度確認する必要がある

次の課題

  • TODO: 故障したディスクを新しいループバックデバイスに交換し、mdadm --addでリビルドする手順を確認する
  • TODO: ループバックデバイスの永続化(systemdのユニット化など)を検証する