Proxmox で LVM ストレージをインポートして仮想マシンを復旧してみた

# **Proxmox で旧 SSD の仮想マシンを移行してみた**

## **はじめに**

Proxmox の新しい SSD をセットアップしたので、古い SSD に入っている仮想マシンをそのまま使えるように移行してみました。今回は **LVM で構成されたストレージを Proxmox に認識させて、新しい SSD に移動するまでの流れ** をまとめています。

## **作業前の準備**

### **前提条件**
- **新しい SSD に Proxmox をインストール済み**
- **以前使用していた SSD（LVM 構成された仮想マシンディスクあり）を追加接続（データ移行後に取り外し予定）**
- **旧 SSD の `/etc/pve/qemu-server/` にある `.conf` ファイルを事前に取得しておくこと。**
  - これがないと、仮想マシンの設定が復元できません。

### **LVM の認識状況を確認**

SSD を接続したあと、Proxmox のターミナルで LVM の状態を確認しました。

```bash
root@pve:~# pvs
  PV             VG  Fmt  Attr PSize PFree
  /dev/nvme2n1p3 pve lvm2 a--  1.45t 16.00g
root@pve:~# vgs
  VG  #PV #LV #SN Attr   VSize VFree
  pve   1  21   0 wz--n- 1.45t 16.00g
root@pve:~# lvs
  LV                      VG  Attr       LSize   Pool Origin        Data%  Meta%  Move Log Cpy%Sync Convert
  data                    pve twi-aotz--   1.31t                    31.45  1.07
  root                    pve -wi-a-----  96.00g
  snap_vm-100-disk-0_test pve Vri---tz-k   8.00g data vm-100-disk-0
  snap_vm-103-disk-0_test pve Vri---tz-k  32.00g data vm-103-disk-0
  swap                    pve -wi-a-----   8.00g
  vm-100-disk-0           pve Vwi-a-tz--   8.00g data               17.76
  vm-101-disk-0           pve Vwi-a-tz--  32.00g data               14.49
  vm-102-disk-0           pve Vwi-a-tz--  32.00g data               12.16
  vm-102-disk-1           pve Vwi-a-tz-- 100.00g data               93.64
  vm-102-disk-2           pve Vwi-a-tz-- 100.00g data               41.95
  vm-103-disk-0           pve Vwi-a-tz--  32.00g data               24.70
  vm-103-state-test       pve Vwi-a-tz--  <8.49g data               27.40
  vm-104-disk-0           pve Vwi-a-tz--  60.00g data               39.57
  vm-105-disk-0           pve Vwi-a-tz--  60.00g data               78.59
  vm-106-disk-0           pve Vwi-a-tz--  60.00g data               77.76
  vm-107-disk-0           pve Vwi-a-tz--   4.00m data               3.12
  vm-107-disk-1           pve Vwi-a-tz--  16.00g data               25.67
  vm-108-disk-0           pve Vwi-a-tz--  32.00g data               11.79
  vm-111-disk-0           pve Vwi-a-tz--  16.00g data               25.64
  vm-112-disk-0           pve Vwi-a-tz-- 100.00g data               94.31
  vm-113-disk-0           pve Vwi-a-tz-- 100.00g data               41.27
```

出力結果を見ると、`pve` という VG（ボリュームグループ）が存在し、その中に `data` という LVM-Thin プールと仮想マシンのディスクが格納されていることが分かりました。

## **1. 旧 SSD を認識させる**

まずは、LVM をアクティブ化して仮想マシンのディスクを認識させます。

```bash
vgchange -ay pve
```

```bash
root@pve:~# vgchange -ay pve
  19 logical volume(s) in volume group "pve" now active
```

次に、Proxmox にストレージとして追加します。

```bash
pvesm add lvmthin old-ssd --vgname pve --thinpool data --content images,rootdir
```

```bash
root@pve:~# pvesm add lvmthin old-ssd --vgname pve --thinpool data --content images,rootdir
```

ちゃんと認識できているか確認。

```bash
lvs
```

