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 및 원시 파일을 혼합하여 사용합니다)

# 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 및 기타 디스크 관련 항목을 테스트하는 데에도 사용합니다.


또 다른 옵션은 xmlstarlet xml2보다 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 전체 업그레이드를 수행할 때 일부 백업이 있습니다."- 스냅샷의 장점 중 하나입니다. 스냅샷에는 ZVOL, qcow2 파일 및 LVM을 사용할 수 있습니다. btrfs는 스냅샷도 지원하지만 개별 파일은 지원하지 않습니다(VM 이미지에 btrfs를 사용하는 경우 가상 디스크에 원시 파일 또는 qcow2 파일을 사용할 수 있음).

관련 정보