lvm
RAID

LVM RAID の運用方法

はじめに

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

これで定常状態に戻りました。

参考