LVMをリサイズする過程で、手順をミスして「データ消失した!?」とパニクったけど、なんとか復旧できてホッとした話(雑な説明)。
RedHatの公式サイトにも書いてあるけど、
警告
機能している LVM 論理ボリュームについては、この手順を試みないでください。間違った UUID を指定するとデータ損失の原因となります。
ということなので、試すならSnapshotやバックアップ推奨。
環境
OS: Red Hat Enterprise Linux 8.6
PV: /dev/sdb1
VG: vg1
LV: lv1
mount point: /mnt
手順ミス
LVMをリサイズする手順のなかで、ディスクは容量拡張済み、というところからスタート。
まずは、現状の物理ボリュームとパーティションをチェック。
[root@testsrv ~]# pvs /dev/sdb1
PV VG Fmt Attr PSize PFree
/dev/sdb1 vg1 lvm2 a-- <1000.00g 0
[root@testsrv ~]# fdisk -l /dev/sdb
デバイス 起動 開始位置 終了位置 セクタ サイズ Id タイプ
/dev/sdb1 2048 2097151999 2097149952 1000G 8e Linux LVM
OK、じゃ次はパーティション情報を一旦削除してっと…
[root@testsrv ~]# fdisk /dev/sdb
(対話モード: p -> d -> ... w の手順)
[root@testsrv ~]# fdisk -l /dev/sdb
デバイス 起動 開始位置 終了位置 セクタ サイズ Id タイプ
/dev/sdb1 2048 2097151999 2097149952 1000G 83 Linux
よし。…ん?! あああ!
タイプ
Linux ← !!!
しまった、LVMにするの忘れてた!!
やらかした結果
おおう… なんかおかしくなってしまったぞ…
[root@testsrv ~]# pvs /dev/sdb1
Cannot use /dev/sdb1: device not found
物理ボリュームはもちろん、VG/LVともなくなってしまった。
…これはまずい。データはどこへいった?!
しかも再起動すると、
You are in emergency mode.
OSが正常起動しない!
ただし、これはサクッと /etc/fstab から /mnt のエントリーをコメントアウト、OS再起動して復旧。
復旧への道
助けてRedHat!
(rhel8用のドキュメントより、なぜかrhel6用の方がわかりやすい)
上記を参考に…
まずは、おかしくなる前のLVMメタデータ、そしてPVのUUIDを探す。
[root@testsrv ~]# ls -l /etc/lvm/archive/vg1*
-rw------- 1 root root 1320 6月 17 20:52 vg1_00000-4567891230.vg ← 多分これだ!
-rw------- 1 root root 894 6月 17 22:01 vg1_00001-1234567890.vg
[root@testsrv ~]# grep -i id -B 1 /etc/lvm/archive/vg1_00000-4567891230.vg
vg1 {
id = "FJKdi3-aFVi-emff-maia-Vndd-IEkd-KDIVJ0"
--
pv0 {
id = "Effvcc-Ca34-W32U-ftsp-B4FP-Tvde-dVC231" ← PVのUUID
そして、PVを復旧。
pvcreate はメタデータ領域だけを上書きして、既存データには影響しないそうだ。
[root@testsrv ~]# pvcreate --uuid "Effvcc-Ca34-W32U-ftsp-B4FP-Tvde-dVC231" --restorefile /etc/lvm/archive/vg1_00000-4567891230.vg /dev/sdb1
WARNING: Couldn't find device with uuid Effvcc-Ca34-W32U-ftsp-B4FP-Tvde-dVC231.
Physical volume "/dev/sdb1" successfully created.
[root@testsrv ~]# pvs /dev/sdb1
PV VG Fmt Attr PSize PFree
/dev/sdb1 lvm2 a-- <1000.00g 0
よし!戻ってきた!!
お次は、VGの復旧。
[root@testsrv ~]# vgcfgrestore vg1 -f /etc/lvm/archive/vg1_00000-4567891230.vg
Restored volume group vg1.
[root@testsrv ~]# vgs vg1
VG #PV #LV #SN Attr VSize VFree
vg1 1 1 0 wz--n- <1000.00g 0
[root@testsrv ~]# lvs vg1
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv1 vg1 -wi------- <1000.00g
よしよし!
でも、まぁだまだ。
[root@testsrv ~]# mount /mnt
mount: /mnt: スペシャルデバイス /dev/mapper/vg1-lv1 が存在しません.
[root@testsrv ~]# lvdisplay vg1 | grep -i status
LV Status NOT available
LVがアクティブ化されてないので、vgchange でアクティブ化!
[root@testsrv ~]# vgchange -ay vg1
1 logical volume(s) in volume group "vg1" now active
[root@testsrv ~]# lvdisplay vg1 | grep -i status
LV Status available
[root@testsrv ~]# lvs vg1
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv1 vg1 -wi-a----- <1000.00g
よかった… もとに戻った!!
教訓
LVMディスクの容量拡張前に、スナップショットを取ってたらよかったんだよ!!
ほんとそれ。。