mdadmによるLinuxソフトウェアRAID入門:実践的な構築・運用・復旧ガイド

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

導入背景:なぜソフトウェアRAIDが選ばれるのか

ストレージドライブの故障は避けられず、「壊れるかどうか」ではなく「いつ壊れるか」の問題です。専用ハードウェアRAIDカードを持たないクラウドVM(アタッチされたブロックボリューム)、低価格な専用サーバー(HetznerやOVHなどのベアメタル)、あるいは自宅ラボのハイパーバイザーを運用する場合、Linuxのmdadmを利用したソフトウェアRAIDなら、ベンダーロックインなしで強固な冗長性を確保できます。

ハードウェアコントローラーは、それ自体が脆弱な単一障害点(SPOF)になりがちです。専用のMegaRAIDやSmart Arrayカードが故障した場合、同一の交換カードや一致するファームウェアを探すのに数日かかることもあります。一方、mdadm(Multiple Device Administrator)はメタデータをディスクヘッダーに直接書き込みます。そのため、故障したサーバーからドライブを取り出して汎用Linuxマシンに接続するだけで、わずか数分でアレイをオンラインに復旧できます。

適切なRAIDレベルの選択

容量、スループット、アップタイムの要件に合わせて、適切な構成を選択してください。

  • RAID 1(ミラーリング):最低2台のディスクが必要。全ブロックが各ドライブにミラーリングされます。読み取り速度はディスク台数に応じてほぼスケールしますが、書き込み速度は最も遅いディスクに制約されます。実効容量は50%になります(例:1TB SSD 2台で実効容量1TB)。OSのブートドライブ、/bootパーティション、中核となるデータベースに最適です。
  • RAID 5(分散パリティ):最低3台のディスクが必要。データとパリティブロックを全ドライブに分散して書き込みます。1台のドライブ故障に耐えられます。実効容量は(N – 1) × ディスク容量となり、4TBドライブ3台なら実効容量8TBです。バルクストレージやメディアプールに適していますが、パリティ計算が発生するためランダム書き込み性能は低下します。
  • RAID 10(ミラーのストライピング):最低4台のディスク(偶数台)が必要。RAID 0の高速スループットとRAID 1のフォールトトレランスを兼ね備えています。実効容量は50%です。各ミラーペアの双方が同時に壊れない限り、複数ドライブの同時故障にも耐えられます。高いIOPSが要求されるPostgreSQL、MySQL、仮想化ホストのデファクトスタンダードです。

導入手順:システムとツールの準備

主要なLinuxディストリビューションは、公式リポジトリにmdadmを用意しています。標準のパッケージマネージャーからインストールしてください。

# Debian / Ubuntu
sudo apt update && sudo apt install -y mdadm

# RHEL / AlmaLinux / Rocky Linux
sudo dnf install -y mdadm

接続されているブロックデバイスを一覧表示し、対象ドライブがアンマウントされており認識されていることを確認します。本ガイドでは、同じ1TBのディスク4台(/dev/sdb、/dev/sdc、/dev/sdd、/dev/sde)を使用します。

lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT

過去のパーティションテーブルやファイルシステムのスーパーブロックが残っていると、アレイの初期化に失敗することがあります。作業前に消去しておきましょう。

sudo wipefs -a /dev/sdb /dev/sdc /dev/sdd /dev/sde

構築手順:アレイの作成とファイルシステムの設定

1. RAID 1アレイの作成(2台)

2台のディスクを使用して、ミラーリングアレイ/dev/md0を作成する場合:

sudo mdadm --create --verbose /dev/md0 \
  --level=1 \
  --raid-devices=2 \
  /dev/sdb /dev/sdc /dev/sdd

2. RAID 5アレイの作成(3台)

3台のディスクを使用して、分散パリティアレイを初期化する場合:

sudo mdadm --create --verbose /dev/md5 \
  --level=5 \
  --raid-devices=3 \
  /dev/sdb /dev/sdc /dev/sdd

3. RAID 10アレイの作成(4台)

高スループット・低レイテンシが求められるワークロードの場合:

sudo mdadm --create --verbose /dev/md10 \
  --level=10 \
  --raid-devices=4 \
  /dev/sdb /dev/sdc /dev/sdd /dev/sde

ファイルシステム作成と恒久的なマウント設定

アレイの作成が完了したら、仮想デバイス/dev/mdXを通常のドライブと同様に扱えます。さらに柔軟な容量管理を行いたい場合は、アレイ上にLVM(論理ボリュームマネージャー)を構築して運用することも可能です。

sudo mkfs.ext4 -F /dev/md0
sudo mkdir -p /mnt/raid_storage
sudo mount /dev/md0 /mnt/raid_storage

