computerの日記

Cisco,SHELL,C,Qt,C++,Linux,ネットワーク,Windows Scriptなどの発言です

1台のハードディスクに OS をインストールしているが、ハードディスクを 1台追加し、 RAID1 (ミラーリング) を実現する方法

1. 同じサイズ(または新しいHDは大きい容量を持つ)の HD を用意する。

2. パーティションテーブルをコピーする。
# sfdisk -d /dev/sda | sfdisk --force /dev/sdb
確認する。
# lsblk -f
/dev/sda1 を真似して以下を実行する。
# mkfs.ext4 /dev/sdb1
確認する。
# lsblk -f

3. 以下を確認する。
# fdisk -l
/dev/sdb のパーティションを、Linux raid autodetect に変更すること。
やり方としては、fdisk /dev/sdb use "t" to convert all 3 partitions to "fd"
以下を確認する。
# fdisk -l
これも確認すること。
# parted
(parted) select /dev/sdb
(parted) print

(表示例)
========
1 ... boot,raid
2 ... raid
========

# mdadm --zero-superblock /dev/sdb1
# mdadm --zero-superblock /dev/sdb2
# mdadm --create /dev/md0 --level=1 --metadata=0.90 --raid-disks=2 missing /dev/sdb1
# mdadm --create /dev/md1 --level=1 --metadata=0.90 --raid-disks=2 missing /dev/sdb2
確認する。
# cat /proc/mdstat
# lsblk -f
# fdisk -l

4. /boot の内容を、/dev/mdX にコピーする。
# mkdir /mnt/tmp
初期化する。
# mkfs.ext4 /dev/mdX
# mount /dev/mdX /mnt/tmp
# rsync -aAXv --delete /boot/* /mnt/tmp
# umount /mnt/tmp

5. device.map を編集する
# vim /boot/grub/device.map
(表示例)
========
# this device map was generated by anaconda
(hd0) /dev/sda
----
以下を追加する。
(hd1) /dev/sdb
----
========
同様の作業を、/dev/mdX 上のデバイスでも実行する。
vim /mnt/tmp/grub/device.map
以下を追加して保存。
(hd1) /dev/sdb

以下のコマンドを実行する。
# grub-install /dev/sdb
(表示例)
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect.
fix it and re-run the script 'grub-install'.

# this device map was generated by anaconda
(hd0) /dev/sda
(hd1) /dev/sdb
----

これでよい。
まだまだ、作業が続きます。
ここで、一度仮想マシンを保存しておきます。
スナップショット作成 - "RAID-TEST-1"
ーーーーーーーーーーーーーーーーーーーーーーーー
以下を設定して、
# vim /boot/grub/grub.conf
rd_NO_MD を削除する。
再起動 - 起動した。

以下をやってみる。
mdadm --detail --scan
(表示)
ARRAY /dev/md/0_0 metadata=0.90 UUID=xxxx:xxxx:xxxx:xxxx
ARRAY /dev/md/1_0 metadata=0.90 UUID=xxxx:xxxx:xxxx:xxxx

mdadm --detail --scan > /etc/mdadm.conf
ここで、一度仮想マシンを保存しておきます。

#### スナップショット作成 - "RAID-TEST-2"

再起動する。
起動しました。

次に、/dev/sdb1 から boot させてみます。
/etc/fstab を編集して、/dev/sdb1 の ext4 にフォーマットされたデバイスの UUID にしてみます。
再起動します。
無事に、/dev/sdb1 の ext4 にフォーマットされたデバイスの UUID から起動したようです。
ここで、一度仮想マシンを保存しておきます。

#### スナップショット作成 - "RAID-TEST-3"

初期化する。
# mkfs.ext4 /dev/mdX
# lsblk -f

RAID アレイ /dev/md127 に LVM を作成して、現在の VG Name VolGroup に参加させる。
# pvcreate /dev/mdX
(表示例)
Physical volumn "/dev/mdX" successfully created
# vgextend VolGroup /dev/mdX
(表示例)
Volume group "VolGroup" successfully extended
確認する。

