KVMホストから*すべて* VMをエクスポートする方法

KVMホストから*すべて* VMをエクスポートする方法

KVMホストにOS全体をアップグレードする場合は、一部のバックアップを取得できるように、KVMノードからすべての仮想マシンをエクスポートする良い方法を探しています。

これまで、私はすべてのVMをxmlにダンプし、コピーするディスクパスを一覧表示するためにhacky bash onelinerを使用しています。

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の意見に基づいた例:

(私のVMにはZFS zvols、qcow2、およびrawファイルを混在して使用します)

# 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イメージを分離してください。

このztestVMには、ZFSアップグレード(dkmsモジュールパッケージとのカーネル互換性を含む)をテストし、実際のシステムでZFSコマンドを使用する前に実験するために使用するため、多くの仮想ディスク(ほとんど約200MB、それぞれ1GB)があります。また、btrfs、LVM、mdadm、およびその他のディスク関連エントリのテストにも使用します。


別のオプションはxmlstarletxml2よりxmlstarletはるかに簡単で、grep、awk、およびsedを使用する「ハッキー」ソリューションに適しています。 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では消えているようです。古くてメンテナンスされておらず、utf8をサポートしていません(おそらく5〜10行のPerlまたはPythonコードで置き換えられる可能性があります))。便利です。ソースから直接コンパイルする必要がある場合は、私の質問を参照してください。xml2はどこに行きましたか?


ところで、あなたは言った「...KVMホストでOS全体のアップグレードを実行すると、いくつかのバックアップがあります。」- スナップショットの利点の1つです。スナップショットには、ZVOL、qcow2ファイル、およびLVMを使用できます。 btrfsはスナップショットもサポートしていますが、個々のファイルはサポートしていません(VMイメージにbtrfsを使用している場合は、仮想ディスクにrawファイルまたはqcow2ファイルを使用できます)。

おすすめ記事