重要な前提と用語(1行定義)
- RAID1: ディスクミラーリングによる冗長化。2台以上で片方故障時に稼働継続。
- mdadm: Linux 上でソフトウェアRAIDを管理するツール。
- GRUB: ブートローダー。ここでは2台目のディスクにもGRUBをインストールして冗長化する。
4 RAIDアレイの作成
ここでは /dev/md0、/dev/md1、/dev/md2 を作成します。/dev/sdb1 が /dev/md0 に、/dev/sdb2 が /dev/md1 に、/dev/sdb3 が /dev/md2 に追加されます。/dev/sda1、/dev/sda2、/dev/sda3 は現在システムが稼働中のため追加できないため、プレースホルダ missing を使います。
mdadm コマンドでの作成例:
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であることを示す):
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdb3[1]
9759360 blocks [2/1] [_U]
md1 : active raid1 sdb2[1]
522048 blocks [2/1] [_U]
md0 : active raid1 sdb1[1]
200704 blocks [2/1] [_U]
unused devices:
[root@server1 ~]#
注: [U] または [U] は配列がdegradedであることを示し、[UU] は正常を示します。
次に各 /dev/md にファイルシステムやスワップを作成します:
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
ファイル内には作成された RAID 配列の情報が出力されます。例:
| ARRAY /dev/md0 level=raid1 num-devices=2 UUID=78d582f0:940fabb5:f1c1092a:04a55452 ARRAY /dev/md1 level=raid1 num-devices=2 UUID=8db8f7e1:f2a64674:d22afece:4a539aa7 ARRAY /dev/md2 level=raid1 num-devices=2 UUID=1baf282d:17c58efd:a8de6947:b0af9792
|
5 システムをRAID1へ合わせて調整する
まず /dev/md0 と /dev/md2 をマウントします(/dev/md1 はスワップなのでマウント不要)。
mkdir /mnt/md0
mkdir /mnt/md2
mount /dev/md0 /mnt/md0
mount /dev/md2 /mnt/md2
マウント一覧で確認します:
mount
出力例:
[root@server1 ~]# mount
/dev/sda3 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/md0 on /mnt/md0 type ext3 (rw)
/dev/md2 on /mnt/md2 type ext3 (rw)
[root@server1 ~]#
/etc/fstab の更新
既存の fstab で LABEL を使っていた場合、RAID デバイスへ置換します(例示)。以下のように置換してください。
vi /etc/fstab
例: /etc/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 の更新
実行中のマウント情報が記録されている /etc/mtab も /dev/sda1, /dev/sda3 から /dev/md0, /dev/md2 に置き換えます。
vi /etc/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
|
GRUB の設定調整
/boot/grub/menu.lst(もしくは /boot/grub/grub.conf)を編集して、fallback を有効にします。default=0 の直後に fallback=1 を追加すると、初回カーネルが起動に失敗した場合に2番目(数え始めは0)のカーネルが起動します。
vi /boot/grub/menu.lst
ファイル例:
| [...] default=0 fallback=1 [...]
|
次に、カーネルの stanza を複製して、root を LABEL=/ から /dev/md2 に、root (hd0,0) を root (hd1,0) に変更したものを先頭に追加します。例:
| [...] title CentOS (2.6.18-128.el5) root (hd1,0) kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/md2 initrd /initrd-2.6.18-128.el5.img title CentOS (2.6.18-128.el5) root (hd0,0) kernel /vmlinuz-2.6.18-128.el5 ro root=LABEL=/ initrd /initrd-2.6.18-128.el5.img
|
ここで root (hd1,0) は /dev/sdb を指していて、既に RAID 配列の一部になっています。これにより、システム再起動時にRAID側からの起動を試み、失敗した場合は fallback で元のディスクから起動されます。
initrd の再作成
RAMディスク(initrd)を新しいルート構成に合わせて作り直します。まず既存の initrd を退避してから新しい initrd を生成します:
mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img_orig
mkinitrd /boot/initrd-`uname -r`.img `uname -r`
ルートと/boot のデータをRAIDへコピー
ルート(/)の内容を /dev/md2 に、/boot の内容を /dev/md0 にコピーします。例:
cp -dpRx / /mnt/md2
cd /boot
cp -dpRx . /mnt/md0
オプションの意味: -d (リンクを保持), -p (属性保持), -R (ディレクトリ再帰), -x (別ファイルシステムを跨がない)
6 GRUB の準備(パート1)
最後に第二ディスク /dev/sdb に GRUB をインストールします。
grub
GRUB シェルで以下を実行します(例では hd0 を /dev/sda、hd1 を /dev/sdb と想定):
root (hd0,0)
出力例:
grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub>
次にインストール先を指定して setup を実行します:
setup (hd0)
出力例:
grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd0)"... 15 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub>
同様に /dev/sdb 側にも GRUB をインストールします:
root (hd1,0)
setup (hd1)
quit
最後にシステムを再起動します:
reboot
システムはまずRAID上のカーネルを起動し、失敗した場合は fallback で元のディスクから起動します。
実行前チェックリスト(簡易SOP)
- バックアップ: 重要なデータの外部バックアップを取得済み
- mdadm インストール済み: mdadm が利用可能
- 対象ディスクのパーティション確認: /dev/sda, /dev/sdb のパーティション構成
- /etc/fstab, /etc/mtab の編集権限確認
- GRUBインストール用のライブメディア確保(万一に備え)
短いSOP—実行順序:
- mdadmで degraded な RAID を missing を使って作成
- ファイルシステム/スワップ作成
- /etc/mdadm.conf を生成
- /dev/md をマウントしてデータコピー
- /etc/fstab と /etc/mtab を編集
- menu.lst/grub.conf を編集して fallback を設定
- initrd を再作成
- GRUB を両ディスクにインストール
- 再起動して挙動確認
ロール別チェックリスト
- システム管理者: コマンド実行、fstab/mtab/menu.lst 編集、GRUB インストール
- ストレージ管理者: パーティション、ディスクヘルス確認、RAID同期監視
- 運用担当: 再起動後のサービス/ログの監視、障害対応の準備
よくあるトラブルと対処(トラブルシュート)
重要: 実行前に必ずバックアップを取ること。
症状: 再起動後に起動しない(GRUB エラー / カーネル見つからない)
- 対処:
- ライブCDで起動して /boot の内容が /dev/md0 に正しくコピーされているか確認
- /boot/grub/stage1, stage2 が各ディスクに存在するか確認
- grub シェルで root (hd1,0) / setup (hd1) を再実行
症状: RAID が同期しない / degraded のまま
- 対処:
- mdadm –detail /dev/mdX で状態を確認
- missing を使って作成した場合、後で /dev/sdaX を –add して同期を開始する
- dmesg や /var/log/messages を確認し、I/O エラーやパーティションタイプの不整合がないか確認
症状: initrd に必要なドライバがない
- 対処:
- mkinitrd 実行時にモジュールを手動で指定するか、initramfs を再生成して md モジュールや必要なファイルシステムドライバを含める
代替アプローチと考慮点
- ライブ移行(稼働中にオフライン時間を最小化): LVM を併用するとスナップショットやオンライン移行がやりやすい場合がある。
- ハードウェアRAIDを使用する場合: ハードウェアRAIDはBIOS/電源系の影響を受けるが、ソフトウェアRAIDはOSレベルで柔軟。運用体制に合わせて選択。
カウンタ例(失敗例):
- BIOS が2台目ディスクをブート可能として認識しない場合、fallback が機能せずダウンすることがある。
- 非標準パーティションタイプ(例: LVMのみのパーティション)をGRUBが参照できないケース。
小さな意思決定フロー(Mermaid)
下のフローは「RAIDに移行するかどうか」の簡易判断指針です:
flowchart TD
A[現在の冗長性は充分か?] -->|はい| B[RAID移行は不要]
A -->|いいえ| C[ディスクが複数あるか?]
C -->|いいえ| D[ハードウェア追加を検討]
C -->|はい| E[RAID1を想定して計画]
E --> F[バックアップを取得]
F --> G[段階的にRAID構築と検証]
受け入れ条件(確認項目)
- /etc/mdadm.conf に配列定義が正しく生成されている
- /etc/fstab が /dev/md デバイスを指している
- initrd が再生成され、必要なモジュールを含む
- 両ディスクに GRUB がインストールされ、再起動でRAID側から起動可能
- RAID が同期開始し、最終的に [UU] の状態になる
まとめ
この手順では、既存の稼働中システムから段階的にRAID1へ移行し、/dev/md デバイスの作成からファイルシステム構築、設定ファイルの更新、initrd 再作成、そして両方の物理ディスクにGRUBをインストールするまでを扱いました。重要なのは事前バックアップ、fstab/mtab/menu.lst の慎重な編集、そして再起動後の検証です。
重要: 実行前に必ずバックアップを取得し、万一に備えてライブメディアやリカバリ手順を用意してください。