# pvdisplay
(表示例)
--- Physical volume ---
PV Name /dev/sda2
VG Name VolGroup
PV Size 31.51 GiB /not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 8066
Free PE 0
Allocated PE 8066
PV UUID xxxx-xxxx-xxxx...
...(snip)...

--- Physical volume ---
PV Name /dev/mdX
VG Name VolGroup
PV Size 31.51 GiB /not usable 2.94 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 8066
Free PE 8066
Allocated PE 0
PV UUID xxxx-xxxx-xxxx...
...(snip)...

以下のコマンドでも確認する。
# vgs
(表示の一例)
VG #PV #LV #SN Attr VSize VFree
VolGroup 2 2 0 wz- -n- 63.02g 31.51g

Volume Group を確認する。
# lvs -o+devices
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert Devices
lv_root VolGroup -wi-ao---- 28.31g /dev/sda2(0)
lv_swap VolGroup -wi-ao---- 3.20g /dev/sda2(7247)

データを移動する(コピーだと、/dev/sda2を抜けないので注意)。
実行
# pvmove -i 2 /dev/sda2 /dev/mdX
(表示例)
...(snip)...
/dev/sda2: Moved: 3.5%
...(snip)...
100% になったら終了

ここで、一度仮想マシンを保存しておきます。

#### スナップショット作成 - "RAID-TEST-4"

再起動する。

では、/dev/sda2 を抜いてみる。
VolGroup から /dev/sda2 を抜く
# vgreduce VolGroup /dev/sda2
(表示例)
Removed "/dev/sda2" from volume group "VolGroup"
# pvremove /dev/sda2
(表示例)
Labels on physical volume "/dev/sda2" successfully wiped
確認する
# pvdisplay
(表示例)
--- Physical volume ---
PV Name /dev/mdX
VG Name VolGroup
PV Size 31.51 GiB / not usable 2.94 MiB
...(snip)...

ここで、lsblk -f を確認する。
# lsblk -f
(確認)
sdb2 linux_raid_mem
|
-md127 LVM2_member
|-VolGroup-lv_root (dm-0)
ext4 xxxx-xxxx-... /
|-VolGroup-lv_swap (dm-1)
ext4 xxxx-xxxx-... [SWAP]

sda から消されて、sdb に、移った感じだ。

#### RAID-TEST-4.5 として保存する。####

ちゃんと起動しました。

grub.conf を編集する。

次のカーネルオプションを削除する。
rd_NO_MD rd_NO_DM
もう一度、mdadm.conf を作成します。
mdadm --detail --scan > /etc/mdadm.conf
そして、initramfs を再作成する。
設定等やドライバを含めまる。
# dracut -f -v --mdadmconf --lvmconf --add-drivers "raid1 raid10 raid456"

/boot に initramfs が異常なく作成できたようであれば、
ここで、一度仮想マシンを保存しておきます。

#### スナップショット作成 - "RAID-TEST-5"

再起動する。
# shutdown -r now

立ち上がった。
ここで、一度仮想マシンを保存しておきます。

#### スナップショット作成 - "RAID-TEST-6"

再起動する。
うまくいきました。
今、起動しているのは、/dev/sdb からという認識です。
grub.conf には、root (hd0,0) としていました。
これは、このままでいきます。
立ち上がりました。
ここで、一度仮想マシンを保存しておきます。

#### スナップショット作成 - "RAID-TEST-7"

それでは、実験です。
/dev/sda を切り離します。
その前に、fstab を編集します。
/dev/md127 /boot ext4 defaults 1 2
とします。
(そして、もう一度、mdadm を実行してみます。)

# fdisk /dev/sda
d 1 d 2 w

再起動します。
上手く起動しないようです。
レスキューDVDから起動します。
# grub
grub> find /grub/grub.conf としました。
grub> root
(hd0,0): Filesystem type unknown, partition type 0x0
grub> find /grub/grub.conf または、 find /grub/stage1
(hd0,0)
以下のようにした。
grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
grub> root
(hd0,0): Filesystem type is ext2fs, partition type 0x0
grub> reboot

