1 - 备份和恢复虚拟机

备份虚拟机以便恢复

背景知识

虚拟机相关的文件一般默认在 /var/lib/vz/

系统镜像一般在: /var/lib/vz/template/iso

备份在web页面操作,备份目录一般在 /var/lib/vz/dump

使用pve的备份功能

备份虚拟机

在 pve 的页面,选择需要备份的虚拟机(或者 template), “Backup” 选项中,点击 “Backup”。压缩选择 none, mode 选择 stop, 存储选 local,开始备份:

backup-now

备份过程:

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

备份的结果:

backup-result

这里可以看到文件名为 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 子项中已经可以看到刚才上传的的虚拟机备份文件:

local-repo

点击 “restore”,选择存储:

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

恢复完成后的虚拟机:

vm

参考资料

通过虚拟磁盘的方式备份

2 - 虚拟机备份实战

虚拟机备份实战

2.1 - 从raw/qcow2格式的镜像文件中恢复虚拟机

在只有 raw/qcow2 格式的镜像文件的情况下恢复虚拟机

背景

由于没有备份虚拟机配置文件,而进行了诸如 timeshift restore 的操作,导致虚拟机配置文件消失,管理页面上看不到虚拟机,而镜像文件残存。

images-file-list

备注:后续要做好虚拟机配置文件的备份,配置文件都很小,容易备份和保存。

恢复操作

查看镜像文件情况

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

选择这个 “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 的虚拟机理解为是包含两个部分的信息:

  1. 虚拟机配置

    配置信息保存在 /etc/pve/qemu-server 或者 /etc/pve/nodes/skydev/qemu-server 目录下,名为 id.conf 的文件如 100.conf

    备注: /etc/pve/qemu-server/etc/pve/nodes/skydev/qemu-server 目录 的软链接。

  2. 虚拟机镜像

    镜像文件保存在 /var/lib/vz/images 目录下,名为 id 的子目录,如 100 文件夹。

前面出现的问题在于 timeshift restore 之后,保存在 /etc/pve/nodes/skydev/qemu-server 目录下的配置文件被清理,而保存在 /var/lib/vz/images 目录下的镜像文件没有被清理(被设置为 timeshift 的 excludes)。这样虚拟机配置信息没有,而虚拟机镜像文件残存。

上面恢复的过程,可以理解为:

  1. 新建一个虚拟机,保全丢失的虚拟机配置信息:因此要尽量按照之前的虚拟机配置进行创建
  2. 导入镜像,这是将新的虚拟机配置和残存的虚拟机镜像文件组合起来,形成新的完整的虚拟机。

2.2 - 跨多个节点进行备份和恢复

在多个 pve 节点之间进行虚拟机的备份和恢复,以便快速创建虚拟机

背景

有多台机器安装有 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 网络下的速度有点离谱,感觉有其他的瓶颈。

nfs 共享