```bash
root@pve:~# lvs
  LV                      VG  Attr       LSize   Pool Origin        Data%  Meta%  Move Log Cpy%Sync Convert
  data                    pve twi-aotz--   1.31t                    31.45  1.07                         
  root                    pve -wi-a-----  96.00g                                                        
  snap_vm-100-disk-0_test pve Vri---tz-k   8.00g data vm-100-disk-0                                     
  snap_vm-103-disk-0_test pve Vri---tz-k  32.00g data vm-103-disk-0                                     
  swap                    pve -wi-a-----   8.00g                                                        
  vm-100-disk-0           pve Vwi-a-tz--   8.00g data               17.76                               
  vm-101-disk-0           pve Vwi-a-tz--  32.00g data               14.49                               
  vm-102-disk-0           pve Vwi-a-tz--  32.00g data               12.16                               
  vm-102-disk-1           pve Vwi-a-tz-- 100.00g data               93.64                               
  vm-102-disk-2           pve Vwi-a-tz-- 100.00g data               41.95                               
  vm-103-disk-0           pve Vwi-a-tz--  32.00g data               24.70                               
  vm-103-state-test       pve Vwi-a-tz--  <8.49g data               27.40                               
  vm-104-disk-0           pve Vwi-a-tz--  60.00g data               39.57                               
  vm-105-disk-0           pve Vwi-a-tz--  60.00g data               78.59                               
  vm-106-disk-0           pve Vwi-a-tz--  60.00g data               77.76                               
  vm-107-disk-0           pve Vwi-a-tz--   4.00m data               3.12                                
  vm-107-disk-1           pve Vwi-a-tz--  16.00g data               25.67                               
  vm-108-disk-0           pve Vwi-a-tz--  32.00g data               11.79                               
  vm-111-disk-0           pve Vwi-a-tz--  16.00g data               25.64                               
  vm-112-disk-0           pve Vwi-a-tz-- 100.00g data               94.31                               
  vm-113-disk-0           pve Vwi-a-tz-- 100.00g data               41.27                               
```

## **2. 仮想マシンの設定ファイルを復元**

取得しておいた仮想マシンの `.conf` ファイルを `/etc/pve/qemu-server/` にコピーします。

```bash
cp  qemu-server/*.conf /etc/pve/qemu-server/
```
    
```bash
root@pve:~/qemu-server# pwd
/root/qemu-server
root@pve:~/qemu-server# ls -alF
total 67
dr-xr-xr-x 2 root www-data   13 May  5  2024 ./
drwx------ 5 root root       11 Feb 11 17:51 ../
-r--r----- 1 root www-data  389 Feb  8 00:30 101.conf
-r--r----- 1 root www-data  569 Feb  9 23:52 102.conf
-r--r----- 1 root www-data 1044 Feb 10 11:39 103.conf
-r--r----- 1 root www-data  405 Feb 10 11:19 104.conf
-r--r----- 1 root www-data  358 Feb 11 12:00 105.conf
-r--r----- 1 root www-data  358 Feb 10 10:54 106.conf
-r--r----- 1 root www-data  419 Jun 23  2024 107.conf
-r--r----- 1 root www-data  479 Feb  8 10:36 108.conf
-r--r----- 1 root www-data  308 Oct 31 21:23 111.conf
-r--r----- 1 root www-data  236 Feb  7 00:10 112.conf
-r--r----- 1 root www-data  241 May 11  2024 113.conf
root@pve:~/qemu-server# cp * /etc/pve/qemu-server/
```

取得しておいたコンテナの `.conf` ファイルを `/etc/pve/lxc/` にコピーします。

```bash
cp  lxc/*.conf /etc/pve/lxc/
```

```bash
root@pve:~/lxc# pwd
/root/lxc
root@pve:~/lxc# ls -alF
total 18
dr-xr-xr-x 2 root www-data    4 May  5  2024 ./
drwx------ 6 root root       12 Feb 11 20:25 ../
-r--r----- 1 root www-data 1386 Feb 11 13:14 100.conf
-r--r----- 1 root www-data  680 Jun 30  2024 100.conf.BAK
root@pve:~/lxc# cp 100.conf /etc/pve/nodes/pve/lxc/
```