起動した。

#### スナップショット作成 - "RAID-TEST-8"

# lsblk -f
上記で、sda に何もぶら下がっていないことを確認します。
では、VirtualBox で、最初のハードディスクを切り離してみます。
シャットダウンして、ハードディスクを、1つにしてみます。
わおーー、起動しましたーーー!!

これで、最初のハードディスクが一つの状態から、別のハードディスクに RAID1 になった状態で
移行できたことにーー、まだなりません。
なぜなら、今、ハードディスクが一つだからです。では、もう一つ、同じ容量のハードディスクを
つなげて、本当のRAID1にしてみましょう。
さて、以下のコマンドを実行します。

# lsblk -f

NAME FSTYPE LABEL UUID MOUNTPOINT
sr0
sda
sda1 linux_raid_mem xxxxxxx
md127 ext4 xxxxxxx
sda2 linux_raid_mem xxxxxxx
md126 LVM2_member xxxxxxx
VolGroup-lv_root (dm-0)
ext4 xxxxxxx
VolGroup-lv_swap (dm-1)
swap xxxxxxx
すばらしいーー。

#### スナップショット作成 - "RAID-TEST-9"

では、ハードディスクを追加してみましょう。

同じ要領のディスクを追加します。
では、前と同じ様にやっていきます。

# sfdisk /dev/sda | sfdisk --force /dev/sdb
# mkfs.ext4 /dev/sdb1
# mkfs.ext4 /dev/sdb2

# cat /proc/mdstat
Personalities : [raid1]
md126 : active raid1 sda2[1]
33041344 blocks [2/1] [_U]
md127 : active raid1 sda1[1]
511936 blocks [2/1] [_U]
unused devices: <none>

# mdadm -D /dev/mdX
# mdadm -D /dev/mdX

# mdadm --manage /dev/mdX --add /dev/sdb1
# mdadm --manage /dev/mdX --add /dev/sdb2

# cat /proc/mdstat
100% になるまで、観察します。
完了しました。

#### スナップショット作成 - "RAID-TEST-10"

ハードディスクを外します。
再起動します。
立ち上がらないです。
レスキューモードで立ち上げます。
# grub
grub> root
(hd0,0)
となっていたので、
grub> set root (hd0,0)
grub> setup (hd0)
grub> root
grub> reboot
bash# reboot
立ち上がりました。
さがせなければ、以下のようにします。
grub> find /grub/grub.conf

#### スナップショット作成 - "RAID-TEST-11"

では、ハードディスクを追加します。
no such partition...
grub> edit > root (hd0,0)
立ち上がりました。

今までのハードディスクをポート0につなぎます。
新しいハードディスクをポート1につなぎます。
容量は、少し大きいものがよいでしょう。
# fdisk /dev/sdb
同じように設定します。

一度、/dev/sda を実行して、p して、メモしておきます。
/dev/sda1 * 1 64 51200 fd
/dev/sda2 64 4178 33041408 fd

# mdadm --manage /dev/mdX --add /dev/sdb1
# mdadm --manage /dev/mdX --add /dev/sdb2

# cat /proc/mdstat
100% になったら終了。
以下のコマンドを実行して、同じ構成になったことを確認する。
# lsblk -f

#### スナップショット作成 - "RAID-TEST-12"

再起動
立ち上がります。

grub.conf を編集ししてみます。
(hd0,0) を、(hd1,0) にしてみます。
立ち上がります。

元に戻します。(hd1,0) を、(hd0,0) に。

では、いよいよ、ハードディスクを外してみます。
新しいハードディスクを外します。
起動させます。起動しました。
シャットダウンします。
古いハードディスク(RAID-NEWDISK-ADDED)を外して、新しいハードディスク(RAID-NEWLY-ADDED2)を接続します。
起動します。
おめでとうございます!成功です。