第8章 RAIDの構築と管理
LPIC-2 204.1 相当
複数のディスクを組み合わせて冗長性や性能を高める技術がRAID(Redundant Array of Independent Disks)です。ここではLinuxのソフトウェアRAIDの基本を扱います。RAIDレベルの選択は、可用性・性能・容量効率のどれを優先するかというトレードオフの判断そのものであり、システム設計の初期段階で決めておくべき重要な項目です。
主なRAIDレベル
| レベル | 特徴 | 最低ディスク数 |
|---|---|---|
| RAID 0 | ストライピング。速度は上がるが冗長性はない(1台故障で全損) | 2台 |
| RAID 1 | ミラーリング。同じ内容を2台に書き込み、片方が壊れても継続可能 | 2台 |
| RAID 5 | 分散パリティ。1台までの故障に耐えられ、容量効率も比較的良い | 3台 |
| RAID 6 | RAID 5に加えてパリティを二重化。2台までの同時故障に耐えられる | 4台 |
| RAID 10 | ミラーリング + ストライピング。速度と冗長性を両立するが容量効率は低い | 4台 |
ハードウェアRAIDとソフトウェアRAIDの違い
| 方式 | 特徴 |
|---|---|
| ハードウェアRAID | 専用のRAIDコントローラ(BBU付きのキャッシュを持つことが多い)がパリティ計算を担当。OSからは1台のディスクとして見える。ベンダー独自のツールでの管理が必要 |
| ソフトウェアRAID(mdadm) | CPUがパリティ計算を担当。追加のハードウェアが不要で柔軟だが、CPU負荷がわずかに増える。Linux標準のmdadmで一貫した管理ができる |
LPIC-2ではLinux標準のソフトウェアRAID(mdadm)が主な出題対象です。実務では、性能要件や既存のインフラに応じて両者が使い分けられます。ハードウェアRAIDコントローラのBBU(バッテリーバックアップユニット)は、書き込みキャッシュを保持する電源として機能し、電源断が起きても未書き込みのデータをキャッシュに保持し続けることで、性能と信頼性を両立させています。ただし、コントローラ自体が故障した場合、同一機種・同一ファームウェアのコントローラでないとアレイを認識できないことがある点は、ソフトウェアRAIDに対するハードウェアRAIDの弱点としてよく挙げられます。一方でソフトウェアRAIDは追加のハードウェアを必要としないため、クラウドの仮想マシンのように専用のRAIDコントローラを持たない環境でも利用できるという利点があります。どちらを選ぶかは、性能要件・コスト・可搬性のバランスで判断します。
mdadm — ソフトウェアRAIDの管理
mdadm --createは指定したデバイス上に新しいメタデータを書き込みます。すでにデータが入っているパーティションや、既存の別のRAIDアレイのメンバーだったディスクを指定すると、その内容は失われます。実行前に対象デバイス名(/dev/sdb1など)に誤りがないか、他の用途で使われていないかを必ず確認してください。
$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device.
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
# /dev/sdb1と/dev/sdc1でRAID 1のアレイ /dev/md0 を作成
$ cat /proc/mdstat # RAIDアレイの状態を確認
Personalities : [raid1]
md0 : active raid1 sdc1[1] sdb1[0]
20970496 blocks super 1.2 [2/2] [UU]
[=====>...............] resync = 25.5% (267136/1046528) finish=1.2min speed=10000K/sec
$ sudo mdadm --detail /dev/md0 # 詳細情報を表示
Raid Level : raid1
Array Size : 20970496 (20.00 GiB)
Raid Devices : 2
Total Devices : 2
State : clean, resyncing
Active Devices : 2
Working Devices : 2
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
この行のこの値に注目: /proc/mdstatの[UU]は2台とも正常(Up)であることを示し、初回構築直後はresync(初期同期)の進捗バーが表示されます。mdadm --detailのState行がcleanのみ(resyncingを含まない)になれば同期完了です。
既存のアレイにディスクを追加して容量やディスク数を増やす場合は --grow を使います。
$ sudo mdadm --add /dev/md0 /dev/sde1 # 予備(スペア)としてディスクを追加
mdadm: added /dev/sde1
$ sudo mdadm --grow /dev/md0 --raid-devices=4 # アレイの構成台数を4台に拡張
mdadm: Need to backup 3072K of critical section..
この行のこの値に注目: --grow実行時のNeed to backup ...K of critical sectionは、構成変更の途中で電源断が起きても復旧できるよう、変更前のメタデータ領域を一時的にバックアップしていることを示します。この処理が終わるまでアレイの再構成(リシェイプ)が進行し、cat /proc/mdstatでreshapeの進捗が確認できます。
/dev/sdbなど)ではなく、パーティション(/dev/sdb1など)を使うのが一般的です。パーティションを切っておくことで、パーティションタイプを「Linux raid autodetect」相当に設定でき、また将来ディスクを交換する際もパーティション単位で扱いが明確になります。ディスク全体をそのままメンバーにすることもmdadm上は可能ですが、実務やLPIC-2の想定ではパーティション単位での構成が基本と考えてください。
RAID作成時には、メタデータのバージョンにも注意が必要です。近年のmdadmでは既定でmetadata=1.2が使われ、これはディスクの先頭付近にメタデータを配置する形式です。ブートディスクにRAIDを使う場合、GRUBが正しく認識できるメタデータバージョンかどうかを事前に確認しておく必要があります。
$ sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 --metadata=1.2 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid1 devices=2 ctime=Thu Aug 20 10:00:00 2026
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
# メタデータバージョンを明示してRAID 5アレイを作成
この行のこの値に注目: 過去に別のRAIDアレイやパーティションとして使われていたディスクを再利用する場合、appears to be part of a raid arrayという警告とContinue creating array? yという確認プロンプトが表示されます。意図しないディスクを巻き込んでいないか、ここで必ず確認してからyを入力します。
RAID 5/6における書き込みペナルティとライトホール
RAID 5・RAID 6では、1回の書き込みのたびにパリティの再計算が必要になるため、単純なミラーリング(RAID 1)よりも書き込み性能面でのオーバーヘッド(書き込みペナルティ)が大きくなります。また、書き込みの途中で電源断が発生すると、データブロックとパリティブロックの整合性が崩れる「ライトホール(write hole)」と呼ばれる問題も知られています。
故障ディスクの交換
ディスクの故障は/proc/mdstatの表示からも読み取れます。正常なメンバーはU(Up)、故障・欠落しているメンバーは_で表され、たとえばRAID 1で [2/1] [_U] のように表示されていれば、2台構成のうち1台しか正常でない(1台目が故障・欠落している)ことを意味します。
$ sudo mdadm /dev/md0 --fail /dev/sdc1 # 故障扱いにする
mdadm: set /dev/sdc1 faulty in /dev/md0
$ sudo mdadm /dev/md0 --remove /dev/sdc1 # アレイから取り外す
mdadm: hot removed /dev/sdc1 from /dev/md0
# 物理的にディスクを交換した後...
$ sudo mdadm /dev/md0 --add /dev/sdd1 # 新しいディスクを追加し再構築(rebuild)
mdadm: added /dev/sdd1
この行のこの値に注目: set ... faultyとhot removedが、それぞれの操作が正しく反映されたことの確認です。--addで新ディスクを追加すると自動的に再構築が始まり、進捗はcat /proc/mdstatのrecovery行で確認できます。
実際の障害対応では、いきなり--failを実行するのではなく、まずsmartctl(第4章)でそのディスクの健全性を確認し、本当に交換が必要かどうかを判断する手順を踏むことが多いです。また、ホットスワップ対応のハードウェアであれば、ディスクを物理的に抜く前に必ず--failと--removeでアレイから正式に切り離しておくことで、予期しないI/Oエラーの発生を防げます。
設定の永続化 — mdadm.conf
mdadmで作成したアレイは、そのままでは起動時に自動組み立て(アセンブル)されない環境があります。アレイの構成情報を設定ファイルに書き出しておくことで、再起動後も確実に同じ配列として認識されるようにします。
$ sudo mdadm --detail --scan >> /etc/mdadm/mdadm.conf # Debian系。正常時は無出力(リダイレクト先のファイルに追記されるのみ)
# /etc/mdadm/mdadm.conf に追記される内容の例
# ARRAY /dev/md0 metadata=1.2 name=web01:0 UUID=1a2b3c4d:5e6f7890:abcdef12:34567890
$ sudo update-initramfs -u # initramfsにも反映(Debian系)
update-initramfs: Generating /boot/initrd.img-6.8.0-49-generic
この行のこの値に注目: mdadm.confに追記されるARRAY行のUUIDが、起動時にどの物理デバイスをこのアレイとして組み立てるかを識別する鍵になります。デバイス名(/dev/sdb1など)は接続順序で変わる可能性がありますが、UUIDは変わらないため確実にアレイを再構成できます。
/etc/mdadm/mdadm.conf、initramfs再生成はupdate-initramfs -u)を例にしています。RHEL系では設定ファイルのパスが/etc/mdadm.conf(ディレクトリを挟まない)になり、initramfsの再生成にはdracut -fを使います。
再構築の監視と通知
ディスク交換後の再構築(rebuild)は、アレイの容量やディスク性能によっては長時間かかります。進捗は /proc/mdstat で確認できるほか、mdadm --monitor を常駐させることで、ディスク故障などのイベントをメールで通知させることも可能です。多くのディストリビューションではmdadm --monitor --daemonise --mail=admin@example.com --scanのような設定がmdmonitor.serviceなどのsystemdサービスとしてあらかじめ用意されており、/etc/mdadm/mdadm.confのMAILADDR行で通知先メールアドレスを指定するだけで有効化できます。
$ cat /proc/mdstat
md0 : active raid1 sdd1[2] sdc1[1]
1046528 blocks super 1.2 [2/1] [_U]
[=====>...............] recovery = 25.5% (267136/1046528) finish=1.2min speed=10000K/sec
--bitmap=internal オプションを付けてアレイを作成しておくと、一時的な切断からの復帰時に、差分(ダーティ領域)だけを再同期する「ライトインテントビットマップ」が使われ、フル再構築より大幅に時間を短縮できます。
RAID 10(ストライプ+ミラー)
本章で主に扱ったRAID 0・1・5に加えて、実務でよく採用されるのがRAID 10(1+0とも呼ばれる)です。これはディスクをまずペアでミラーリング(RAID 1)し、そのミラーペアを複数組ストライピング(RAID 0)でまとめる構成です。最低4台のディスクが必要になりますが、RAID 5よりも書き込み性能に優れ、複数台の同時故障にもペアの組み合わせ次第では耐えられるという利点があります。パリティ計算が不要なため再構築も高速で、データベースサーバーのようにI/O性能と信頼性の両方が求められる用途でよく選ばれます。
$ sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sd[b-e]1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
この行のこの値に注目: RAID 10も他のレベル同様にarray /dev/md0 startedで作成完了です。cat /proc/mdstatで確認するとraid10という表記になり、内部的にはミラーとストライプが組み合わさった構成であることが分かります。