CentOS/RedHat 6 上で既存システムを RAID1 にする方法
概要
この記事は、既に OS がインストールされているディスク(例: /dev/sdb)に対して、同容量の別ディスク(例: /dev/sda)を追加し、ソフトウェア RAID1 を構築する手順を説明します。GRUB(従来の grub 0.97)がインストールされている環境で、片方のディスクが故障してもシステムがブートできることを目標とします。
- 対象: CentOS 6 / RedHat 6 系の既存システム
- 目的: 単一ディスク -> RAID1(ミラー)に移行
- 前提: ルート権限で作業/同容量またはそれに近いディスクを用意
用語(1行定義)
- mdadm: Linux のソフトウェア RAID 管理ツール。RAID デバイスの作成や管理を行う。
- initramfs: カーネル起動時に使用される初期 RAM ディスク。RAID 情報が含まれる必要がある。
著者と日付
Maurice Hilarius - Hard Data Ltd. - 2011年10月12日
前提と警告
- 必ずフルバックアップを取り、バックアップが復元できることを確認してください。失敗するとデータ損失のリスクがあります。
- 作業は root(su -)で行ってください。
- ディスク名は環境により異なります。/dev/sda と /dev/sdb を例示していますが、実際のデバイス名を必ず確認してください。
重要: 手順をよく読み、特にパーティション操作や mkfs を行う前に対象デバイスを確認してください。
初期ディスク構成の例
このチュートリアルでは、以下のような既存構成(「Original」)を想定しています。追加するターゲットディスクは /dev/sda(同容量)です。
Device Mountpoint Size
/dev/sdb ~1002GB /dev/sdb1 /boot 256MB /dev/sdb2 / 24GB /dev/sdb3 swap 4GB /dev/sdb5 /var 4GB /dev/sdb6 /home ~900GB
(注: 上記は例です。実際の出力は fdisk -l や lsblk で確認してください)
ステップバイステップ手順
1) バックアップ
- バックアップを取得。
- バックアップの検証。
必須: ここで作業を中断してバックアップの復元手順を確認してください。
2) 追加ディスクに既存と同じパーティションを作成
既存ディスク(例: /dev/sdb)のパーティション情報を複製して /dev/sda に書き込みます。
sfdisk -d /dev/sdb | sfdisk /dev/sda
(出力を確認して意図しないデバイスに書き込んでいないか必ずチェック)
3) カーネルモジュールの読み込み(再起動回避)
modprobe linear
modprobe raid0
modprobe raid1
その後、RAID モジュールの状態を確認します:
cat /proc/mdstat
期待例:
Personalities : [linear] [multipath] [raid0] [raid1]
unused devices:
4) mdadm で degraded(片側欠如)状態の RAID1 を作成
まずは各パーティションごとに md デバイスを作ります。ここでは second disk(/dev/sdb)をまだ追加しない(missing)状態で作成します。
mdadm --create /dev/md0 --level=1 --raid-disks=2 /dev/sda1 missing
mdadm --create /dev/md1 --level=1 --raid-disks=2 /dev/sda2 missing
mdadm --create /dev/md2 --level=1 --raid-disks=2 /dev/sda5 missing
mdadm --create /dev/md3 --level=1 --raid-disks=2 /dev/sda6 missing
注: CentOS 6 / GRUB 0.97 を使う場合、GRUB が RAID メタデータを認識できないため、mdadm 作成時に古いメタデータ形式を指定する必要があります。具体的には –metadata=0.90 を追加してください。
mdadm --create /dev/md0 --metadata=0.90 --level=1 --raid-devices=2 /dev/sda1 missing
これは GRUB が “Filesystem type unknown, partition type 0xfd” と表示してインストールを拒否する事態を回避します。
5) mdstat を確認
cat /proc/mdstat
期待例:
Personalities : [raid1]
md1 : active raid1 sdb2[1]
473792 blocks [2/2] [U_]
md2 : active raid1 sdb5[1]
4980032 blocks [2/2] [U_]
md3 : active raid1 sdb6[1]
3349440 blocks [2/2] [U_]
md0 : active raid1 sdb1[1]
80192 blocks [2/2] [U_]
unused devices:
(U_ は片方が missing の意。状態が変化するまで待つこと)
6) mdadm.conf を作成
現在の md 設定をスキャンして /etc/mdadm.conf に保存します。
mdadm --detail --scan > /etc/mdadm.conf
内容を確認します:
cat /etc/mdadm.conf
ここには作成した md デバイスの情報(degraded 状態の UUID 等)が記載されます。
7) initramfs を再作成して mdadm.conf を組み込む
dracut を使って initramfs に mdadm 設定を組み込みます。
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.old
dracut --mdadmconf --force /boot/initramfs-$(uname -r).img $(uname -r)
これにより、再起動時に RAID デバイスが正しくアセンブルされます。
8) ファイルシステム作成(md デバイス上)
各 md デバイスにファイルシステムを作成します。/boot は ext2、他は ext4 を例示します。
mkfs.ext2 /dev/md0 # /boot に推奨
mkfs.ext4 /dev/md1 # / に推奨
mkfs.ext4 /dev/md2 # /var に推奨
mkfs.ext4 /dev/md3 # /home に推奨
mkswap -c /dev/sda2 # swap は両方のディスクに作成(パフォーマンス向上)
注意: mkfs は既存データを消去します。必ず正しいデバイスで実行してください。
9) 既存パーティションのデータを md デバイスに手動でコピー
稼働中システムから新しい md デバイスへ cpio を使ってファイルをコピーします。SELinux が有効な場合は .autorelabel を作成してください。
mkdir /mnt/raid
mount /dev/md0 /mnt/raid
cd /boot; find . -depth | cpio -pmd /mnt/raid
SELinux を使用している場合:
touch /mnt/raid/.autorelabel
sync
umount /mnt/raid
mount /dev/md1 /mnt/raid
cd / ; find . -depth -xdev | grep -v '^\./tmp/' | cpio -pmd /mnt/raid
sync
umount /mnt/raid
注意: /tmp, /var/tmp の中身はコピーしない方が安全です。上記コマンドは proc や dev の空ディレクトリを作成します。
mount /dev/md2 /mnt/raid
cd /var; find . -depth | cpio -pmd /mnt/raid
sync
umount /mnt/raid
mount /dev/md3 /mnt/raid
cd /home; find . -depth | cpio -pmd /mnt/raid
sync
umount /mnt/raid
ここまでで新しい md デバイスにデータを移行しました。
10) /etc/fstab と /boot/grub/menu.lst を修正して RAID からブートするようにする
- /etc/fstab: 従来の /dev/sdbX を /dev/mdX または UUID=
に置き換えます。UUID を使う場合は blkid で確認。 - /boot/grub/menu.lst (または grub.conf): ブートエントリの root= ラインが /dev/sdb2 等を参照している場合は、/dev/md1(または UUID)に変更します。
例(fstab のイメージ):
/dev/md1 / ext4 defaults 1 1
/dev/md0 /boot ext2 defaults 1 2
/dev/md3 /var ext4 defaults 0 2
/dev/md2 /home ext4 defaults 0 2
/dev/sda2 swap swap defaults 0 0
/dev/sdb2 swap swap defaults 0 0
(swap は両方に作成するが、fstab では片方のみ・あるいは両方を設定できます。お好みで)
11) GRUB を両方のディスクにインストールしてブート冗長性を確保
GRUB(legacy)を /dev/sda と /dev/sdb の MBR 両方にインストールします。こうすることで一方のディスクが故障しても BIOS 側で残ったディスクから起動できます。
# 例: grub コマンドでインストール
grub
root (hd1,0)
setup (hd1)
root (hd0,0)
setup (hd0)
quit
あるいは grub-install が使える環境では:
grub-install /dev/sda
grub-install /dev/sdb
注: デバイスの順序(hd0/hd1)や grub の操作は環境により異なります。慎重に実行してください。
12) mdadm にもう一方のディスクを追加して同期させる
データ移行と設定が済んだら、既存のディスク(例: /dev/sdbX)を各 md デバイスに追加し、同期させます。
mdadm --add /dev/md0 /dev/sdb1
mdadm --add /dev/md1 /dev/sdb2
mdadm --add /dev/md2 /dev/sdb5
mdadm --add /dev/md3 /dev/sdb6
同期状況は /proc/mdstat で監視できます。
watch -n 5 cat /proc/mdstat
同期が終わるまで待ちます。
13) 最終チェックと再起動
- /etc/mdadm.conf を更新(すでに出力済みであれば良い)
- /boot/initramfs を再生成(手順 7 を再度行っても良い)
- グラブのインストールや fstab の記載を再確認
問題なければ再起動して RAID から正常にブートするか確認します。
reboot
もし再起動後に問題があれば、リカバリコンソールから旧 initramfs を戻す・バックアップから復元するなどの手順でロールバックできます。
受入基準
- システムが二つの物理ディスクのうちいずれか一方を抜いても起動すること(片側障害でブートできる)。
- /proc/mdstat で各 md デバイスが状態 [U_] または [UU] であること(同期完了後は [UU])。
- /etc/fstab と /boot/grub/menu.lst(または grub.conf)が md デバイスを指していること。
- dracut で作成した initramfs に mdadm 情報が含まれていること。
ロール別チェックリスト
- システム管理者:
- バックアップ取得と検証
- パーティションの複製(sfdisk)前後のデバイス確認
- mdadm の作成と /etc/mdadm.conf 保存
- ストレージ担当:
- 追加ディスクの健全性確認(smartctl など)
- 同期時の I/O ストレス監視
- 運用担当:
- 再起動後のサービス監視
- 障害発生時の切替手順の確認
トラブルシューティングとよくある問題
- GRUB が “Filesystem type unknown, partition type 0xfd” と表示する: mdadm の –metadata=0.90 を使って作成する。
- 再起動後に md デバイスがアセンブルされない: /etc/mdadm.conf が正しいか確認し、dracut で再生成する。
- /boot が RAID 化後に空になっている/ブートしない: md と fs のコピー漏れや grub のインストール不足が原因。復旧には旧 initramfs を戻すか、ライブメディアで chroot して修正。
リスクと緩和策
- 誤ったデバイスに対する mkfs や sfdisk 書き込み: 作業前に lsblk, fdisk -l, blkid でデバイスを照合。
- コピー漏れ(特殊ファイルやデバイスファイル): cpio のオプションを確認し、/dev や /proc は必要に応じて再作成する。SELinux ラベルは .autorelabel で再割当。
- RAID 同期中の I/O 増加: 業務時間外に作業を行うか、ionice/nice を使って影響を緩和。
ロールバック(簡易ランブック)
- システムを停止し、元の /boot/initramfs-$(uname -r).img.old を元に戻す。
- /etc/fstab を元ファイルに戻す。
- md デバイスを停止(mdadm –stop)し、不要な md 構成を削除。
- グラブを旧ディスクの MBR に再インストール。
- 再起動して元の単一ディスク構成に戻ることを確認。
互換性と注意点
- CentOS/RedHat 6 の標準環境(grub legacy)では –metadata=0.90 が推奨。GRUB 2 を使用する環境ではこの限りではありません。
- デバイス名の変更(BIOS/UEFI による順序変化)により hd0/hd1 の指定が変わることがあるため、GRUB の設定は慎重に確認してください。
まとめ
- 作業前にバックアップを必ず取り、構成を慎重に確認すること。
- mdadm を使って degraded な RAID1 を作成し、データを移行してから既存ディスクを追加して同期する流れが安全。
- GRUB を両方のディスクにインストールし、initramfs に mdadm 情報を含めることで、片側障害でもブート可能になる。
重要: 本手順は運用環境で直接適用する前に検証環境で十分にテストしてください。