RAID1 に移行する:RAID 配列作成から GRUB 設定まで
重要: 実稼働システムで行う場合は、事前に完全バックアップを取り、メンテナンスウィンドウを確保してください。RAID 構築中は配列が degraded になりますが、適切に操作すれば再同期で冗長性が得られます。
4 RAID 配列の作成
まず /dev/md0, /dev/md1, /dev/md2 の RAID 配列を作成します。/dev/hdb1 を /dev/md0 に、/dev/hdb5 を /dev/md1 に、/dev/hdb6 を /dev/md2 に追加します。現在システムが /dev/hda1, /dev/hda5, /dev/hda6 を使用中のため、これらは追加できません。代わりにプレースホルダ missing を使って次のコマンドで配列を作成します。
mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/hdb1
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/hdb5
mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/hdb6配列を作成したら、/proc/mdstat を確認します。
cat /proc/mdstat出力は 3 つの degraded RAID 配列を示すはずです([U] または [U] は degraded、[UU] は正常):
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 hdb6[1]
4642688 blocks [2/1] [_U]
md1 : active raid1 hdb5[1]
417536 blocks [2/1] [_U]
md0 : active raid1 hdb1[1]
176576 blocks [2/1] [_U]
unused devices:
[root@server1 ~]# 次に RAID 配列上にファイルシステムを作成します。/dev/md0 と /dev/md2 は ext3、/dev/md1 は swap にします。
mkfs.ext3 /dev/md0
mkswap /dev/md1
mkfs.ext3 /dev/md2次に /etc/mdadm.conf を現在の配列情報で更新します(現状では新しい配列情報が含まれていません)。
cp /etc/mdadm.conf /etc/mdadm.conf_orig
mdadm --examine --scan >> /etc/mdadm.confファイルの中身を表示して、新しい配列情報が追加されていることを確認します。
cat /etc/mdadm.confテキストの例(配列情報が追加された例):
| # mdadm configuration file # # mdadm will function properly without the use of a configuration file, # but this file is useful for keeping track of arrays and member disks. # In general, a mdadm.conf file is created, and updated, after arrays # are created. This is the opposite behavior of /etc/raidtab which is # created prior to array construction. # # # the config file takes two types of lines: # # DEVICE lines specify a list of devices of where to look for # potential member disks # # ARRAY lines specify information about how to identify arrays so # so that they can be activated # # You can have more than one device line and use wild cards. The first # example includes SCSI the first partition of SCSI disks /dev/sdb, # /dev/sdc, /dev/sdd, /dev/sdj, /dev/sdk, and /dev/sdl. The second # line looks for array slices on IDE disks. # #DEVICE /dev/sd[bcdjkl]1 #DEVICE /dev/hda1 /dev/hdb1 # # If you mount devfs on /dev, then a suitable way to list all devices is: #DEVICE /dev/discs/*/* # # # # ARRAY lines specify an array to assemble and a method of identification. # Arrays can currently be identified by using a UUID, superblock minor number, # or a listing of devices. # # super-minor is usually the minor number of the metadevice # UUID is the Universally Unique Identifier for the array # Each can be obtained using # # mdadm -D |
5 システムを RAID1 に合わせて調整する
ここでは /dev/md0 と /dev/md2 をマウントします(swap の /dev/md1 はマウント不要)。
mkdir /mnt/md0
mkdir /mnt/md2mount /dev/md0 /mnt/md0
mount /dev/md2 /mnt/md2mount コマンドの出力で両方の配列がマウントされていることを確認します。
mount[root@server1 ~]# mount
/dev/hda6 on / type ext3 (rw,relatime)
none on /proc type proc (rw)
/dev/hda1 on /boot type ext3 (rw,relatime)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/md0 on /mnt/md0 type ext3 (rw)
/dev/md2 on /mnt/md2 type ext3 (rw)
[root@server1 ~]#次に /etc/fstab を編集して、/dev/hda1 -> /dev/md0、/dev/hda5 -> /dev/md1、/dev/hda6 -> /dev/md2 に置き換えます。例として最終的な /etc/fstab の内容は以下のようになります:
| /dev/md2 / ext3 relatime 1 1 /dev/md0 /boot ext3 relatime 1 2 /dev/cdrom /media/cdrom auto umask=0022,users,iocharset=utf8,noauto,ro,exec 0 0 /dev/fd0 /media/floppy auto umask=0022,users,iocharset=utf8,noauto,exec,flush 0 0 none /proc proc defaults 0 0 /dev/md1 swap swap defaults 0 0 |
/ etc/mtab も更新します(実行中のマウント情報の置換)。/dev/hda1 を /dev/md0 に、/dev/hda6 を /dev/md2 に置き換えてください。例:
| /dev/md2 / ext3 rw,relatime 0 0 none /proc proc rw 0 0 /dev/md0 /boot ext3 rw,relatime 0 0 none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0 /dev/md0 /mnt/md0 ext3 rw 0 0 /dev/md2 /mnt/md2 ext3 rw 0 0 |
次に GRUB の設定を変更します。/boot/grub/menu.lst を開き、default 0 の直後に fallback 1 を追加します。
vi /boot/grub/menu.lst| [...] default 0 fallback 1 [...] |
これで 0 番目のカーネルがブートに失敗した場合、次の(fallback)エントリが起動されます。
同ファイルのカーネルスタンザを複製し、ルートデバイスとディスク番号を /dev/md2 と (hd1,0) に変更します。resume オプションがある場合は /dev/hda5 を /dev/md1 に置き換えます。
| [...] title linux kernel (hd1,0)/vmlinuz BOOT_IMAGE=linux root=/dev/md2 resume=/dev/md1 initrd (hd1,0)/initrd.img title linux kernel (hd0,0)/vmlinuz BOOT_IMAGE=linux root=/dev/hda6 resume=/dev/hda5 initrd (hd0,0)/initrd.img |
最終的に menu.lst は次のようになります(例):
| timeout 10 color black/cyan yellow/cyan default 0 fallback 1 title linux kernel (hd1,0)/vmlinuz BOOT_IMAGE=linux root=/dev/md2 resume=/dev/md1 initrd (hd1,0)/initrd.img title linux kernel (hd0,0)/vmlinuz BOOT_IMAGE=linux root=/dev/hda6 resume=/dev/hda5 initrd (hd0,0)/initrd.img title failsafe kernel (hd0,0)/vmlinuz BOOT_IMAGE=failsafe root=/dev/hda6 failsafe initrd (hd0,0)/initrd.img |
(hd1,0) は /dev/hdb の 1 パーティションを指します。これでシステムを再起動すると degraded な RAID からのブートを試み、失敗したら /dev/hda から起動します(fallback)。
initrd を新しい環境に合わせて再作成します。
mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img_orig
mkinitrd /boot/initrd-`uname -r`.img `uname -r`次に、/dev/hda1(/boot)と /dev/hda6(ルート)の内容をそれぞれ /mnt/md0 と /mnt/md2 にコピーします。
cp -dpRx / /mnt/md2cd /boot
cp -dpRx . /mnt/md06 GRUB の準備(パート 1)
次に GRUB を第2ディスク(/dev/hdb)にもインストールします。GRUB シェルを起動して次のコマンドを打ちます。
grubGRUB のプロンプトで:
root (hd0,0)(出力例)
grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub>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/menu.lst"... succeeded
Done.
grub>次に /dev/hdb 側も同様に設定します(hd1 が /dev/hdb)。
root (hd1,0)
setup (hd1)
quit最後に通常シェルで再起動して、RAID 配列からの起動が成功するか確認します。
reboot追加情報と実務チェックリスト
キーコマンド(ファクトボックス)
- 配列作成: mdadm –create
- 配列確認: cat /proc/mdstat、mdadm –detail /dev/mdX
- ファイルシステム作成: mkfs.ext3, mkswap
- mdadm.conf 更新: mdadm –examine –scan >> /etc/mdadm.conf
- initrd 再作成: mkinitrd
- GRUB 設置: grub -> root / setup
ロール別チェックリスト
- システム管理者:
- 完全バックアップを取得する
- メンテナンスウィンドウを確保する
- /proc/mdstat と mdadm –detail を監視する
- ストレージ管理者:
- mdadm.conf に UUID で配列を登録することを検討する
- 再同期後に spare を追加する手順を準備する
- 運用担当者:
- 再起動後のサービス開始順序を確認する
- 障害時のフェールオーバー手順を準備する
トラブルシューティング(よくある失敗例と対処)
- ブートしない(GRUB 関連):
- 両ディスクに必ず GRUB をインストールする。/boot が RAID でなくても GRUB は MBR に必要。
- menu.lst の root=(hd,) 設定が正しいか(ディスク番号の違いに注意)。
- 配列が再同期しない:
- dmesg と /var/log/messages を確認。障害ドライブや接続不良を疑う。
- mount 時に UUID/デバイス名が一致しない:
- /etc/fstab を UUID ベースに変更する(blkid で確認)。
代替アプローチ
- 新規に空きディスクがある場合は、直接両ディスクをパリティで組んでからデータを移行する方法がより短時間で安全。
- fstab には可能なら /dev/mdX の代わりに UUID=… を使うと、デバイス名のズレによるマウント失敗を避けられます。
意思決定フローチャート(Mermaid)
flowchart TD
A[準備: バックアップ取得] --> B{RAID 構築方法は?}
B -->|既存稼働ディスクを活かす| C[missing を使って degraded で作成]
B -->|空きディスクで新規構築| D[新規 RAID を構築してデータ移行]
C --> E[ファイルシステム作成 -> mdadm.conf 更新 -> fstab 更新]
E --> F[GRUB を両ディスクにインストール]
F --> G[再起動して動作確認]
D --> G要約
- degraded 状態で RAID1 を作成して稼働中システムを RAID に移行できます。
- /etc/mdadm.conf, /etc/fstab, /boot/grub/menu.lst, initrd を適切に更新してください。
- 両ディスクに GRUB をインストールし、再起動後に正常にブートするか確認します。
重要: 実運用環境では必ず事前バックアップと段階的検証を行ってください。