重要: 実機で操作する前に必ず現在の設定と重要データのバックアップを取ってください。RAID 操作やパーティション操作はデータ損失のリスクがあります。
目的と前提
この手順は次を行います:
- /dev/sdb1 を /dev/md0(非LVM、/boot 用 RAID1)として作成
- /dev/sdb2 を /dev/md1(LVM 用 RAID1)として作成
- /dev/md0 に ext3 を作成して /boot を移行
- /dev/md1 を pvcreate→vgextend して既存の VolGroup00 に追加
- /dev/sda2 上の LVM データを pvmove で /dev/md1 に移動
- /dev/sda1 の内容を /dev/md0 にコピー
- GRUB と initrd を調整して、万一のときは fallback で元のディスクから起動する
前提:
- root 権限で実行すること
- /dev/sda が現在稼働中のディスクであること(すぐには追加できないため missing を使う)
- mdadm、lvm、mkinitrd、fdisk、mkfs.ext3 が利用可能であること
RAIDアレイの作成
まず /dev/md0 と /dev/md1 を作成します。/dev/sdb1 を /dev/md0 に、/dev/sdb2 を /dev/md1 に割り当てます。現在システムが /dev/sda 上で稼働しているため、最初は missing を使ってデグレード(欠損)状態で作成します:
mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
作成後、/proc/mdstat を確認してデグレード状態([U] または [U])であることを確認します。[UU] は正常です。
cat /proc/mdstat
期待される出力例:
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb2[1]
5036288 blocks [2/1] [_U]
md0 : active raid1 sdb1[1]
200704 blocks [2/1] [_U]
unused devices:
[root@server1 ~]#
非LVM RAID にファイルシステムを作成
/boot 用の /dev/md0 に ext3 を作成します:
mkfs.ext3 /dev/md0
LVM 用 RAID の準備とボリュームグループへの追加
LVM 用 RAID (/dev/md1) を物理ボリュームとして初期化します:
pvcreate /dev/md1
次に /dev/md1 を既存のボリュームグループ VolGroup00 に追加します:
vgextend VolGroup00 /dev/md1
pvdisplay の出力は次のようになります(例):
[root@server1 ~]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name VolGroup00
PV Size 4.80 GB / not usable 22.34 MB
Allocatable yes
PE Size (KByte) 32768
Total PE 153
Free PE 1
Allocated PE 152
PV UUID op2n3N-rck1-Pywc-9wTY-EUxQ-KUcr-2YeRJ0
--- Physical volume ---
PV Name /dev/md1
VG Name VolGroup00
PV Size 4.80 GB / not usable 22.25 MB
Allocatable yes
PE Size (KByte) 32768
Total PE 153
Free PE 153
Allocated PE 0
PV UUID pS3xiy-AEnZ-p3Wf-qY2D-cGus-eyGl-03mWyg
[root@server1 ~]#
vgdisplay の例:
[root@server1 ~]# vgdisplay
--- Volume group ---
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 9.56 GB
PE Size 32.00 MB
Total PE 306
Alloc PE / Size 152 / 4.75 GB
Free PE / Size 154 / 4.81 GB
VG UUID jJj1DQ-SvKY-6hdr-3MMS-8NOd-pb3l-lS7TA1
[root@server1 ~]#
mdadm 設定ファイルと fstab / mtab の更新
mdadm の現在のアレイ情報を /etc/mdadm.conf に出力します:
mdadm --examine --scan > /etc/mdadm.conf
内容を確認:
cat /etc/mdadm.conf
ファイルには作成したアレイの UUID 情報などが記録されます。例:
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=7d2bf9c3:7cd9df21:f782dab8:9212d7cb
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=d93a2387:6355b5c5:25ed3e50:2a0e4f96
次に /etc/fstab を編集し、LABEL=/boot を /dev/md0 に置き換えます:
vi /etc/fstab
例:
/dev/VolGroup00/LogVol00 / 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/VolGroup00/LogVol01 swap swap defaults 0 0
同様に /etc/mtab の /dev/sda1 を /dev/md0 に差し替えます:
vi /etc/mtab
例:
/dev/mapper/VolGroup00-LogVol00 / 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 の調整(fallback を利用した冗長化)
/boot/grub/menu.lst を編集して fallback=1 を追加します(default=0 の直後)。これで第1カーネルが失敗した場合に次のエントリが起動されます:
vi /boot/grub/menu.lst
例:
default=0
fallback=1
ファイルのカーネルスタンザを複製し、先頭に /dev/sdb を参照する root (hd1,0) の行を追加します。例:
title Fedora (2.6.23.1-42.fc8)
root (hd1,0)
kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/VolGroup00/LogVol00
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=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.23.1-42.fc8.img
root (hd1,0) は /dev/sdb を指し、これはすでに RAID に含まれている側です。fallback 設定により、RAID からの起動が失敗した場合は /dev/sda から起動されます。
initrd の再生成
現在の initrd をリネームして新しい initrd を作成します:
mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img_orig
mkinitrd /boot/initrd-`uname -r`.img `uname -r`
これにより、新しい initrd が RAID 構成を考慮して生成されます。
データ移行: pvmove で LVM を移動
設定ファイルを更新したら、/dev/sda2 上の LVM データを /dev/md1 に移動します:
pvmove /dev/sda2 /dev/md1
移動には時間がかかります。完了後、/dev/sda2 をボリュームグループから削除します:
vgreduce VolGroup00 /dev/sda2
その後、システムに /dev/sda2 を LVM として使用しないよう通知します:
pvremove /dev/sda2
pvdisplay は最終的に次のようになります(例):
[root@server1 ~]# pvdisplay
--- Physical volume ---
PV Name /dev/md1
VG Name VolGroup00
PV Size 4.80 GB / not usable 22.25 MB
Allocatable yes
PE Size (KByte) 32768
Total PE 153
Free PE 1
Allocated PE 152
PV UUID pS3xiy-AEnZ-p3Wf-qY2D-cGus-eyGl-03mWyg
[root@server1 ~]#
/dev/sda2 を RAID タイプへ変更して配列に追加
パーティションタイプを Linux raid autodetect (fd) に変更します:
fdisk /dev/sda
対話例:
Command (m for help): <- t
Partition number (1-4): <- 2
Hex code (type L to list codes): <- fd
Changed system type of partition 2 to fd (Linux raid autodetect)
Command (m for help): <- w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
[root@server1 ~]#
その後、/dev/sda2 を /dev/md1 に追加します:
mdadm --add /dev/md1 /dev/sda2
/proc/mdstat を見て同期状況を確認します:
cat /proc/mdstat
同期中の例:
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[2] sdb2[1]
5036288 blocks [2/1] [_U]
[=====>...............] recovery = 28.8% (1454272/5036288) finish=2.8min speed=21132K/sec
md0 : active raid1 sdb1[1]
200704 blocks [2/1] [_U]
unused devices:
[root@server1 ~]#
進行状況を監視するには:
watch cat /proc/mdstat
完了後の例:
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[0] sdb2[1]
5036288 blocks [2/2] [UU]
md0 : active raid1 sdb1[1]
200704 blocks [2/1] [_U]
unused devices:
[root@server1 ~]#
/dev/md0 をマウントして /boot をコピー
まずマウントポイントを作成してマウントします:
mkdir /mnt/md0
mount /dev/md0 /mnt/md0
mount 出力例:
[root@server1 ~]# mount
/dev/mapper/VolGroup00-LogVol00 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/md0 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)
[root@server1 ~]#
/boot の内容をコピーします:
cd /boot
cp -dpRx . /mnt/md0
受け入れ基準
- /proc/mdstat で各 RAID の状態が期待通り([UU] または [_U])であること
- /etc/fstab と /etc/mtab が /dev/md0 を参照していること
- initrd が再生成され、/boot に正しく保存されていること
- pvmove が完了し、pvdisplay に /dev/md1 のみが残っていること
- システムを再起動して RAID から正常に起動できること(fallback 動作を含む)
トラブルシューティング(よくある問題と対処)
- 同期が遅い/停止している: I/O 負荷や不良セクタが原因のことがあります。dmesg を確認してエラーを探し、該当ディスクを –fail でマークしてから再試行します。
- mdadm –add が失敗する: パーティションタイプが正しく fd に設定されているかを確認し、カーネルのパーティションテーブル再読み込み(再起動が必要な場合あり)を検討してください。
- GRUB が RAID 上の /boot を見つけられない: initrd の再生成と /boot の内容が新しい md0 に正しくコピーされているか確認します。必要なら手動で grub インストールを実行します(grub-install など)。
- pvmove が途中で止まった: pvdisplay、vgdisplay、lvdisplay で状態を確認。必要であれば LVM のログや dmesg を参照します。
コマンド例(不良ディスクのマークと削除):
mdadm --fail /dev/md1 /dev/sda2
mdadm --remove /dev/md1 /dev/sda2
mdadm --add /dev/md1 /dev/sda2
実務チェックリスト(ロール別)
- システム管理者(実行前):
- フルバックアップを取得
- 現在の /etc/fstab, /etc/mtab, /boot/grub/menu.lst, /etc/mdadm.conf をバックアップ
- mdadm, lvm2 ツールがインストール済みか確認
- システム管理者(実行中):
- 各コマンド実行後に /proc/mdstat, pvdisplay, vgdisplay を確認
- pvmove 実行中は負荷を監視
- システム管理者(再起動前):
- initrd の再生成完了を確認
- /boot の内容が /dev/md0 に正しくコピーされていることを確認
- GRUB 設定で fallback=1 が設定されていることを確認
- システム管理者(再起動後):
- RAID 起動成功を確認
- ログ (dmesg, /var/log/messages) を確認して異常がないことを確認
ミニ・メソドロジー(5ステップ)
- 設備と依存を確認(ツール・バックアップ)
- degraded 状態で md デバイスを作成
- 非LVM と LVM の準備(mkfs, pvcreate, vgextend)
- pvmove でデータ移行、mdadm で残りのディスクを追加して同期
- initrd と GRUB を更新して再起動テスト
まとめ
- missing を使って一時的にデグレード状態の RAID を作成し、安全に /dev/sda から /dev/sdb へ移行できます。
- LVM と mdadm を組み合わせることでオンラインでデータ移動が可能です。
- 操作前のバックアップ、各種表示コマンドでの確認、再起動時の動作確認が成功の鍵です。
Notes: 記載したサンプル出力は環境例です。実環境のデバイス名やサイズ、UUID は異なります。作業前に必ず自環境を確かめてください。