KVMのディスク内のLVをディスク外でマウントする

# はじめに
これは[KMC Advent Calender 2022](https://adventar.org/calendars/8005)の23日目の記事です。実に1年越しの投稿です。

突然KVMのゲストOSが起動しなくなった！
バックアップも取っていない！

......となったときに手持ちの仮想ディスクをホストOSにマウントして中身だけ救出したいという記事です。
バックアップは取っておきましょう。

# TL;DR
```
sudo modprobe nbd
sudo qemu-nbd --connect=/dev/nbd0 root.img
ls /dev/nbd0*
sudo vgscan
sudo lvdisplay → NOT available
sudo lvchange -ay /dev/ubuntu-vg/ubuntu-lv
sudo lvdisplay → available
sudo mount /dev/ubuntu-vg/ubuntu-lv /mnt/vm
```

# 環境
- ゲストOS
Ubuntu 22.04
インストール時にLVMを設定しており、パーティション構成は以下の通り
```
vda                       252:0    0    30G  0 disk
|-vda1                    252:1    0     1M  0 part
|-vda2                    252:2    0     2G  0 part /boot
`-vda3                    252:3    0    28G  0 part
  `-ubuntu--vg-ubuntu--lv 253:0    0    14G  0 lvm  /
```

# 手法
基本的には[【Linux】KVMの仮想ハードディスクイメージをマウントする](https://oplern.hatenablog.com/entry/2017/07/08/200228)に従いました。
```bash
sudo modprobe nbd
sudo qemu-nbd --connect=/dev/nbd0 root.img
```
として、
`ls /dev/nbd0*` を実行すると
```bash:ls /dev/nbd0*
/dev/nbd0  /dev/nbd0p1  /dev/nbd0p2  /dev/nbd0p3
```
となりました。
各ファイルがどのパーティションに当たるか確認します。
```bash:sudo file -s /dev/nbd0
/dev/nbd0: DOS/MBR boot sector, extended partition table (last)
```
```bash:sudo file -s /dev/nbd0p1
/dev/nbd0p1: data
```
```bash:sudo file -s /dev/nbd0p2
/dev/nbd0p2: Linux rev 1.0 ext4 filesystem data, UUID=9eb83deb-0c7a-456b-aa40-c83d01a4e2cf (extents) (64bit) (large files) (huge files)
```
```bash:sudo file -s /dev/nbd0p3
/dev/nbd0p3: LVM2 PV (Linux Logical Volume Manager), UUID: RQ0pW0-G6F5-424u-qPy0-PElY-ueeg-n6KGLv, size: 105223553024
```
番号はもとのファイルシステムに対応するようです。
`/`のデータが欲しいので今回マウントする対象は`/dev/nbd0p3`になります。`LVM2 PV`と記載があります。

ではこれをマウントしてみましょう。
コマンドは`sudo mount /dev/ubuntu-vg/ubuntu-lv /mnt/vm`です。
```bash:sudo mount /dev/ubuntu-vg/ubuntu-lv /mnt/vm
mount: /mnt/vm: special device /dev/ubuntu-vg/ubuntu-lv does not exist.
       dmesg(1) may have more information after failed mount system call.
```
`does not exist.`と出たのでLVの情報を見てみましょう。
```bash:sudo vgscan
  Found volume group "ubuntu-vg" using metadata type lvm2
```
```bash:sudo lvdisplay
  --- Logical volume ---
  LV Path                /dev/ubuntu-vg/ubuntu-lv
  LV Name                ubuntu-lv
  VG Name                ubuntu-vg
  LV UUID                fyPl34-vdGG-J4WA-ubDw-Xbq0-QfyD-DRpnxN
  LV Write Access        read/write
  LV Creation host, time ubuntu-server, 2023-12-06 13:57:52 +0900
  LV Status              NOT available
  LV Size                <98.00 GiB
  Current LE             25087
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
```
以下の部分が原因です。
```bash
  LV Status              NOT available
```
そこで、LVをActivateします。
```bash
sudo lvchange -ay /dev/ubuntu-vg/ubuntu-lv
```
結果、availableになっているのを確認できます。
```bash:sudo lvdisplay
  --- Logical volume ---
  LV Path                /dev/ubuntu-vg/ubuntu-lv
  LV Name                ubuntu-lv
  VG Name                ubuntu-vg
  LV UUID                fyPl34-vdGG-J4WA-ubDw-Xbq0-QfyD-DRpnxN
  LV Write Access        read/write
  LV Creation host, time ubuntu-server, 2023-12-06 13:57:52 +0900
  LV Status              available
  # open                 0
  LV Size                <98.00 GiB
  Current LE             25087
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:0
```
これでmountできるようになります。
```bash
sudo mount /dev/ubuntu-vg/ubuntu-lv /mnt/vm
```
の結果、
```bash:df -TH
/dev/mapper/ubuntu--vg-ubuntu--lv ext4      103G   31G   68G  32% /mnt/vm
```
無事mountされました。

# おわりに
バックアップは必ずしましょうね！

Advent Calenderもちゃんと期日通りに投稿しましょうね。