Bash

如何從 KVM 主機導出所有 VM

  • December 28, 2021

尋找一種從 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)

# 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 映像。您可能希望從備份中排除類似的內容。或者,在提取附加的虛擬磁碟列表之前,從 VM 中分離所有 CD-ROM/DVD 映像。

ztestVM 有很多虛擬磁碟(大部分約為 200MB,每個 1GB),因為它是我用來測試 ZFS 升級(包括核心與 dkms 模組包的兼容性)並在我在真實係統上使用 ZFS 命令之前試驗它們的 VM . 我還用它來測試 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 映像,您可能使用 raw 或 qcow2 文件作為虛擬磁碟)

引用自:https://unix.stackexchange.com/questions/684167