这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

虚拟机备份实战

虚拟机备份实战

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 - 跨多个节点进行备份和恢复

在多个 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 共享