1 - 备份和恢复虚拟机
背景知识
虚拟机相关的文件一般默认在 /var/lib/vz/
下
系统镜像一般在: /var/lib/vz/template/iso
备份在web页面操作,备份目录一般在 /var/lib/vz/dump
使用pve的备份功能
备份虚拟机
在 pve 的页面,选择需要备份的虚拟机(或者 template), “Backup” 选项中,点击 “Backup”。压缩选择 none, mode 选择 stop, 存储选 local,开始备份:
备份过程:
INFO: starting new backup job: vzdump 102 --storage local --node skyserver --remove 0 --mode stop --compress 0 --notes-template '{{guestname}}'
INFO: Starting Backup of VM 102 (qemu)
INFO: Backup started at 2023-07-26 01:23:50
INFO: status = stopped
INFO: backup mode: stop
INFO: ionice priority: 7
INFO: VM Name: template-ubuntu-20.04-5.4-basic-r02
INFO: include disk 'scsi0' 'nfs:102/base-102-disk-1.qcow2' 512G
INFO: include disk 'efidisk0' 'nfs:102/base-102-disk-0.qcow2' 528K
INFO: creating vzdump archive '/var/lib/vz/dump/vzdump-qemu-102-2023_07_26-01_23_50.vma'
INFO: starting template backup
INFO: /usr/bin/vma create -v -c /var/lib/vz/dump/vzdump-qemu-102-2023_07_26-01_23_50.tmp/qemu-server.conf exec:cat > /var/lib/vz/dump/vzdump-qemu-102-2023_07_26-01_23_50.dat drive-efidisk0=/mnt/pve/nfs/images/102/base-102-disk-0.qcow2 drive-scsi0=/mnt/pve/nfs/images/102/base-102-disk-1.qcow2
INFO: progress 0% 0/549756354560 0
INFO: progress 1% 5500125184/549756354560 4384260096
INFO: progress 2% 10995187712/549756354560 9787478016
INFO: progress 3% 16492740608/549756354560 10499731456
INFO: progress 4% 21993046016/549756354560 15671595008
......
INFO: progress 98% 538762362880/549756354560 520591867904
INFO: progress 99% 544258801664/549756354560 525779709952
INFO: progress 100% 549756354560/549756354560 529814441984
INFO: image drive-efidisk0: size=540672 zeros=49152 saved=491520
INFO: image drive-scsi0: size=549755813888 zeros=529814392832 saved=19941421056
INFO: archive file size: 18.64GB
INFO: adding notes to backup
INFO: Finished Backup of VM 102 (00:01:04)
INFO: Backup finished at 2023-07-26 01:24:54
INFO: Backup job finished successfully
TASK OK
备份的结果:
这里可以看到文件名为 vzdump-qemu-102-2023_07_26-01_23_50.vma
,文件大小为 20.02G。
ls -lh /var/lib/vz/dump/*.vma
可以看到保存的备份文件:
ls -lh /var/lib/vz/dump/*.vma
-rw-r--r-- 1 root root 19G Jul 26 01:24 /var/lib/vz/dump/vzdump-qemu-102-2023_07_26-01_23_50.vma
如果备份时候选择了 zstd 压缩,请后面使用备份文件时要先使用 zstd 解压得到 vma 文件:
zstd -d vzdump-qemu-102-2023_07_26-01_23_50.vma.zst
下载虚拟机文件
通过 scp 等方式将备份文件下载下来:
scp ./vzdump-qemu-102-2023_07_26-01_23_50.vma sky@192.168.0.240:/media/sky/data/backup/pve
通过vma命令转换成raw后缀的磁盘文件
vma extract vzdump-qemu-103-2023_04_01-13_36_26.vma extract
可以通过这样的命令下载整个机器上所有的备份文件到本地磁盘(这里是苹果笔记本上插的移动硬盘):
scp root@192.168.20.29:"/var/lib/vz/dump/vzdump-*" /Volumes/u4t/data/backup/pve-backup/skyaio2
上传虚拟机文件
类似的,将虚拟机备份文件上传到准备做恢复的 pve 上,目标路径同样为 /var/lib/vz/dump/
scp /media/sky/data/backup/pve/vzdump-qemu-102-2023_07_26-01_23_50.vma root@192.168.0.8:/var/lib/vz/dump/
如果执行备份和恢复的这两台机器之间可以直通,则可以直接传递备份文件:
scp /var/lib/vz/dump/vzdump-qemu-107-2023_07_26-02_23_55.vma root@192.168.0.8:/var/lib/vz/dump/
恢复虚拟机
登录要恢复的 pve, 找到 local 仓库,Backup 子项中已经可以看到刚才上传的的虚拟机备份文件:
点击 “restore”,选择存储:
恢复过程:
restore vma archive: vma extract -v -r /var/tmp/vzdumptmp24252.fifo /var/lib/vz/dump/vzdump-qemu-102-2023_07_26-01_23_50.vma /var/tmp/vzdumptmp24252
CFG: size: 637 name: qemu-server.conf
DEV: dev_id=1 size: 540672 devname: drive-efidisk0
DEV: dev_id=2 size: 549755813888 devname: drive-scsi0
CTIME: Wed Jul 26 01:23:50 2023
Rounding up size to full physical extent 4.00 MiB
Logical volume "vm-100-disk-0" created.
new volume ID is 'local-lvm:vm-100-disk-0'
WARNING: You have not turned on protection against thin pools running out of space.
WARNING: Set activation/thin_pool_autoextend_threshold below 100 to trigger automatic extension of thin pools before they get full.
Logical volume "vm-100-disk-1" created.
WARNING: Sum of all thin volume sizes (512.00 GiB) exceeds the size of thin pool pve/data and the size of whole volume group (<399.00 GiB).
new volume ID is 'local-lvm:vm-100-disk-1'
map 'drive-efidisk0' to '/dev/pve/vm-100-disk-0' (write zeros = 0)
map 'drive-scsi0' to '/dev/pve/vm-100-disk-1' (write zeros = 0)
progress 1% (read 5497618432 bytes, duration 2 sec)
progress 2% (read 10995171328 bytes, duration 3 sec)
......
progress 99% (read 544258785280 bytes, duration 64 sec)
progress 100% (read 549756338176 bytes, duration 67 sec)
total bytes read 549756403712, sparse bytes 529814392832 (96.4%)
space reduction due to 4K zero blocks 2.65%
rescan volumes...
VM 100 (efidisk0): size of disk 'local-lvm:vm-100-disk-0' updated from 528K to 4M
Convert to template.
Renamed "vm-100-disk-1" to "base-100-disk-1" in volume group "pve"
Logical volume pve/base-100-disk-1 changed.
WARNING: Combining activation change with other commands is not advised.
Renamed "vm-100-disk-0" to "base-100-disk-0" in volume group "pve"
Logical volume pve/base-100-disk-0 changed.
WARNING: Combining activation change with other commands is not advised.
TASK OK
恢复完成后的虚拟机:
参考资料
通过虚拟磁盘的方式备份
2 - 虚拟机备份实战
2.1 - 从raw/qcow2格式的镜像文件中恢复虚拟机
背景
由于没有备份虚拟机配置文件,而进行了诸如 timeshift restore 的操作,导致虚拟机配置文件消失,管理页面上看不到虚拟机,而镜像文件残存。
备注:后续要做好虚拟机配置文件的备份,配置文件都很小,容易备份和保存。
恢复操作
查看镜像文件情况
ssh 登录到 pve 主机,执行
cd /var/lib/vz/images
进入虚拟机镜像保存目录,每个虚拟机都在单独的子目录下保存,目录名为 虚拟机id:
$ ls
100 101 102
进入要恢复的虚拟机如 100, 可以看到格式为 raw 的镜像文件。
$ ls
vm-100-disk-0.raw
这是一个 openwrt 的镜像。
新建虚拟机
新建一个虚拟机以便稍后倒入镜像文件,这里按照正常的虚拟机创建操作进行即可,磁盘那里可以不用设置,稍后会删除这个磁盘,然后使用倒入的磁盘。
记录新建虚拟机的 id 备用。
导入镜像
使用 qm importdisk
命令来进行导入,命令格式为:
qm importdisk <vmid> <images-name> <storage pool> --format=<disk-fs>
实际操行的例子:
qm importdisk 100 ./vm-100-disk-0.raw local --format=qcow2
注意要先创建虚拟机,这个命令的意思是将这个镜像文件导入到目标虚拟机中, 因此目标虚拟机必须先存在。
否则会报错:
qm importdisk 100 ./vm-100-disk-0.raw local --format=qcow2
Configuration file 'nodes/skydev/qemu-server/100.conf' does not exist
成功执行 qm importdisk
命令的输入为:
importing disk './vm-100-disk-0.raw' to VM 100 ...
Formatting '/var/lib/vz/images/100/vm-100-disk-2.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off preallocation=metadata compression_type=zlib size=9680748544 lazy_refcounts=off refcount_bits=16
transferred 0.0 B of 9.0 GiB (0.00%)
transferred 110.8 MiB of 9.0 GiB (1.20%)
......
transferred 8.8 GiB of 9.0 GiB (97.76%)
transferred 8.9 GiB of 9.0 GiB (99.16%)
transferred 9.0 GiB of 9.0 GiB (100.00%)
Successfully imported disk as 'unused0:local:100/vm-100-disk-2.qcow2'
配置虚拟机
此时在虚拟机 hardware 硬件列表中会出现一个 “unused Disk 0”
选择这个 “unused Disk 0”,点 “edit”,出来的界面中点 “Add”。然后删除创建虚拟机时的那块磁盘。
再修改 “Options” 中的 “Boot Order”,改用新导入的磁盘做启动。
启动虚拟机
至此就可以正常的启动虚拟机了。
删除旧的镜像文件
这是虚拟机下会有新旧两个虚拟机镜像文件:
ls /var/lib/vz/images/100
vm-100-disk-0.raw vm-100-disk-2.qcow2
删除旧的这个 vm-100-disk-0.raw
文件即可。
总结
可以将 pve 的虚拟机理解为是包含两个部分的信息:
-
虚拟机配置
配置信息保存在
/etc/pve/qemu-server
或者/etc/pve/nodes/skydev/qemu-server
目录下,名为 id.conf 的文件如 100.conf备注:
/etc/pve/qemu-server
是/etc/pve/nodes/skydev/qemu-server
目录 的软链接。 -
虚拟机镜像
镜像文件保存在
/var/lib/vz/images
目录下,名为 id 的子目录,如 100 文件夹。
前面出现的问题在于 timeshift restore 之后,保存在 /etc/pve/nodes/skydev/qemu-server
目录下的配置文件被清理,而保存在 /var/lib/vz/images
目录下的镜像文件没有被清理(被设置为 timeshift 的 excludes)。这样虚拟机配置信息没有,而虚拟机镜像文件残存。
上面恢复的过程,可以理解为:
- 新建一个虚拟机,保全丢失的虚拟机配置信息:因此要尽量按照之前的虚拟机配置进行创建
- 导入镜像,这是将新的虚拟机配置和残存的虚拟机镜像文件组合起来,形成新的完整的虚拟机。
2.2 - 跨多个节点进行备份和恢复
背景
有多台机器安装有 pve 8.0, 但是由于这些机器不是24小时在线,而是按需开机。
按照 pve 标准的做法, 应该建立一个 cluster 集群,然后将所有机器都加入集群,之后就可以在任意一台机器的pve控制台操作集群内的任意机器,还可以在集群内跨节点的执行一些操作和配置。比如 clone 和 migrate 虚拟机和模板。
但因为我的机器不是 24 小时在线,如果建立并加入集群,那么当有大部分机器没有在线时,会因为 法定人数 不足造成无法锁定集群配置进行写操作,恶劣时连虚拟机都无法启动。
因此,不得已只能让每个节点都成为独立节点,不建立 pve 的集群。
当这样一来就无法使用到 pve 集群的跨节点功能,比如这篇文章中涉及到的在多个 pve 节点之间进行虚拟机的备份和恢复,以便实现快速复制虚拟机和模板。
解决方案和思路
尝试找到方便可行速度快的解决方案,首先考虑的就是利用虚拟机的备份和恢复功能。
- 虚拟机备份之后,可以得到文件大小10-20G级别的 vma 文件
- 这些 vma 文件可以以普通二进制文件的方式下载/保存/上传,方便在多个pve节点之间分发虚拟机的 vma 文件
- 将 vma 文件上传到 pve 节点后,可以通过恢复功能得到本地存储上运行的虚拟机或者模板
- 之后本地存储上的虚拟机或者模板就可以用 pve 自己的 clone 功能进行复制
因此,这个方案的关键在于如何快速的在不同 pve 节点之间分发 vma 文件,由于文件大小有 10-20g 级别, 因此必须考虑节点间的文件传输速度。
节点间文件传输
scp 命令
scp 命令按说是最简单直接的方案,pve 自带随时可以使用。
测试速度结果如下:
- 2.5G 网络: 实际测试文件传输速度约为 220 MB/s, 19GB的 vma 文件用时 86 秒
- 56G 网络: 实际测试文件传输速度约为 290 MB/s, 19GB的 vma 文件用时 64 秒
56G 网络下的速度有点离谱,感觉有其他的瓶颈。