障害が発生したRAID1アレイ(/dev/md1)の縮小手順
重要: 本手順は実運用システムでのデータ破損リスクを伴います。実施前に必ずバックアップを取り、手順を全て理解してから実行してください。
目的と前提
このガイドは次の状況を対象としています。
- RAID1 アレイ /dev/md1 (/dev/sda5 と /dev/sdb5 で構成)が劣化しており /dev/sda5 が故障している。
- LVM(PV=/dev/md1、VG=server1、LV=/dev/server1/root と /dev/server1/swap_1)が存在する。
- /dev/md1 の物理サイズを小さくし(例: 5GB → 4GB)、LVM とファイルシステムをそれに合わせて安全に縮小したい。
定義(1行説明):
- RAID1: 同じデータを複数のディスクに書くミラー方式。
- PV/VG/LV: LVM の物理ボリューム、ボリュームグループ、論理ボリューム。
前提条件(チェックリスト)
- 重要データのバックアップを取得済み。
- root 権限で操作できること。
- 故障ディスク(この例では /dev/sda5)が既に認識できない、または除外対象であること。
- rescue(ライブ)環境で作業できること。
- mdadm、lvm2(pvdisplay, vgdisplay, lvdisplay, resize2fs, lvreduce, pvresize, lvcreate)などが利用可能であること。
重要: 以下操作はブート不可能になるリスクを含みます。特に superblock を上書きする操作は、再追加やリビルドの意図がある場合以外は慎重に。
現況の確認(実行例)
ソースの実行例(そのまま残しています):
cat /proc/mdstat
server1:~# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdb5[1]
4988032 blocks [2/1] [_U]
md0 : active raid1 sda1[0] sdb1[1]
248896 blocks [2/2] [UU]
unused devices:
server1:~#
ファイルシステム、LVM の情報も確認してください:
df -h
pvdisplay
vgdisplay
lvdisplay
これらのコマンドで、PV が /dev/md1 で、VG が server1、LV が /dev/server1/root (4.5GB) と /dev/server1/swap_1 (264MB) であることを確認できます。
なぜこの順序で縮小するのか(オーバービュー)
LVM とファイルシステムの関係は次の順序で考える必要があります:
- ファイルシステム(ext4 等)は論理ボリューム(LV)の上にある。従ってファイルシステムを小さくしないと LV を小さくできない。
- LV は PV の上にある。複数の LV の合計サイズは PV サイズ以下でなければならない。
- PV は物理デバイス(ここでは /dev/md1)にマップされる。したがって PV を小さくする前に、LV とファイルシステムが PV に収まることを保証する必要がある。
結果として、安全な縮小手順は「ファイルシステムの縮小 → LV の縮小 → 不要 LV の削除(必要な場合)→ PV の縮小 → RAID の縮小(mdadm –grow –size)」の順となります。
全体手順(概要)
- 故障ディスクをアレイから確実に外す。
- 故障ディスクの superblock を上書きして、再誤認を防ぐ。
- rescue 環境で RAID と LVM を有効化する。
- ファイルシステムをチェックし、縮小できる最小サイズを決定する。
- resize2fs でファイルシステムを縮小。
- lvreduce で LV を縮小。
- 不要な LV(swap 等)が末尾にあるなら削除して PV を縮小。
- mdadm –grow で /dev/md1 を希望サイズに縮小(KiB 単位、64 の倍数に注意)。
- pvresize で PV を更新。
- 必要に応じて LV を再作成、ファイルシステムを拡張して最終調整。
- 故障ディスクを再追加してリビルド。
以下に詳細な手順、コマンドと注意点を載せます。
手順詳細
ステップ 1: 故障ディスクをアレイから外す
まず /dev/sda5 を明示的に fail と remove して、アレイがそれを使わないようにします。
mdadm --manage /dev/md1 --fail /dev/sda5
mdadm --manage /dev/md1 --remove /dev/sda5
重要: 半端な状態で再起動すると autostart の設定によって再認識される可能性があります。次に行う superblock の上書きは必須です。
ステップ 2: 故障ディスクの superblock を上書きする
この操作を忘れると、縮小後の再起動でシステムが正しく起動しなくなることがあります。慎重に実行してください。
mdadm --zero-superblock /dev/sda5
注意: これによりそのパーティションは mdadm によるアレイの一部としては無効化されます。データ復旧目的でディスクを保持したい場合は別の対策が必要です。
ステップ 3: rescue 環境でモジュールを有効にし、RAID と LVM を起動する
rescue 環境で以下を実行して必要なカーネルモジュールを読み込みます。読み込み順は厳密ではありませんが、必要なものを全て有効にしてください。
modprobe md
modprobe linear
modprobe multipath
modprobe raid0
modprobe raid1
modprobe raid5
modprobe raid6
modprobe raid10
mdadm を使ってアレイをアクティブ化します。
cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_orig
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
mdadm -A --scan
LVM を開始します。
/etc/init.d/lvm start
ステップ 4: ファイルシステムの整合性をチェック
縮小前にファイルシステムチェックを行い、問題がないことを確認します。
e2fsck -f /dev/server1/root
出力のエラーがある場合はまず修復してください。修復できない場合はまずデータ復旧・バックアップを優先してください。
ステップ 5: ファイルシステムを縮小する
ファイルシステム(例: ext4)が LV サイズより小さくなるように resize2fs で縮小します。ここでは例として 2G に縮小していますが、実際はファイルの合計サイズと少しの余裕を見て決めてください。
resize2fs /dev/server1/root 2G
注意: 指定サイズはファイルシステム内の使用量より大きくなければなりません。失敗するとデータ損失のリスクがあります。
ステップ 6: LV を縮小する
ファイルシステムが安全に縮小できたことを確認したら LV を縮小します(ここでは 2.5G にします)。
lvreduce -L2.5G /dev/server1/root
ssh やコンソールの接続が切れてプロセスが中断されると危険です。できればローカルコンソールで実施してください。
ステップ 7: 末尾の LV(swap 等)を削除して PV を縮小する
例では /dev/server1/swap_1 がディスク末尾にあり、PV の縮小の障害になるため一時的に削除しています。swap が末尾にない場合はこの削除は不要です。削除する場合:
lvremove /dev/server1/swap_1
その後 PV を小さく設定します(例: PV を物理アレイ上で 3G に設定)。pvresize の –setphysicalvolumesize を使います。
pvresize --setphysicalvolumesize 3G /dev/md1
注意: PV の物理サイズを小さくする時は LV がその範囲内に収まっていることを再度確認してください。
ステップ 8: RAID 自体のサイズを縮小する
ここが最も注意が必要な部分です。mdadm –grow –size には KiB 単位の値を与えます。4GB にする場合、4 x 1024 x 1024 = 4194304 KiB です。値は 64 の倍数である必要があります。
mdadm --grow /dev/md1 --size=4194304
mdadm はアレイのメタデータやパリティ(RAID5/6等)に応じて内部で再配置を行うので、アレイの種類によっては制約や追加手順があります。RAID1 では単純にミラーを小さくする操作になりますが、実行前にリスクを理解してください。
ステップ 9: PV を最大に再調整
mdadm でアレイを小さくした後に、pvresize を実行して LVM 側に新しいデバイスサイズを認識させます。サイズ指定をしない場合、pvresize は利用可能な最大領域を使います。
pvresize /dev/md1
その後、vgdisplay で Free PE を確認します。
ステップ 10: 必要な LV を再作成し、ファイルシステムを最終調整
例では swap を復元し、root LV の残り空きで拡張しています。例:
lvcreate --name swap_1 -l 66 server1
mkswap /dev/server1/swap_1
空き PE を /dev/server1/root に割り当てます。
lvextend -l +317 /dev/server1/root
resize2fs /dev/server1/root
最後にファイルシステムチェックを再実行します:
e2fsck -f /dev/server1/root
ステップ 11: 正常起動後に故障ディスクを再追加する
通常起動に戻ったら、故障ディスクを再初期化してアレイに追加します。
mdadm --zero-superblock /dev/sda5
mdadm -a /dev/md1 /dev/sda5
cat /proc/mdstat
出力に /dev/sdb5 と /dev/sda5 の同期が表示されれば成功です。
よくある問題とトラブルシューティング
- resize2fs が失敗する: 指定したサイズがファイルシステム内の使用量より小さい可能性があります。du や df、tune2fs -l 等で使用量を確認してから再試行してください。
- pvresize がサイズを縮小できない: LV がまだ PV の末尾を使用しているか、PV のメタデータが想定外の配置になっている可能性があります。pvs -v –segments でセグメント配置を確認してください。
- mdadm –grow がエラーを出す: 指定サイズが 64 の倍数ではない、またはアレイのメンバーが再同期中である可能性があります。同期完了を待つか、正しいサイズを指定してください。
- ブートしなくなった: ブートローダーや /boot の LV が PV 縮小や mdadm 操作で影響を受けた可能性があります。rescue 環境に戻して /boot の状態、fstab、initramfs を確認してください。
代替アプローチ
- 新しいディスクを追加して既存のデータを移行する方法: 現行のアレイを無理に縮小する代わりに、新しいディスクで新しいアレイを作成し、データを丸ごとコピーして切り替える方法は安全性が高い。
- スナップショットを使ったオフライン縮小: LVM スナップショットやファイルシステムのバックアップを取り、クリーンインストール後に復元する方法もある。
いつこの手順が適さないか(カウンタ例)
- RAID の書き込みが多数発生する稼働中システムでダウンタイムが許容できない場合。
- ディスクの物理故障が疑われ、データ復旧が必要な場合(まずは復旧を優先)。
役割別チェックリスト
- システム管理者:
- バックアップ取得、手順のレビュー、作業ウィンドウ確保。
- 運用リーダー:
- ダウンタイムと影響範囲の通知。
- テクニカル担当:
- rescue 環境準備、コマンド実行、ログ収集。
ミニ SOP(短い手順書)
- バックアップ
- /dev/sda5 を fail/remove
- mdadm –zero-superblock /dev/sda5
- rescue で mdadm と LVM をアクティブ化
- e2fsck → resize2fs → lvreduce
- 必要な LV を削除 → pvresize –setphysicalvolumesize
- mdadm –grow –size
- pvresize
- LV 再作成/拡張 → resize2fs
- e2fsck → 再起動 → mdadm -a によるディスク再追加
リスクマトリクス(主要リスクと軽減策)
- ファイルシステム縮小失敗 → 事前バックアップ、使用量の正確な確認
- PV 縮小中に LV が影響を受ける → LV 削除前に LV レイアウト確認
- mdadm 操作でアレイが壊れる → 作業前に mdadm –examine 出力を保存、不要な自動起動無効化
決定ツリー(簡易)
flowchart TD
A[故障ディスクあり?] -->|Yes| B[バックアップを取得]
B --> C{swap が PV の末尾か}
C -->|Yes| D[swap を削除して PV を縮小]
C -->|No| E[最後の LV を縮小して PV に合わせる]
D --> F[mdadm --grow --size 実行]
E --> F
F --> G[pvresize 実行]
G --> H[LV を再作成/拡張]
H --> I[再起動してディスク再追加]
1行用語集
- mdadm: Linux のソフトウェアRAID 管理ツール。
- pvresize: LVM の PV サイズを調整するコマンド。
- resize2fs: ext2/3/4 ファイルシステムのサイズを変更するツール。
事後確認(受け入れ基準)
- /proc/mdstat にてアレイが期待サイズ(例 4GB 相当)で稼働していること。
- vgdisplay で VG サイズと Free PE が期待値と合致していること。
- /dev/server1/root のファイルシステムが問題なくマウントでき、データにアクセスできること。
- 故障ディスクを再追加後、再同期が完了すること。
参考となるコマンドまとめ(速習シート)
- mdadm 操作用:
mdadm --manage /dev/md1 --fail /dev/sda5
mdadm --manage /dev/md1 --remove /dev/sda5
mdadm --zero-superblock /dev/sda5
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
mdadm -A --scan
mdadm --grow /dev/md1 --size=4194304
mdadm -a /dev/md1 /dev/sda5
- LVM / FS 操作用:
e2fsck -f /dev/server1/root
resize2fs /dev/server1/root 2G
lvreduce -L2.5G /dev/server1/root
lvremove /dev/server1/swap_1
pvresize --setphysicalvolumesize 3G /dev/md1
pvresize /dev/md1
lvcreate --name swap_1 -l 66 server1
mkswap /dev/server1/swap_1
lvextend -l +317 /dev/server1/root
resize2fs /dev/server1/root
e2fsck -f /dev/server1/root
要約
- ファイルシステムは先に縮小し、その後 LV、PV、RAID の順で縮小する。
- superblock の上書きは必須。忘れると再起動時に問題が発生する可能性がある。
- 必ずバックアップを取り、rescue 環境での作業を行う。
重要: 実際の環境では LV の配置やディスクの割り当てが大きく異なることがあります。コマンドをそのまま鵜呑みにせず、各出力を都度確認してから次に進んでください。
受け入れ基準:
- /proc/mdstat にて /dev/md1 が期待サイズで稼働
- データが読み書き可能
- 再起動後にシステムが正常に立ち上がる