RAID 設定と管理 包括的ガイド
目次
- はじめに
- RAID レベル
- ハードウェア RAID vs ソフトウェア RAID
- mdadm による RAID 作成
- RAID の管理
- RAID の監視とアラート
- スペアドライブ
- RAID リビルドプロセス
- RAID のパフォーマンス特性
- RAID の縮退とハンドリング
- RAID の移行とリシェイプ
- トラブルシューティング
- ベストプラクティス
- 参考文献
1. はじめに
RAID (Redundant Array of Independent Disks) は、複数のディスクを組み合わせて信頼性やパフォーマンスを向上させる技術である。本ガイドでは、Linux における mdadm を使用したソフトウェア RAID の構成、管理、監視について包括的に解説する。
1.1 RAID の目的
| 目的 | 説明 |
|---|
| 冗長性 | ディスク障害時にデータを保護 |
| パフォーマンス | 読み書き速度の向上 |
| 大容量化 | 複数のディスクを結合して大きなボリュームを作成 |
2. RAID レベル
2.1 RAID レベル比較表
| 項目 | RAID 0 | RAID 1 | RAID 5 | RAID 6 | RAID 10 |
|---|
| 別名 | ストライピング | ミラーリング | 分散パリティ | 二重パリティ | ストライプドミラー |
| 最小ディスク数 | 2 | 2 | 3 | 4 | 4 |
| 冗長性 | なし | 1台障害OK | 1台障害OK | 2台障害OK | ミラーペア内1台OK |
| 利用可能容量 | N x 容量 | 容量 / 2 | (N-1) x 容量 | (N-2) x 容量 | N x 容量 / 2 |
| 読み取り性能 | 非常に高い | 高い | 高い | 高い | 非常に高い |
| 書き込み性能 | 非常に高い | 普通 | 中程度 | やや低い | 中程度 |
| リビルド時間 | N/A | 短い | 長い | 非常に長い | 中程度 |
| コスト効率 | 最良 | 低い | 良い | 良い | 低い |
| 用途 | テンポラリ | OS, ログ | データ | 重要データ | DB, 高性能 |
2.2 RAID 0 (ストライピング)
RAID 0: データを複数のディスクに分散して書き込み
ディスク1 ディスク2 ディスク3
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Block A1 │ │ Block A2 │ │ Block A3 │
│ Block B1 │ │ Block B2 │ │ Block B3 │
│ Block C1 │ │ Block C2 │ │ Block C3 │
│ Block D1 │ │ Block D2 │ │ Block D3 │
└─────────┘ └─────────┘ └─────────┘
利点: 読み書きが最速。全容量使用可能
欠点: 冗長性なし。1台でも故障するとデータ全損
2.3 RAID 1 (ミラーリング)
RAID 1: データの完全なコピーを複数のディスクに保持
ディスク1 ディスク2
┌─────────┐ ┌─────────┐
│ Block A │ │ Block A │ (同一データ)
│ Block B │ │ Block B │ (同一データ)
│ Block C │ │ Block C │ (同一データ)
│ Block D │ │ Block D │ (同一データ)
└─────────┘ └─────────┘
利点: 高い冗長性。読み取り速度向上
欠点: 容量効率50%。書き込み速度は単体と同等
2.4 RAID 5 (分散パリティ)
RAID 5: データとパリティを分散配置
ディスク1 ディスク2 ディスク3 ディスク4
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ Block A1 │ │ Block A2 │ │ Block A3 │ │ Parity A│
│ Block B1 │ │ Block B2 │ │ Parity B│ │ Block B3│
│ Block C1 │ │ Parity C│ │ Block C2 │ │ Block C3│
│ Parity D│ │ Block D1 │ │ Block D2 │ │ Block D3│
└─────────┘ └─────────┘ └─────────┘ └─────────┘
パリティ = データブロックの XOR
容量 = (N-1) x ディスク容量
利点: 容量効率が良い。1台の障害に耐性
欠点: 書き込みにパリティ計算が必要 (write penalty)
リビルド中に2台目が故障するとデータ全損
2.5 RAID 6 (二重パリティ)
RAID 6: 2つの独立したパリティ (P + Q)
ディスク1 ディスク2 ディスク3 ディスク4 ディスク5
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ Block A1 │ │ Block A2 │ │ Block A3 │ │ParityAP │ │ParityAQ │
│ Block B1 │ │ Block B2 │ │ParityBP │ │ParityBQ │ │ Block B3│
│ Block C1 │ │ParityCP │ │ParityCQ │ │ Block C2 │ │ Block C3│
│ParityDP │ │ParityDQ │ │ Block D1 │ │ Block D2 │ │ Block D3│
└─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘
容量 = (N-2) x ディスク容量
利点: 2台同時障害に耐性
欠点: 書き込み性能がさらに低下
2.6 RAID 10 (1+0, ストライプドミラー)
RAID 10: ミラーペアのストライプ
ストライプ (RAID 0)
┌─────────────────┬─────────────────┐
│ ミラー 1 │ ミラー 2 │
│ (RAID 1) │ (RAID 1) │
│ │ │
│ Disk1 Disk2 │ Disk3 Disk4 │
│┌─────┐┌─────┐ │┌─────┐┌─────┐ │
││ A1 ││ A1 │ ││ A2 ││ A2 │ │
││ B1 ││ B1 │ ││ B2 ││ B2 │ │
││ C1 ││ C1 │ ││ C2 ││ C2 │ │
│└─────┘└─────┘ │└─────┘└─────┘ │
└─────────────────┴─────────────────┘
利点: 高性能 + 高冗長性。リビルドが高速
欠点: 容量効率50%。最低4台必要
3. ハードウェア RAID vs ソフトウェア RAID
3.1 比較表
| 項目 | ハードウェア RAID | ソフトウェア RAID (mdadm) |
|---|
| CPU 負荷 | 低い (専用コントローラ) | やや高い (CPU で処理) |
| コスト | 高い (専用カード必要) | 低い (ソフトウェアのみ) |
| パフォーマンス | 高い (BBU, キャッシュ) | 良い (最新CPUでは十分) |
| 柔軟性 | 低い (ベンダー依存) | 高い (Linux標準) |
| 移植性 | 低い (コントローラ依存) | 高い (他のLinuxで認識可能) |
| バッテリバックアップ | あり (BBU) | なし (UPS で代替) |
| ホットスワップ | サポート | サポート |
| 管理ツール | ベンダー提供 | mdadm (標準) |
| 障害検出 | ハードウェアレベル | OS レベル |
| フェイクRAID | 注意: BIOS RAIDは実質ソフトウェアRAID | - |
3.2 推奨選択基準
┌─────────────────────────────────────────┐
│ ハードウェア RAID を推奨する場合: │
│ ・大量のディスク (12台以上) │
│ ・ミッションクリティカルなワークロード │
│ ・BBU によるライトキャッシュが必要 │
│ ・CPU リソースを節約したい │
├─────────────────────────────────────────┤
│ ソフトウェア RAID (mdadm) を推奨する場合:│
│ ・コストを抑えたい │
│ ・少数のディスク (2-6台) │
│ ・柔軟な構成変更が必要 │
│ ・クラウド/仮想環境 │
│ ・ベンダーロックインを避けたい │
└─────────────────────────────────────────┘
4. mdadm による RAID 作成
4.1 前提条件
apt install mdadm
dnf install mdadm
for disk in sdb sdc sdd sde; do
parted -s /dev/$disk -- mklabel gpt mkpart primary 1MiB -1MiB set 1 raid on
done
lsblk
4.2 RAID 0 の作成
mdadm --create /dev/md0 --level=0 --raid-devices=2 \
/dev/sdb1 /dev/sdc1
cat /proc/mdstat
mdadm --detail /dev/md0
4.3 RAID 1 の作成
mdadm --create /dev/md1 --level=1 --raid-devices=2 \
/dev/sdb1 /dev/sdc1
cat /proc/mdstat
4.4 RAID 5 の作成
mdadm --create /dev/md5 --level=5 --raid-devices=3 \
--spare-devices=1 \
/dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm --create /dev/md5 --level=5 --raid-devices=3 \
--chunk=256 \
/dev/sdb1 /dev/sdc1 /dev/sdd1
cat /proc/mdstat
4.5 RAID 6 の作成
mdadm --create /dev/md6 --level=6 --raid-devices=4 \
--spare-devices=1 \
/dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1
cat /proc/mdstat
4.6 RAID 10 の作成
mdadm --create /dev/md10 --level=10 --raid-devices=4 \
/dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm --create /dev/md10 --level=10 --layout=f2 \
--raid-devices=4 \
/dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
cat /proc/mdstat
4.7 ファイルシステム作成とマウント
mkfs.ext4 /dev/md5
mkfs.xfs /dev/md5
mkdir -p /data
mount /dev/md5 /data
blkid /dev/md5
echo "UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data ext4 defaults,nofail 0 2" >> /etc/fstab
5. RAID の管理
5.1 /proc/mdstat
cat /proc/mdstat
watch -n 1 cat /proc/mdstat
5.2 mdadm.conf
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
cat /etc/mdadm/mdadm.conf
update-initramfs -u
dracut --force
5.3 mdadm の主要操作
mdadm --detail /dev/md5
mdadm --examine /dev/sdb1
mdadm --stop /dev/md5
mdadm --assemble /dev/md5
mdadm --assemble --scan
6. RAID の監視とアラート
6.1 mdadm モニターデーモン
echo "MAILADDR admin@example.com" >> /etc/mdadm/mdadm.conf
systemctl enable --now mdmonitor
mdadm --monitor --scan --daemonise --mail=admin@example.com --delay=300
mdadm --monitor --scan --test --oneshot
6.2 カスタム監視スクリプト
#!/bin/bash
MAILTO="admin@example.com"
HOSTNAME=$(hostname)
ALERT=false
REPORT=""
for md in /dev/md*; do
[ -b "$md" ] || continue
STATUS=$(mdadm --detail "$md" 2>/dev/null)
STATE=$(echo "$STATUS" | grep "State :" | awk '{print $NF}')
FAILED=$(echo "$STATUS" | grep "Failed Devices" | awk '{print $NF}')
DEGRADED=$(echo "$STATUS" | grep -c "removed\|faulty")
if [ "$STATE" != "clean" ] && [ "$STATE" != "active" ]; then
ALERT=true
REPORT+="WARNING: $md is in state: $STATE\n"
fi
if [ "$FAILED" -gt 0 ]; then
ALERT=true
REPORT+="CRITICAL: $md has $FAILED failed device(s)\n"
fi
done
if [ "$ALERT" = true ]; then
echo -e "RAID Alert on $HOSTNAME\n\n$REPORT\n\n$(cat /proc/mdstat)" | \
mail -s "RAID Alert: $HOSTNAME" "$MAILTO"
fi
6.3 SMART 監視との組み合わせ
apt install smartmontools
dnf install smartmontools
smartctl -a /dev/sdb
smartctl -t short /dev/sdb
smartctl -t long /dev/sdb
smartctl -l selftest /dev/sdb
echo "/dev/sdb -a -o on -S on -s (S/../.././02|L/../../6/03) -m admin@example.com" >> /etc/smartd.conf
systemctl enable --now smartd
7. スペアドライブ
7.1 スペアドライブの管理
mdadm --add /dev/md5 /dev/sde1
mdadm --detail /dev/md5 | grep spare
mdadm --remove /dev/md5 /dev/sde1
7.2 ホットスペアの自動リビルド
ディスク障害発生時の自動リビルドフロー:
[正常状態] → [ディスク障害検出] → [障害ディスクの無効化]
│ │
│ ▼
│ [スペアドライブが
│ 利用可能か?]
│ ↙ ↘
│ Yes No
│ ↓ ↓
│ [自動リビルド [縮退状態で
│ 開始] 継続]
│ ↓ ↓
│ [リビルド完了] [管理者に
│ ↓ アラート]
│ [正常状態に
└──────────────────────── 復帰]
8. RAID リビルドプロセス
8.1 障害のシミュレーションとリビルド
mdadm --fail /dev/md5 /dev/sdc1
cat /proc/mdstat
mdadm --remove /dev/md5 /dev/sdc1
parted -s /dev/sdc -- mklabel gpt mkpart primary 1MiB -1MiB set 1 raid on
mdadm --add /dev/md5 /dev/sdc1
cat /proc/mdstat
cat /proc/sys/dev/raid/speed_limit_min
cat /proc/sys/dev/raid/speed_limit_max
echo 50000 > /proc/sys/dev/raid/speed_limit_min
echo 500000 > /proc/sys/dev/raid/speed_limit_max
8.2 リビルド時間の目安
| RAID レベル | ディスクサイズ | おおよその時間 |
|---|
| RAID 1 | 1 TB | 2-4 時間 |
| RAID 5 | 1 TB (各ディスク) | 4-8 時間 |
| RAID 6 | 1 TB (各ディスク) | 8-16 時間 |
| RAID 10 | 1 TB | 2-4 時間 |
注: 実際の時間はディスク速度、I/O 負荷、リビルド速度設定に依存
9. RAID のパフォーマンス特性
9.1 RAID レベル別パフォーマンス比較
| 操作 | RAID 0 | RAID 1 | RAID 5 | RAID 6 | RAID 10 |
|---|
| シーケンシャル読み取り | N倍 | 2倍 | (N-1)倍 | (N-2)倍 | N/2倍 |
| シーケンシャル書き込み | N倍 | 1倍 | (N-1)倍相当 | (N-2)倍相当 | N/2倍 |
| ランダム読み取り | N倍 | 2倍 | (N-1)倍 | (N-2)倍 | N倍 |
| ランダム書き込み | N倍 | 1倍 | 1/4倍 | 1/6倍 | N/2倍 |
| IOPS (読み取り) | 非常に高い | 高い | 高い | 高い | 非常に高い |
| IOPS (書き込み) | 非常に高い | 普通 | 低い | 非常に低い | 高い |
N = ディスク数
9.2 パフォーマンスチューニング
echo 8192 > /sys/block/md5/md/stripe_cache_size
blockdev --setra 4096 /dev/md5
echo deadline > /sys/block/sdb/queue/scheduler
fio --name=seqread --ioengine=libaio --iodepth=16 \
--rw=read --bs=1M --direct=1 --size=1G \
--filename=/dev/md5
fio --name=randwrite --ioengine=libaio --iodepth=32 \
--rw=randwrite --bs=4k --direct=1 --size=1G \
--filename=/dev/md5
10. RAID の縮退とハンドリング
10.1 縮退状態の検出
cat /proc/mdstat
mdadm --detail /dev/md5 | grep -E "State|Failed"
echo check > /sys/block/md5/md/sync_action
cat /proc/mdstat
cat /sys/block/md5/md/mismatch_cnt
10.2 縮退状態での対応
dmesg | grep -i "md\|raid\|error"
journalctl -u mdmonitor
mdadm --detail /dev/md5
smartctl -i /dev/sdc | grep "Serial Number"
mdadm --remove /dev/md5 /dev/sdc1
parted -s /dev/sdc -- mklabel gpt mkpart primary 1MiB -1MiB set 1 raid on
mdadm --add /dev/md5 /dev/sdc1
watch -n 5 cat /proc/mdstat
11. RAID の移行とリシェイプ
11.1 RAID レベルの変更
mdadm --add /dev/md1 /dev/sdd1
mdadm --grow /dev/md1 --level=5 --raid-devices=3
cat /proc/mdstat
11.2 RAID のサイズ変更 (grow)
mdadm --add /dev/md5 /dev/sde1
mdadm --grow /dev/md5 --raid-devices=4
resize2fs /dev/md5
xfs_growfs /data
mdadm --grow /dev/md5 --chunk=256
mdadm --grow /dev/md5 --raid-devices=4 \
--backup-file=/root/md5-reshape-backup
11.3 RAID の再構築
mdadm --assemble /dev/md5 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm --assemble --scan
mdadm --assemble --force /dev/md5 /dev/sdb1 /dev/sdd1
mdadm --examine /dev/sdb1
12. トラブルシューティング
12.1 一般的な問題と解決策
| 問題 | 原因 | 解決策 |
|---|
| RAID がブート時に認識されない | mdadm.conf 未設定 | mdadm --detail --scan >> /etc/mdadm.conf、initramfs 更新 |
| リビルドが進まない | I/O 過負荷 | speed_limit_min/max の調整 |
| RAID が縮退状態 | ディスク障害 | 障害ディスクの交換と再追加 |
| パフォーマンス低下 | リビルド中 | 完了まで待つ。speed_limit の調整 |
| 整合性エラー | ビット腐敗 | echo repair > /sys/block/md5/md/sync_action |
| RAID が起動しない | スーパーブロック損傷 | --force での再構築 |
| 誤ってアレイを停止 | mdadm --stop 実行 | mdadm --assemble --scan |
12.2 診断コマンド集
cat /proc/mdstat
mdadm --detail /dev/md5
mdadm --examine /dev/sdb1
dmesg | grep -i "md\|raid"
journalctl -u mdmonitor --since today
smartctl -H /dev/sdb
smartctl -A /dev/sdb
iostat -x 1 5
hdparm -tT /dev/md5
12.3 スーパーブロックの修復
mdadm --zero-superblock /dev/sdb1
mdadm --create /dev/md5 --level=5 --raid-devices=3 \
--assume-clean \
/dev/sdb1 /dev/sdc1 /dev/sdd1
13. ベストプラクティス
13.1 RAID 設計のベストプラクティス
| 項目 | 推奨事項 |
|---|
| RAID レベル選択 | データの重要度と性能要件に基づいて選択 |
| ディスクサイズ | 同じサイズのディスクを使用 |
| ディスクブランド | 異なるロットやメーカーを混在させることを推奨 |
| スペアドライブ | 常に1台以上のホットスペアを確保 |
| 監視 | mdmonitor + SMART 監視を有効化 |
| バックアップ | RAID はバックアップの代替ではない! |
| テスト | 定期的な整合性チェック |
| ドキュメント | RAID 構成を記録 |
13.2 RAID は バックアップではない
重要な注意:
RAID はハードウェア障害に対する保護を提供するが、
以下のリスクからデータを保護しない:
✗ ソフトウェアのバグ
✗ ユーザーの誤操作 (rm -rf)
✗ ランサムウェア / マルウェア
✗ 災害 (火災、洪水)
✗ コントローラの障害
✗ ファイルシステムの破損
✗ 電源障害による corruption
RAID + 定期バックアップ = 適切なデータ保護策
13.3 定期メンテナンス
0 1 * * 0 root echo check > /sys/block/md5/md/sync_action
0 2 * * 6 root smartctl -t long /dev/sdb
0 2 * * 6 root smartctl -t long /dev/sdc
0 2 * * 6 root smartctl -t long /dev/sdd
mdadm --detail --scan > /etc/mdadm/mdadm.conf
update-initramfs -u
13.4 RAID レベル選択ガイド
用途別 RAID レベル推奨:
┌─────────────────────────┬─────────┐
│ 用途 │ 推奨 │
├─────────────────────────┼─────────┤
│ テンポラリ/キャッシュ │ RAID 0 │
│ OS ドライブ │ RAID 1 │
│ ファイルサーバー │ RAID 5 │
│ 重要データベース │ RAID 10 │
│ アーカイブストレージ │ RAID 6 │
│ 仮想化ストレージ │ RAID 10 │
│ ログサーバー │ RAID 5 │
│ メールサーバー │ RAID 10 │
└─────────────────────────┴─────────┘
14. 参考文献
- Linux RAID Wiki - https://raid.wiki.kernel.org/
- mdadm man page - https://man7.org/linux/man-pages/man8/mdadm.8.html
- Red Hat - Managing RAID - https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/managing_storage_devices/managing-raid_managing-storage-devices
- Linux Software RAID FAQ - https://raid.wiki.kernel.org/index.php/Linux_Raid
- Arch Linux Wiki - RAID - https://wiki.archlinux.org/title/RAID
- smartmontools - https://www.smartmontools.org/
- Storage Performance Council - https://www.storageperformance.org/
- SNIA (Storage Networking Industry Association) - https://www.snia.org/
本ドキュメントは Linux における RAID 設定と管理について包括的にまとめたものである。RAID はデータの可用性を向上させるが、バックアップの代替にはならない。必ず定期的なバックアップと組み合わせて運用すること。