明示的な設定がない場合、再起動時にカーネルが意図しないデバイス名(例: /dev/md127)でアレイを認識することがあります。アレイの構成情報をmdadm.confに保存し、初期RAMディスク(initramfs)を再構築して、ブート初期段階で正しく検出されるようにします。

# 現在のアレイ構成を保存
sudo mkdir -p /etc/mdadm
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf

# 変更を反映するためにinitramfsを更新
sudo update-initramfs -u  # Debian / Ubuntu
# sudo dracut -f           # RHEL / CentOS / Rocky Linux

/etc/fstabでカーネル名(/dev/md0)を直接指定してマウントするのは不安定になりがちです。必ず一意のファイルシステムUUIDを取得して利用してください。

sudo blkid -s UUID -o value /dev/md0

出力されたUUID(例: e2f8c5b1-36a4-4df1-8e9a-24128f654b03)を使って、/etc/fstabに次の行を追加します。

UUID=e2f8c5b1-36a4-4df1-8e9a-24128f654b03 /mnt/raid_storage ext4 defaults,nofail 0 2

検証と監視:状態確認と故障ディスクの交換

アレイの正常性確認とリビルド進捗の追跡

アクティブなアレイを確認し、バックグラウンドでの同期処理をリアルタイムで追跡するには次を実行します。

cat /proc/mdstat

ディスクの詳細ステータス、RAIDタイプ、スーパーブロックのタイムスタンプを確認するには、アレイに直接問い合わせます(GUI環境でストレージ状態を一元管理したい場合はCockpit Webコンソールのストレージ管理機能も有用です)。

sudo mdadm --detail /dev/md0

Stateフィールドを確認してください。正常なアレイはcleanまたはactiveと表示されます。degradedと表示されている場合は、下部のアクティブドライブ概要からどのディスクが故障しているか特定します。

初回同期およびリビルド処理の高速化

Linuxカーネルは、デスクトップ環境やユーザー空間のI/Oを保護するため、デフォルトでバックグラウンド同期の速度を制限しています(通常、最小1,000 KB/s〜最大200,000 KB/s)。8TBディスク4台で構成されたRAID 5アレイの場合、標準設定のままではリビルドに30時間以上かかることがあります。NVMeおよびSATAアレイを備えたテスト環境において、以下のsysctlしきい値を調整したところ、リビルド時間を14時間から3時間未満へと大幅に短縮できました。

# リビルド速度の制限を最小50MB/s、最大500MB/sに引き上げ
echo 50000 | sudo tee /proc/sys/dev/raid/speed_limit_min
echo 500000 | sudo tee /proc/sys/dev/raid/speed_limit_max

# RAID 5/6のストライプキャッシュサイズを拡張(デフォルトは256ページ。4096または8192に設定)
echo 8192 | sudo tee /sys/block/md5/md/stripe_cache_size

故障ドライブの安全な交換手順

dmesgにI/Oエラーが記録されたり、/proc/mdstatでドライブに(F)フラグが付いたりした場合は、次の手順に沿ってストレージを停止させずに物理ディスクを交換します。

  1. ディスクを故障状態(Faulty)としてマーク:ディスクでエラーが多発しているものの完全には切断されていない場合、カーネルにI/Oのルーティングを停止するよう指示します。

    sudo mdadm --manage /dev/md0 --fail /dev/sdb
  2. アレイからディスクを切り離し:ソフトウェアスタックから障害の発生したドライブを取り外します。

    sudo mdadm --manage /dev/md0 --remove /dev/sdb
  3. 物理ハードウェアの交換:トレイをホットスワップするか、バックプレーンがホットプラグに対応していない場合はマシンをシャットダウンして交換します。新しいディスクは、元のドライブと同等以上の容量があることを確認してください。1セクタでも不足していると、mdadmに拒否されます。
  4. 交換用ドライブの追加:Linuxが新しいディスクを認識したら(lsblkで識別子を確認)、デグレード状態のアレイに追加します。

    sudo mdadm --manage /dev/md0 --add /dev/sdb
  5. リビルドの追跡:カーネルが自動的に同期を開始します。プログレスバー、予想完了時間、スループットを確認しながら見守ります。

    watch -n 2 cat /proc/mdstat

デグレード検知時のメール通知自動化

1台目の故障に気付かないまま2台目のドライブが停止すると、サイレントなハードウェア障害が致命的なデータ損失につながります。アレイがデグレード状態になった際に運用チームへ即時通知が届くよう、mdadmの監視デーモンを設定しておきましょう。/etc/mdadm/mdadm.confを編集します。

MAILADDR [email protected]

テスト通知を送信して、ローカルのメール転送エージェント(Postfixやmsmtpなど)が正しく動作することを確認します。

sudo mdadm --monitor --scan --test --oneshot

メールボックスを確認し、テストアラートを受信できたら、常時ヘルスチェックが行われるようにsystemdデーモンを有効化して起動します。

sudo systemctl enable --now mdmonitor
Share: