コンテンツにスキップ

Linux Software RAIDの仕組み

Linux MDは、複数のブロックデバイスをまとめ、冗長化または性能向上を行う仮想的なブロックデバイスを作る機能である。mdadmは、そのアレイを作成・組み立て・監視・保守する管理コマンドである。


LinuxカーネルのMD(Multiple Devices)ドライバーがデータの分散、複製、パリティ計算を処理する。mdadmはMDドライバーへ指示を出すユーザー空間の管理ツールであり、データ転送そのものを処理するデーモンではない。

アレイを作成すると、/dev/md0や/dev/md/dataのようなMDデバイスが現れる。このデバイスは通常のブロックデバイスとして扱えるため、その上にext4などのファイルシステムを作成する。

member devices MD array filesystem mount point
/dev/sdb1 ─┐
├────────> /dev/md0 ─────> ext4 ───────────> /srv/data
/dev/sdc1 ─┘

/dev/sdb1や/dev/sdc1を個別にマウントしてはいけない。ファイルシステムから見える書き込み先は/dev/md0であり、各メンバーへの書き込み方法はMDドライバーが決める。


次の容量は、特記のない限り同じ容量のメンバーで構成した場合の目安である。

RAIDレベル 最小メンバー数 データの配置 使用可能容量の目安 故障への耐性
RAID0 2 ブロックを複数デバイスへ分散する メンバー容量の合計 なし
RAID1 2 同じデータを各メンバーへ複製する 最小メンバー1台分 1台構成になるまで動作できる
RAID5 3 データと分散パリティを配置する 最小メンバー容量 ×(台数 − 1) 1台
RAID6 4 データと2組の分散パリティを配置する 最小メンバー容量 ×(台数 − 2) 2台
RAID10 2 複製と分散を組み合わせる コピー数2では合計容量の約半分 レイアウトと故障位置による

RAID0には冗長性がなく、1台の故障でアレイ全体のデータを失う。RAID1は全メンバーへ同じデータを書き込む。2台構成では1台が故障しても残り1台で読み書きを継続できる。

RAID5とRAID6はパリティから失われたデータを再計算する。RAID10はミラーのコピーとストライピングを組み合わせるため、故障可能台数はどのメンバーが故障したかによって変わる。

RAIDは動作継続性を高めるが、誤削除、上書き、マルウェア、ファイルシステム破損は各メンバーへ反映される。RAIDとは別にバックアップが必要である。


メンバーデバイスは、MDアレイを構成するディスクまたはパーティションである。アレイをパーティションで構成する場合は、容量と交換条件を分かりやすくするため、各メンバーのパーティションサイズをそろえる。

RAID1・5・6では、使用できる範囲が最小メンバーの容量を基準に決まる。Linux MDのRAID0は容量の異なるメンバーにも対応し、小さいメンバーを使い切った後は、残ったメンバーで別のstriping zoneを構成する。ただし、zoneごとにストライプ幅が変わり、交換用デバイスの条件も分かりにくくなるため、同容量でそろえる構成が扱いやすい。

アレイには次の台数がある。

  • Raid Devices:そのRAIDレベルでデータを保持するために定義されたメンバー数
  • Active Devices:現在アクティブなメンバー数
  • Working Devices:正常に認識されているアクティブメンバーとスペアの合計
  • Spare Devices:故障メンバーを置き換えられる待機デバイス数
  • Failed Devices:故障状態として記録されたメンバー数

MDメタデータは各メンバーへ記録されるアレイの管理情報である。アレイUUID、RAIDレベル、メンバーの役割、更新回数などが含まれ、mdadmはこの情報を照合して同じアレイのメンバーを組み立てる。

--metadata=1.2はバージョン1.2形式のメタデータを作成する。メタデータを各メンバーの先頭付近へ置く現在の一般的な形式である。アレイ上に作成したファイルシステムのUUIDと、MDアレイのUUIDは別の識別子である。

