目的と前提
- 目的: 単一ディスクから稼働中のシステムを RAID1(ミラーリング)に移行する手順。
- 前提: 既存の /dev/sda* に OS があり、追加ディスク /dev/sdb にパーティション sdb1/sdb2/sdb3 を作成済みであること。root 権限で操作します。
重要: 本手順はライブシステムでのディスク操作を含みます。必ずバックアップを取得し、必要ならメンテナンスウィンドウを確保してください。
1. RAID アレイを作成する
稼働中の /dev/sda1、/dev/sda2、/dev/sda3 は現在システムで使われているため、まず /dev/sdb1、/dev/sdb2、/dev/sdb3 を使い、もう一方のデバイスを “missing”(プレースホルダ)として RAID を作成します。
mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb3
作成直後に状態を確認します。
cat /proc/mdstat
出力例(アレイはまだ欠損があるため degraded 表示になります。[U] や [U] は degraded、[UU] は正常を示します):
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdb3[1]
4618560 blocks [2/1] [_U]
md1 : active raid1 sdb2[1]
513984 blocks [2/1] [_U]
md0 : active raid1 sdb1[1]
104320 blocks [2/1] [_U]
unused devices:
[root@server1 ~]#
2. ファイルシステム作成と mdadm 設定
RAID 上にファイルシステム(ext3)とスワップを作成します。
mkfs.ext3 /dev/md0
mkswap /dev/md1
mkfs.ext3 /dev/md2
mdadm の自動検出情報を /etc/mdadm.conf に書き出します。
mdadm --examine --scan > /etc/mdadm.conf
cat /etc/mdadm.conf
ファイルにはアレイの UUID 等が記録されます(例):
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=2848a3f5:cd1c26b6:e762ed83:696752f9
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=8a004bac:92261691:227767de:4adf6592
ARRAY /dev/md2 level=raid1 num-devices=2 UUID=939f1c71:be9c10fd:d9e5f8c6:a46bcd49
3. マウントと fstab / mtab の更新
マウントポイントを作成して RAID をマウントします(swap はマウント不要)。
mkdir /mnt/md0
mkdir /mnt/md2
mount /dev/md0 /mnt/md0
mount /dev/md2 /mnt/md2
mount コマンドでマウント済みを確認します。
mount
次に /etc/fstab を編集し、既存の LABEL= を /dev/md* に置換します。例:
vi /etc/fstab
(例の fstab)
/dev/md2 / ext3 defaults 1 1
/dev/md0 /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/md1 swap swap defaults 0 0
同様に /etc/mtab の LABEL 参照を /dev/md* に置換します(live 環境の表示を整えるため)。
vi /etc/mtab
(例の mtab)
/dev/md2 / ext3 rw 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
/dev/md0 /boot ext3 rw 0 0
tmpfs /dev/shm tmpfs rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0
4. GRUB の準備(メニューと initrd)
/boot/grub/menu.lst(または grub.conf)を編集し、fallback を設定しておきます。最初のカーネルがブートに失敗した場合に別のエントリを起動するためです。
vi /boot/grub/menu.lst
追加:
default=0
fallback=1
次に、既存の kernel エントリを複製し、最初のカーネルの root= を LABEL=/ から /dev/md2 に置き換え、root (hd0,0) を root (hd1,0) に差し替えます(sdb を指す設定)。例:
[...]
title Fedora (2.6.23.1-42.fc8)
root (hd1,0)
kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/md2 rhgb quiet
initrd /initrd-2.6.23.1-42.fc8.img
title Fedora (2.6.23.1-42.fc8)
root (hd0,0)
kernel /vmlinuz-2.6.23.1-42.fc8 ro root=LABEL=/ rhgb quiet
initrd /initrd-2.6.23.1-42.fc8.img
次に initrd を現在のカーネル用に再作成します。
mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img_orig
mkinitrd /boot/initrd-`uname -r`.img `uname -r`
5. ルートと /boot の内容を RAID にコピー
ルート(/)と /boot の内容をそれぞれ /mnt/md2 と /mnt/md0 にコピーします(属性・ハードリンクを維持)。
cp -dpRx / /mnt/md2
cd /boot
cp -dpRx . /mnt/md0
注: コピー中に /mnt/md2 にコピーされた内容が実際の稼働中の / と一致することを確認してください。不要なプロセスや一時ファイルがある場合は除外リストを作ると安全です。
6. GRUB を両ディスクにインストールする(重要)
GRUB インタラクティブシェルを起動して、それぞれのディスク(ここでは hd0 と hd1)にブートローダをインストールします。
grub
GRUB シェルでの手順例:
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit
出力では stage1/stage2 の有無や embed の成否が表示されます。両方のディスクにインストールできたら再起動します。
reboot
システムはまず degraded な RAID から起動を試み、失敗した場合は fallback により元のディスクから起動します。
役割別チェックリスト(実施前・実施後)
実施前(準備)
- フルバックアップを取得済みか
- 追加ディスクのパーティションが作成済みか(sdb1/sdb2/sdb3 等)
- mdadm パッケージがインストール済みか
- メンテナンスウィンドウが確保されているか
実施中
- /proc/mdstat を頻繁に確認する
- マウント・fstab の編集で typos がないか確認する
- initrd の再作成を忘れない
実施後
- 両ディスクに GRUB がインストールされているか
- 再起動が成功するか
- /proc/mdstat に [UU] を目指してデバイスを追加し、再同期を行う
短い SOP(運用手順)
- 追加ディスクのパーティション作成
- mdadm で missing を使い RAID を作成
- mkfs/mkswap 実行
- /etc/mdadm.conf を書き出す
- /etc/fstab, /etc/mtab を更新
- initrd を再作成
- / と /boot を RAID にコピー
- GRUB を両 HDD にインストール
- 再起動して動作確認
- 正常なら古い sda のパーティションを RAID に追加して再同期
トラブルシューティング(よくあるケース)
起動しない
- GRUB の設定(root(hdX,Y) と kernel の root=)を再確認
- initrd がカーネルと一致しているか確認
- /etc/fstab のデバイス指定ミスを確認
mdadm がアレイを認識しない
- /etc/mdadm.conf を確認し、UUID が正しく記載されているか
- mdadm –examine /dev/sdb* でパーティションヘッダを確認
コピー後にサービスが壊れている
- ライブシステムとコピー先で差分がある場合は rsync で差分を反映する(停止時間を考慮)
リスクマトリクス(簡易)
- データ損失: 高(対策: フルバックアップ)
- ブート不可: 中(対策: GRUB を両方のディスクにインストール、fallback 設定)
- 運用停止時間: 中(対策: メンテナンスウィンドウ、rsync を用いた段階的移行)
ミニ用語集(1行定義)
- RAID1: ミラーリングでデータを2台以上に複製する冗長化方式。
- mdadm: Linux のソフトウェア RAID 管理ツール。
- initrd: カーネル起動時に使われる初期 RAM ディスク。
- fallback: GRUB の代替エントリ。最初のブートが失敗した場合に使われる。
参考:決定木(起動不可時の簡易判断)
flowchart TD
A[再起動後にブート成功?] -->|はい| B[完了]
A -->|いいえ| C{GRUB が表示されるか}
C -->|はい| D[GRUB 設定と root= を確認]
C -->|いいえ| E[両ディスクの MBR/GRUB インストールを確認]
D --> F[initrd とカーネルバージョンを確認]
E --> F
F --> G[必要なら rescue モードで修正しリブート]
G --> B
重要: 手順を理解せずにコマンドだけ実行するとデータ消失の可能性があります。テスト環境で検証してから本番で実行してください。
まとめ: missing を使って一時的に degraded な RAID を作り、ファイルシステムと設定を移行し、GRUB を両方のディスクに書き込んでから再起動します。その後、元の sda パーティションを RAID に追加して再同期すれば完全なミラーリングになります。