はじめに
LinuxでRAID構成を組もうとするとMDを使うことが多いと思いますが、LVMでもRAIDを構成することができます。(カーネルの中では結局同じ機能を使っているのですが。)
自宅サーバで LVM RAID を使っているのですが、数年に一回ディスクが壊れたときに復旧の方法を忘れてしまって調べるのが大変なので、メモも兼ねて残しておきます。
(ぐぐるとだいたい MD RAID が引っかかるので。)
環境
CentOS7 を使っていますが、最近のLinuxならおおよそできるはずです。
CentOS5 など古すぎると LVM が RAID に対応していないことがあります。
論理ボリューム作成方法
RAID1 で LV を作ります。
-m はミラー数なので、2ディスクで RAID1 を組むなら 1 を指定します。
# testvg という VG がある状態で
$ lvcreate --type raid1 -m 1 -L 1G -n vol0 testvg
Logical volume "vol0" created.
$ lvs -a -o +devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
vol0 testvg rwi-a-r--- 1.00g 100.00 vol0_rimage_0(0),vol0_rimage_1(0)
[vol0_rimage_0] testvg iwi-aor--- 1.00g /dev/sdf(1)
[vol0_rimage_1] testvg iwi-aor--- 1.00g /dev/sdg(1)
[vol0_rmeta_0] testvg ewi-aor--- 4.00m /dev/sdf(0)
[vol0_rmeta_1] testvg ewi-aor--- 4.00m /dev/sdg(0)
ディスク故障時の対応方法
ディスクが故障し、そのディスクを交換したとします。
RAID1 なので正常なディスクが一つでも残っていれば LV は通常通り利用することができます。
$ pvcreate /dev/sdg
WARNING: Device for PV FQlmyK-xpqS-RJIJ-Xxyr-PRvQ-KURY-FTH3wu not found or rejected by a filter.
Physical volume "/dev/sdg" successfully created.
$ pvs
WARNING: Device for PV FQlmyK-xpqS-RJIJ-Xxyr-PRvQ-KURY-FTH3wu not found or rejected by a filter.
PV VG Fmt Attr PSize PFree
/dev/sdf testvg lvm2 a-- <2.00g 1016.00m
/dev/sdg lvm2 --- 2.00g 2.00g
[unknown] testvg lvm2 a-m <2.00g 1016.00m
/dev/sdg が交換した新しいディスクです。
古いディスクは [unknown] として残っています。
交換したディスクを RAID に組み入れます。
lvconvert --repair で組み入れてくれます。
(ここでRAIDのリビルドが走ります。)
$ vgextend testvg /dev/sdg
WARNING: Not using lvmetad because a repair command was run.
Couldn't find device with uuid FQlmyK-xpqS-RJIJ-Xxyr-PRvQ-KURY-FTH3wu.
Volume group "testvg" successfully extended
$ lvconvert --repair testvg/vol0
WARNING: Disabling lvmetad cache for repair command.
WARNING: Not using lvmetad because of repair.
Couldn't find device with uuid FQlmyK-xpqS-RJIJ-Xxyr-PRvQ-KURY-FTH3wu.
Attempt to replace failed RAID images (requires full device resync)? [y/n]: y
Faulty devices in testvg/vol0 successfully replaced.
$ lvs -a -o +devices
WARNING: Not using lvmetad because a repair command was run.
Couldn't find device with uuid FQlmyK-xpqS-RJIJ-Xxyr-PRvQ-KURY-FTH3wu.
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
vol0 testvg rwi-aor--- 1.00g 100.00 vol0_rimage_0(0),vol0_rimage_1(0)
[vol0_rimage_0] testvg iwi-aor--- 1.00g /dev/sdg(1)
[vol0_rimage_1] testvg iwi-aor--- 1.00g /dev/sdf(1)
[vol0_rmeta_0] testvg ewi-aor--- 4.00m /dev/sdg(0)
[vol0_rmeta_1] testvg ewi-aor--- 4.00m /dev/sdf(0)
最後に壊れたディスクの PV を削除します。
vgreduce --removemissing で削除してくれます。
$ pvs
WARNING: Not using lvmetad because a repair command was run.
Couldn't find device with uuid FQlmyK-xpqS-RJIJ-Xxyr-PRvQ-KURY-FTH3wu.
PV VG Fmt Attr PSize PFree
/dev/sdf testvg lvm2 a-- <2.00g 1016.00m
/dev/sdg testvg lvm2 a-- <2.00g 1016.00m
[unknown] testvg lvm2 a-m <2.00g <2.00g
$ vgreduce --removemissing testvg
WARNING: Not using lvmetad because a repair command was run.
Couldn't find device with uuid FQlmyK-xpqS-RJIJ-Xxyr-PRvQ-KURY-FTH3wu.
Wrote out consistent volume group testvg.
$ pvs
WARNING: Not using lvmetad because a repair command was run.
PV VG Fmt Attr PSize PFree
/dev/sdf testvg lvm2 a-- <2.00g 1016.00m
/dev/sdg testvg lvm2 a-- <2.00g 1016.00m
これで定常状態に戻りました。