次に仮想マシン及びコンテナの `.conf` ファイル内のディスク情報を修正します。

例えば、`/etc/pve/qemu-server/101.conf` を開きます。

```bash
vi /etc/pve/qemu-server/101.conf
```

修正前:
```bash
sata0: local-lvm:vm-101-disk-0,size=32G
```

修正後:
```bash
sata0: old-ssd:vm-101-disk-0,size=32G
```

次に仮想マシン及びコンテナの一覧を再スキャン。

```bash
qm rescan
pct list
```

```bash
root@pve:~# qm rescan
rescan volumes...
root@pve:/etc/pve/nodes/pve/lxc# pct list
VMID       Status     Lock         Name
100        stopped                 freenas
```

これで仮想マシン及びコンテナが Proxmox の管理画面に表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/fcd73e1a-a122-7519-63e6-44ed28024824.png)

## **3. 仮想マシン及びコンテナのディスクを新しい SSD に移動**

まず、仮想マシンのディスクがどこにあるかを確認します。

```bash
qm config 101
```

```bash
root@pve:~# qm config 101
boot: order=sata0;ide2;net0
cores: 6
cpu: host
ide2: none,media=cdrom
memory: 32768
meta: creation-qemu=8.1.5,ctime=1716569162
name: esxi67
net0: e1000=BC:24:11:77:19:A5,bridge=vmbr0,firewall=1
numa: 0
ostype: l26
sata0: old-ssd:vm-101-disk-0,size=32G
scsihw: virtio-scsi-single
smbios1: uuid=d7cdaa7e-7210-46da-a9f0-877fd6f93d63
sockets: 1
vmgenid: 8918c6f0-d350-46c4-9153-d81edca8e665
```

例:
```bash
sata0: old-ssd:vm-101-disk-0,size=32G
```

`sata0` が対象ディスクになります。

次に、移動先のストレージを確認。

```bash
pvesm status
```

```bash
root@pve:~# pvesm status
Name             Type     Status           Total            Used       Available        %
local             dir     active      6105437568             128      6105437440    0.00%
local-zfs     zfspool     active      6105437652              96      6105437556    0.00%
old-ssd       lvmthin     active      1407217664       442569955       964647708   31.45%
```

`local-zfs` が ZFS ストレージとして認識されていることを確認。

仮想マシンを ZFS (`local-zfs`) に移動します。

```bash
qm move_disk 101 sata0 local-zfs
```

```bash
root@pve:~# qm move_disk 101 sata0 local-zfs
create full clone of drive sata0 (old-ssd:vm-101-disk-0)
transferred 0.0 B of 32.0 GiB (0.00%)
transferred 327.7 MiB of 32.0 GiB (1.00%)
省略
transferred 32.0 GiB of 32.0 GiB (100.00%)
transferred 32.0 GiB of 32.0 GiB (100.00%)
```

移動後、設定ファイルも更新されている。
```bash
root@pve:~# cat /etc/pve/qemu-server/101.conf | grep local-zfs
sata0: local-zfs:vm-101-disk-0,size=32G
```

他の仮想ディスクも同様に移動。

```bash
root@pve:~# cat /etc/pve/qemu-server/102.conf | grep old-ssd
scsi0: old-ssd:vm-102-disk-0,iothread=1,size=32G
scsi1: old-ssd:vm-102-disk-1,iothread=1,size=100G
scsi2: old-ssd:vm-102-disk-2,iothread=1,size=100G
root@pve:~# qm move_disk 102 scsi0 local-zfs
root@pve:~# qm move_disk 102 scsi1 local-zfs
root@pve:~# qm move_disk 102 scsi2 local-zfs
scsi0: local-zfs:vm-102-disk-0,iothread=1,size=32G
scsi1: local-zfs:vm-102-disk-1,iothread=1,size=100G
scsi2: local-zfs:vm-102-disk-2,iothread=1,size=100G
```

