正在寻找一种从 KVM 节点导出所有虚拟机的好方法,以便在对 KVM 主机进行就地操作系统升级时有一些备份。
到目前为止,我正在使用 hacky bash oneliner 将所有虚拟机转储为 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 只做“人类”输出,所以我必须用 grep/awk 来绕过输出,这在我看来不是很可靠。
有没有什么干净的方法可以实现这一点,而不需要带有 libvirt 的 python 脚本?
此致。
答案1
基于我自己和@fra-san 的评论的示例:
(我为我的虚拟机混合使用 ZFS zvols、qcow2 和原始文件)
# for vm in $(virsh list --all --name) ; do
echo "$vm:"
virsh dumpxml "$vm" | xmlstarlet sel -t -m '/domain/devices/disk' -m 'source/@*' -v '.' -n
echo
done
debian10:
/dev/zvol/exp/debian10
debian9:
/dev/zvol/exp/volumes/debian9
freebsd:
/var/lib/libvirt/images/FreeBSD-10.2-RELEASE-amd64.qcow2
stretch:
/dev/zvol/exp/stretch
/var/lib/libvirt/ISO-Images/debian-9-stretch/debian-9.13.0-amd64-DVD-1.iso
ztest:
/dev/zvol/exp/volumes/ztest
/var/lib/libvirt/ztest/disk01
/var/lib/libvirt/ztest/disk02
/var/lib/libvirt/ztest/disk03
/var/lib/libvirt/ztest/disk04
/var/lib/libvirt/ztest/disk05
/var/lib/libvirt/ztest/disk06
/var/lib/libvirt/ztest/disk07
/var/lib/libvirt/ztest/disk08
/var/lib/libvirt/ztest/disk09
/var/lib/libvirt/ztest/disk10
/var/lib/libvirt/ztest/disk11
/var/lib/libvirt/ztest/disk12
/var/lib/libvirt/ztest/disk13
/var/lib/libvirt/ztest/disk14
请注意“延伸”VM 的 ISO 映像。您可能想从备份中排除类似的内容。或者在提取附加虚拟磁盘列表之前从虚拟机中分离所有 CD-ROM/DVD 映像。
该ztest
VM 有很多虚拟磁盘(大部分约为 200MB,每个磁盘有 1GB),因为我用它来测试 ZFS 升级(包括与 dkms 模块包的内核兼容性)并在实际系统上使用 ZFS 命令之前进行试验。我还用它来测试 btrfs、LVM、mdadm 和其他与磁盘相关的东西。
另一种选择是使用xml2
而不是xmlstarlet
.它比 xmlstarlet 简单得多,并且更适合使用 grep、awk 和 sed 的“hacky”解决方案。它解析 XML 并将其转换为适合与面向行的工具一起使用的面向行的格式。
for vm in $(virsh list --all --name) ; do
echo "$vm:"
virsh dumpxml "$vm" |
xml2 |
awk -F= '/^\/domain\/devices\/disk\/source\/@(file|dev)/ {print $2}'
echo
done
不幸的是,xml2
现在似乎已经被废弃了。您仍然可以在某些发行版中找到它(例如apt-get install xml2
在 Debian 上),但上游似乎已经消失了。它很旧且无人维护,并且不支持 utf8(并且可能可以用 5 或 10 行 perl 或 python 代码替换)。但是,它对于某些任务仍然有用。如果您需要自己从源代码编译它,请参阅我的问题xml2 去哪儿了?
顺便说一句,你说“...所以我在对 KVM 主机进行操作系统就地升级时有一些备份”- 这是快照的好处之一。您可以使用 ZVOL、qcow2 文件和 LVM 进行快照。 btrfs 还支持快照,但不支持单个文件(如果您将 btrfs 用于 VM 映像,则可能将原始文件或 qcow2 文件用于虚拟磁盘)