バージョン1.xのメタデータにはアレイ名も保存できる。--name=dataを指定すると、その名前がメタデータへ記録され、起動時の自動組み立てや/dev/md/dataのような名前付きデバイスの生成に利用される。アレイを構成するための必須情報はUUIDやRAIDレベルにも含まれるため、アレイ名の明示は任意である。

識別子 識別する対象 主な確認方法
MDアレイUUID MDアレイとそのメンバー mdadm --detail /dev/md0
ファイルシステムUUID /dev/md0上のファイルシステム blkid /dev/md0

mdadm --examine /dev/sdb1は、アレイを経由せずメンバーデバイスに記録されたMDメタデータを読む。mdadm --detail /dev/md0は、組み立てられたアレイ全体の状態を表示する。


cleanは、アレイのデータが各メンバー間で整合している状態である。degradedは、本来必要なアクティブメンバーが不足している状態である。RAID1はdegradedでも残存メンバーで動作できるが、さらに故障するとデータを失うため、交換と再構築が必要になる。

resyncは、作成直後や不整合の可能性があるときに、アレイ全体の内容をそろえる処理である。recoveryは、交換メンバーへ残存メンバーからデータを再構築する処理である。どちらも進捗は/proc/mdstatに表示される。

2台のRAID1では、[UU]が両方のメンバーが正常な状態、[U_]または[_U]が1台不足した状態を表す。[2/2]の左側は定義されたメンバー数、右側は稼働中のメンバー数である。


アクティブなメンバーは、そのままではアレイから取り外せない。交換では次の順序を使う。

  1. --failでメンバーを故障状態にする。
  2. --removeで故障メンバーをアレイから外す。
  3. 交換デバイスへ同等以上の大きさのRAID用パーティションを作る。
  4. --addで交換メンバーを追加する。
  5. recoveryが完了してcleanへ戻ることを確認する。

実際にI/Oエラーで故障したメンバーは、MDドライバーによって既にfaultyと判断されている場合がある。その場合も、アレイからremoveし、交換メンバーをaddすると再構築が始まる。


起動時には、先にMDアレイを組み立て、その後でアレイ上のファイルシステムをマウントする。

member metadata
-> mdadm / udev / initramfs assembles /dev/md0
-> systemd reads /etc/fstab
-> filesystem UUID is mounted on /srv/data

/etc/mdadm/mdadm.confのARRAY行は、MDアレイUUIDと組み立て先の名前を明示する。バージョン1.xのメタデータを持つローカルアレイは、AUTO設定で拒否されていなければARRAY行がなくても自動検出できる。固定した名前で確実に組み立てたい場合は、ARRAY行を記録する。アレイの実データを保持するのはメンバー側のMDメタデータであり、mdadm.confそのものではない。

initramfsは、ルートファイルシステムをマウントする前の一時的な起動環境である。update-initramfs -uにより、現在のmdadm設定をinitramfsへ反映する。ルートファイルシステムや、起動の早い段階で必要になるファイルシステムがRAID上にある場合に使用する。ルートファイルシステムの後でマウントするデータ用アレイでは、通常は/etc/mdadm/mdadm.confを直接読めるため必須ではない。

/etc/fstabにはファイルシステムUUIDとマウントポイントを記録する。/dev/md0という番号ではなくUUIDを使うことで、デバイス名の割り当てが変わっても同じファイルシステムを識別できる。


冗長性のあるアレイは、degradedになっても読み書きを継続できる。そのため、利用者が故障に気付かないまま残りのメンバーも故障することを防ぐには、状態変化を通知する仕組みが必要である。

Debianのmdmonitor.serviceは、redundant arrayの故障、degraded、recoveryなどのイベントを監視する。mdadm.confのMAILADDRへ通知先を設定するとメールで通知でき、PROGRAMを設定するとイベント発生時に任意のプログラムを実行できる。

scrubは、アレイ全体を読み出してミラーまたはパリティの不一致を調べる処理である。checkは整合性を検査し、検出した不一致数をmismatch_cntへ記録する。repairは不一致の修復も行うため、故障原因や正しいコピーを判断せずに実行しない。Debianのmdcheck_start.timerとmdcheck_continue.timerは、定期的なcheckを開始・継続するためのsystemd timerである。