```bash
root@pve:~# cat /etc/pve/qemu-server/103.conf
boot: order=scsi0;ide2;net0
cores: 4
cpu: host
ide2: local:iso/rhel-9.3-x86_64-dvd.iso,media=cdrom,size=10282112K
memory: 4096
meta: creation-qemu=8.1.5,ctime=1718764876
name: RHEL9
net0: virtio=BC:24:11:21:8F:33,bridge=vmbr0,firewall=1
numa: 0
ostype: l26
parent: test
scsi0: local-zfs:vm-103-disk-0,iothread=1,size=32G
scsihw: virtio-scsi-single
smbios1: uuid=1f382653-2a46-4dcd-99e5-a3048eabca96
sockets: 1
unused0: old-ssd:vm-103-disk-0
vmgenid: eb08fd42-3ea7-409e-93bf-a22e188e1b3a

[test]
boot: order=scsi0;ide2;net0
cores: 4
cpu: host
ide2: local:iso/rhel-9.3-x86_64-dvd.iso,media=cdrom,size=10282112K
memory: 4096
meta: creation-qemu=8.1.5,ctime=1718764876
name: RHEL9
net0: virtio=BC:24:11:21:8F:33,bridge=vmbr0,firewall=1
numa: 0
ostype: l26
runningcpu: host,+kvm_pv_eoi,+kvm_pv_unhalt
runningmachine: pc-i440fx-9.0+pve0
scsi0: old-ssd:vm-103-disk-0,iothread=1,size=32G
scsihw: virtio-scsi-single
smbios1: uuid=1f382653-2a46-4dcd-99e5-a3048eabca96
snaptime: 1738383007
sockets: 1
vmgenid: eb08fd42-3ea7-409e-93bf-a22e188e1b3a
vmstate: old-ssd:vm-103-state-test
root@pve:~# qm move_disk 103 scsi0 local-zfs
moving disk with snapshots, snapshots will not be moved!
create full clone of drive scsi0 (old-ssd:vm-103-disk-0)
transferred 0.0 B of 32.0 GiB (0.00%)
transferred 327.7 MiB of 32.0 GiB (1.00%)
```

:::note warn
スナップショットを移動しようとすると、以下のようにエラーが出力されます。

```bash
root@pve:~# qm move_disk 103 vmstate local-zfs
400 Parameter verification failed.
disk: value 'vmstate' does not have a value in the enumeration 'ide0, ide1, ide2, ide3, scsi0, scsi1, scsi2, scsi3, scsi4, scsi5, scsi6, scsi7, scsi8, scsi9, scsi10, scsi11, scsi12, scsi13, scsi14, scsi15, scsi16, scsi17, scsi18, scsi19, scsi20, scsi21, scsi22, scsi23, scsi24, scsi25, scsi26, scsi27, scsi28, scsi29, scsi30, virtio0, virtio1, virtio2, virtio3, virtio4, virtio5, virtio6, virtio7, virtio8, virtio9, virtio10, virtio11, virtio12, virtio13, virtio14, virtio15, sata0, sata1, sata2, sata3, sata4, sata5, efidisk0, tpmstate0, unused0, unused1, unused2, unused3, unused4, unused5, unused6, unused7, unused8, unused9, unused10, unused11, unused12, unused13, unused14, unused15, unused16, unused17, unused18, unused19, unused20, unused21, unused22, unused23, unused24, unused25, unused26, unused27, unused28, unused29, unused30, unused31, unused32, unused33, unused34, unused35, unused36, unused37, unused38, unused39, unused40, unused41, unused42, unused43, unused44, unused45, unused46, unused47, unused48, unused49, unused50, unused51, unused52, unused53, unused54, unused55, unused56, unused57, unused58, unused59, unused60, unused61, unused62, unused63, unused64, unused65, unused66, unused67, unused68, unused69, unused70, unused71, unused72, unused73, unused74, unused75, unused76, unused77, unused78, unused79, unused80, unused81, unused82, unused83, unused84, unused85, unused86, unused87, unused88, unused89, unused90, unused91, unused92, unused93, unused94, unused95, unused96, unused97, unused98, unused99, unused100, unused101, unused102, unused103, unused104, unused105, unused106, unused107, unused108, unused109, unused110, unused111, unused112, unused113, unused114, unused115, unused116, unused117, unused118, unused119, unused120, unused121, unused122, unused123, unused124, unused125, unused126, unused127, unused128, unused129, unused130, unused131, unused132, unused133, unused134, unused135, unused136, unused137, unused138, unused139, unused140, unused141, unused142, unused143, unused144, unused145, unused146, unused147, unused148, unused149, unused150, unused151, unused152, unused153, unused154, unused155, unused156, unused157, unused158, unused159, unused160, unused161, unused162, unused163, unused164, unused165, unused166, unused167, unused168, unused169, unused170, unused171, unused172, unused173, unused174, unused175, unused176, unused177, unused178, unused179, unused180, unused181, unused182, unused183, unused184, unused185, unused186, unused187, unused188, unused189, unused190, unused191, unused192, unused193, unused194, unused195, unused196, unused197, unused198, unused199, unused200, unused201, unused202, unused203, unused204, unused205, unused206, unused207, unused208, unused209, unused210, unused211, unused212, unused213, unused214, unused215, unused216, unused217, unused218, unused219, unused220, unused221, unused222, unused223, unused224, unused225, unused226, unused227, unused228, unused229, unused230, unused231, unused232, unused233, unused234, unused235, unused236, unused237, unused238, unused239, unused240, unused241, unused242, unused243, unused244, unused245, unused246, unused247, unused248, unused249, unused250, unused251, unused252, unused253, unused254, unused255'
```
:::

