寻找一种从 KVM 节点导出所有 VM 的好方法,以便在对 KVM 主机进行就地操作系统升级时进行一些备份。
到目前为止,我正在使用一个 hacky bash oneliner 来将所有 VM 转储为 xml 并列出它们的磁盘路径以进行复制:
for vm in $(virsh list --all | egrep -v "ID|---" | awk '{print $2}'); do virsh dumpxml "$vm" > "/root/vm/$vm.xml"; virsh domblklist "$vm" | grep '/' | awk '{print $2}' >> /root/vm/vm_disks.lst; done
这很好用,但是 virsh 只执行“人类”输出 AFAIK,所以我必须在输出中使用 grep/awk 方法,这不是很可靠的 IMO。
有没有什么干净的方法可以在不需要带有 libvirt 的 python 脚本的情况下实现这一点?
此致。
基于我自己和@fra-san 评论的示例:
(我将 ZFS zvols、qcow2 和原始文件混合用于我的 VM)
请注意“拉伸”VM 的 ISO 映像。您可能希望从备份中排除类似的内容。或者,在提取附加的虚拟磁盘列表之前,从 VM 中分离所有 CD-ROM/DVD 映像。
该
ztest
VM 有很多虚拟磁盘(大部分约为 200MB,每个 1GB),因为它是我用来测试 ZFS 升级(包括内核与 dkms 模块包的兼容性)并在我在真实系统上使用 ZFS 命令之前试验它们的 VM . 我还用它来测试 btrfs、LVM、mdadm 和其他与磁盘相关的东西。另一种选择是使用
xml2
而不是xmlstarlet
. 它比 xmlstarlet 简单得多,并且更适合使用 grep 和 awk 和 sed 的“hacky”解决方案。它解析 XML 并将其转换为适合与面向行的工具一起使用的面向行的格式。不幸的是,
xml2
这些天似乎被遗弃了。您仍然可以在某些发行版中找到它(例如apt-get install xml2
在 Debian 上),但上游似乎已经消失了。它陈旧且无人维护,不支持 utf8(可能会被 5 或 10 行 perl 或 python 代码替换)。但是,它对于某些任务仍然有用。如果您需要自己从源代码编译它,请参阅我的问题,哦,xml2 去了哪里?顺便说一句,你说“......所以我在对 KVM 主机进行就地操作系统升级时有一些备份” ——这是快照的好处之一。您可以使用 ZVOL、qcow2 文件和 LVM 进行快照。btrfs 还支持快照,但不支持单个文件(如果您将 btrfs 用于 VM 映像,您可能正在使用 raw 或 qcow2 文件作为虚拟磁盘)