第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 6RAID 5に加えてパリティを二重化。2台までの同時故障に耐えられる4台
RAID 10ミラーリング + ストライピング。速度と冗長性を両立するが容量効率は低い4台
RAID 10とRAID 0+1の違い: どちらもミラーリングとストライピングを組み合わせますが、構成順序が異なります。RAID 10(正確には1+0)はまずディスクをミラーリングでペア化し、そのペアをストライピングします。この構成では、各ミラーペアのうち1台ずつ、合計で最大2台まで同時故障しても生き残る可能性があります。一方RAID 0+1はまずストライピングしたセットを2つ作り、それらをミラーリングするため、片方のストライプ内で1台でも故障すると、そのストライプセット全体が失われ、実質的に片系運転と同じ状態になります。同じディスク構成数でも耐障害性はRAID 10のほうが優れているとされます。
Disk1 Disk2 Disk3 Disk4 RAID 0 冗長性なし A1 A2 A3 A4 RAID 1 ミラーリング A1 A1 A2 A2 RAID 5 分散パリティ A1 A2 P0 B1 P1 B2 P2 C1 C2 RAID 6 二重パリティ A1 A2 Pa Qa Qb B1 Pb B2 RAID 10 ミラー+ストライプ A1 A1 A2 A2 ペア内でミラー、ペア間でストライプ =データブロック =パリティ =ミラーコピー
主なRAIDレベルにおけるブロック配置とパリティの位置。RAID 0はデータを分散するだけで冗長性がなく、RAID 1は同じデータを複数台に複製します。RAID 5は各ディスクにデータとパリティ(薄い黄色)を分散配置し、RAID 6はパリティを二重化してさらに耐障害性を高めます。RAID 10はミラーリングしたペアをストライピングし、速度と冗長性を両立します。

ハードウェア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の進捗が確認できます。

よくある間違い: RAIDアレイの構成には、ディスク全体(/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)」と呼ばれる問題も知られています。

ライトホール対策: mdadmでは、書き込み中の状態を記録する「ジャーナル(journal)」デバイスを別途割り当てることで、この問題を軽減できます。信頼性が特に重要な用途では、UPSによる不意の電源断対策とあわせて検討する価値があります。

故障ディスクの交換

ディスクの故障は/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エラーの発生を防げます。

重要: RAID 1やRAID 5などの冗長構成は「可用性」を高める仕組みであり、「バックアップ」の代わりにはなりません。誤って削除したファイルや、論理的な破損はRAIDでは守れないため、別途バックアップが必要です(第8章で扱います)。

設定の永続化 — 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は変わらないため確実にアレイを再構成できます。

ディストリビューションによる違い: ここまでの手順はDebian系(設定ファイルは/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という表記になり、内部的にはミラーとストライプが組み合わさった構成であることが分かります。

確認クイズ

Q1. 1台のディスク故障に耐えられ、容量効率も比較的良いとされるRAIDレベルはどれですか?

解説: RAID 5は分散パリティ方式で、1台までのディスク故障に耐えられ、RAID 1やRAID 10に比べて容量効率が良いのが特徴です。

Q2. 冗長性を持たず、1台でも故障するとデータが失われるRAIDレベルはどれですか?

解説: RAID 0(ストライピング)は速度向上が目的で冗長性を持たないため、1台の故障でアレイ全体のデータが失われます。

Q3. LinuxでソフトウェアRAIDのアレイを作成・管理するコマンドはどれですか?

解説: mdadm はLinuxのソフトウェアRAID(mdデバイス)を作成・管理するための標準的なコマンドです。

Q4. RAIDについて正しい説明はどれですか?

解説: RAIDはディスク故障に対する可用性を高めますが、誤削除やファイルの論理的破損には対応できないため、バックアップの代替にはなりません。