```bash
root@pve:~# cat /etc/pve/qemu-server/104.conf | grep old-ssd
scsi0: old-ssd:vm-104-disk-0,size=60G
root@pve:~# qm move_disk 104 scsi0 local-zfs
root@pve:~# cat /etc/pve/qemu-server/104.conf | grep local-zfs
scsi0: local-zfs:vm-104-disk-0,size=60G
```

```bash
root@pve:~# cat /etc/pve/qemu-server/105.conf | grep old-ssd
sata0: old-ssd:vm-105-disk-0,size=60G
root@pve:~# qm move_disk 105 sata0 local-zfs
root@pve:~# cat /etc/pve/qemu-server/105.conf | grep local-zfs
sata0: local-zfs:vm-105-disk-2,size=60G
```

```bash
root@pve:~# cat /etc/pve/qemu-server/106.conf | grep old-ssd
sata0: old-ssd:vm-106-disk-0,size=60G
root@pve:~# qm move_disk 106 sata0 local-zfs
root@pve:~# cat /etc/pve/qemu-server/106.conf | grep local-zfs
sata0: local-zfs:vm-106-disk-0,size=60G
```

```bash
root@pve:~# cat /etc/pve/qemu-server/107.conf | grep old-ssd
efidisk0: old-ssd:vm-107-disk-0,size=4M
scsi0: old-ssd:vm-107-disk-1,size=16G
root@pve:~# qm move_disk 107 scsi0 local-zfs
root@pve:~# qm move_disk 107 efidisk0 local-zfs
root@pve:~# cat /etc/pve/qemu-server/107.conf | grep local-zfs
efidisk0: local-zfs:vm-107-disk-1,size=1M
scsi0: local-zfs:vm-107-disk-0,size=16G
```

```bash
root@pve:~# cat /etc/pve/qemu-server/108.conf | grep old-ssd
scsi0: old-ssd:vm-108-disk-0,iothread=1,size=32G
root@pve:~# qm move_disk 108 scsi0 local-zfs
root@pve:~# cat /etc/pve/qemu-server/108.conf | grep local-zfs
scsi0: local-zfs:vm-108-disk-0,iothread=1,size=32G
```

```bash
root@pve:~# cat /etc/pve/qemu-server/111.conf | grep old-ssd
scsi0: old-ssd:vm-111-disk-0,size=16G
root@pve:~# qm move_disk 111 scsi0 local-zfs
root@pve:~# cat /etc/pve/qemu-server/111.conf | grep local-zfs
scsi0: local-zfs:vm-111-disk-0,size=16G
```

