Proxmox で旧 SSD の仮想マシンを移行してみた
はじめに
Proxmox の新しい SSD をセットアップしたので、古い SSD に入っている仮想マシンをそのまま使えるように移行してみました。今回は LVM で構成されたストレージを Proxmox に認識させて、新しい SSD に移動するまでの流れ をまとめています。
作業前の準備
前提条件
- 新しい SSD に Proxmox をインストール済み
- 以前使用していた SSD(LVM 構成された仮想マシンディスクあり)を追加接続(データ移行後に取り外し予定)
-
旧 SSD の
/etc/pve/qemu-server/
にある.conf
ファイルを事前に取得しておくこと。- これがないと、仮想マシンの設定が復元できません。
LVM の認識状況を確認
SSD を接続したあと、Proxmox のターミナルで LVM の状態を確認しました。
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 をアクティブ化して仮想マシンのディスクを認識させます。
vgchange -ay pve
root@pve:~# vgchange -ay pve
19 logical volume(s) in volume group "pve" now active
次に、Proxmox にストレージとして追加します。
pvesm add lvmthin old-ssd --vgname pve --thinpool data --content images,rootdir
root@pve:~# pvesm add lvmthin old-ssd --vgname pve --thinpool data --content images,rootdir
ちゃんと認識できているか確認。
lvs
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/
にコピーします。
cp qemu-server/*.conf /etc/pve/qemu-server/
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/
にコピーします。
cp lxc/*.conf /etc/pve/lxc/
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
を開きます。
vi /etc/pve/qemu-server/101.conf
修正前:
sata0: local-lvm:vm-101-disk-0,size=32G
修正後:
sata0: old-ssd:vm-101-disk-0,size=32G
次に仮想マシン及びコンテナの一覧を再スキャン。
qm rescan
pct list
root@pve:~# qm rescan
rescan volumes...
root@pve:/etc/pve/nodes/pve/lxc# pct list
VMID Status Lock Name
100 stopped freenas
これで仮想マシン及びコンテナが Proxmox の管理画面に表示されました。
3. 仮想マシン及びコンテナのディスクを新しい SSD に移動
まず、仮想マシンのディスクがどこにあるかを確認します。
qm config 101
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
例:
sata0: old-ssd:vm-101-disk-0,size=32G
sata0
が対象ディスクになります。
次に、移動先のストレージを確認。
pvesm status
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
) に移動します。
qm move_disk 101 sata0 local-zfs
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%)
移動後、設定ファイルも更新されている。
root@pve:~# cat /etc/pve/qemu-server/101.conf | grep local-zfs
sata0: local-zfs:vm-101-disk-0,size=32G
他の仮想ディスクも同様に移動。
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
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%)
スナップショットを移動しようとすると、以下のようにエラーが出力されます。
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'
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
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
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
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
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
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
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
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
コンテナも同様に移動。
pct move_volume 100 rootfs local-zfs
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 を無効化します。
vgchange -an pve
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 のルートパーティションを確認
lsblk -o NAME,FSTYPE,MOUNTPOINT,SIZE
例:
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 のルートをマウント
mkdir -p /mnt/old-ssd
mount /dev/mapper/pve-root /mnt/old-ssd
3. クラスターファイルシステムを安全にコピーするため、サービスを停止
systemctl stop pve-cluster
systemctl stop pvedaemon
4. config.db をコピー
cp -p /mnt/old-ssd/var/lib/pve-cluster/config.db /var/lib/pve-cluster/config.db
5. クラスターファイルシステムを再起動
systemctl start pvedaemon
systemctl start pve-cluster
⚠ 注意:
- この方法では仮想マシンの設定だけでなく、データストアやその他の設定情報も復元されるため、慎重に実行!
- 既存の
config.db
をバックアップ (config.db.bak
など) してから作業することを推奨。
まとめ
- Proxmox で旧 SSD の LVM をアクティブ化し、ストレージを追加
- 事前に取得した
/etc/pve/qemu-server/
の.conf
ファイルをコピーして仮想マシンを復元 - 仮想マシンとコンテナを認識させ、ディスクを新 SSD (
rpool
) に移動 - 旧 SSD を無効化し、取り外し
これで、旧 SSD をそのまま認識し、新 SSD にデータを移行できました!
もし同じような状況に遭遇したら、ぜひ試してみてください!