LVMメタデータの消失と復旧

LVMをリサイズする過程で、手順をミスして「データ消失した！？」とパニクったけど、なんとか復旧できてホッとした話（雑な説明）。

RedHatの公式サイトにも書いてあるけど、

:::note alert
警告
機能している 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用の方がわかりやすい)

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/logical_volume_manager_administration/mdatarecover


上記を参考に… 
まずは、おかしくなる前の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 はメタデータ領域だけを上書きして、既存データには影響しないそうだ。
``` pvcreate --uuid [PV UUID] --restorefile [xxx.vg] [partition]　※"-t" でテスト実行可能
[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の復旧。
``` vgcfgrestore [VG] -f [xxx.vg]　※"--test" でテスト実行可能
[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
```
よかった… もとに戻った！！

:::note 
教訓
LVMディスクの容量拡張前に、スナップショットを取ってたらよかったんだよ！！
:::
ほんとそれ。。