```bash
root@pve:~# cat /etc/pve/qemu-server/112.conf | grep old-ssd
scsi0: old-ssd:vm-112-disk-0,size=100G
root@pve:~# qm move_disk 112 scsi0 local-zfs
root@pve:~# cat /etc/pve/qemu-server/112.conf | grep local-zfs
scsi0: local-zfs:vm-112-disk-0,size=100G
```

```bash
root@pve:~# cat /etc/pve/qemu-server/113.conf | grep old-ssd
scsi0: old-ssd:vm-113-disk-0,size=100G
root@pve:~# qm move_disk 113 scsi0 local-zfs
root@pve:~# cat /etc/pve/qemu-server/113.conf | grep local-zfs
scsi0: local-zfs:vm-113-disk-0,size=100G
```

コンテナも同様に移動。

```bash
pct move_volume 100 rootfs local-zfs
```

```bash
root@pve:/etc/pve/nodes/pve/lxc# pct move_volume 100 rootfs local-zfs
Number of files: 27,231 (reg: 21,495, dir: 2,449, link: 3,257, special: 30)
Number of created files: 27,230 (reg: 21,495, dir: 2,448, link: 3,257, special: 30)
Number of deleted files: 0
Number of regular files transferred: 21,488
Total file size: 920,958,659 bytes
Total transferred file size: 916,768,694 bytes
Literal data: 916,768,694 bytes
Matched data: 0 bytes
File list size: 786,393
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 918,639,104
Total bytes received: 433,492

sent 918,639,104 bytes  received 433,492 bytes  87,530,723.43 bytes/sec
total size is 920,958,659  speedup is 1.00
```

この作業を仮想マシン及びコンテナごとに繰り返します。

### **4. 起動確認**

インポートした仮想マシンが起動することを確認します。

## **5. 旧 SSD を取り外す準備**

すべてのデータを移行したら、LVM を無効化します。

```bash
vgchange -an pve
```

```bash
root@pve:/etc/pve/nodes/pve/lxc# vgchange -an pve
  0 logical volume(s) in volume group "pve" now active
```

これで旧 SSD を物理的に取り外せます。

## **補足: config.db を移行する方法**

**⚠ この方法では仮想マシンの設定だけでなく、データストアやその他の設定情報も復元されるため、慎重に実行してください！**

### **1. 旧 SSD のルートパーティションを確認**

```bash
lsblk -o NAME,FSTYPE,MOUNTPOINT,SIZE
```

例:
```bash
NAME        FSTYPE      MOUNTPOINT  SIZE
sdb                    
├─sdb1      vfat                   512M
├─sdb2      ext4                   1.0G
└─sdb3      LVM2_member            1.5T
  ├─pve-root ext4                   96G
  ├─pve-swap swap                    8G
  ├─pve-data thin-pool             1.31T
```

`pve-root` が旧 SSD のルートパーティションなので、これをマウント。

### **2. 旧 SSD のルートをマウント**

```bash
mkdir -p /mnt/old-ssd
mount /dev/mapper/pve-root /mnt/old-ssd
```

### **3. クラスターファイルシステムを安全にコピーするため、サービスを停止**

```bash
systemctl stop pve-cluster
systemctl stop pvedaemon
```

### **4. config.db をコピー**

```bash
cp -p /mnt/old-ssd/var/lib/pve-cluster/config.db /var/lib/pve-cluster/config.db
```

### **5. クラスターファイルシステムを再起動**

```bash
systemctl start pvedaemon
systemctl start pve-cluster
```

**⚠ 注意:**
- **この方法では仮想マシンの設定だけでなく、データストアやその他の設定情報も復元されるため、慎重に実行！**
- 既存の `config.db` をバックアップ (`config.db.bak` など) してから作業することを推奨。

## **まとめ**

1. **Proxmox で旧 SSD の LVM をアクティブ化し、ストレージを追加**
2. **事前に取得した `/etc/pve/qemu-server/` の `.conf` ファイルをコピーして仮想マシンを復元**
3. **仮想マシンとコンテナを認識させ、ディスクを新 SSD (`rpool`) に移動**
4. **旧 SSD を無効化し、取り外し**

これで、旧 SSD をそのまま認識し、新 SSD にデータを移行できました！

もし同じような状況に遭遇したら、ぜひ試してみてください！