Python으로 스크립트를 작성하려고 합니다.libvirt 라이브러리, 하지만 현재 한 가지에 갇혀 있습니다.
성공적으로 가상 머신을 생성하고, 원하는 방식으로 설정하고, 시작하고, 액세스하고, 종료할 수 있습니다. 더 이상 필요하지 않으면 다시 삭제할 수도 있습니다.
하지만 가상 머신의 디스크를 제거하는 방법을 찾지 못했습니다.
내 Bash "프로토타입"에서는 이를 직접 호출할 수 있습니다 virsh undefine <name> --remove-all-storage
. 그러나 모든 문서에서 Python에서 이를 트리거하는 방법을 찾지 못했습니다.
물론 그렇게 할 수도 있지만 os.system("virsh undefine ...")
A) 끔찍한 해킹이고 B) virsh를 설치해야 합니다.
.undefine()
도메인에 대한 호출은 가상 디스크를 남겨둡니다. 을 찾았 .undefineFlags()
지만 관련성이 있는 플래그는 하나도 없었습니다(1=저장 삭제, 2=스냅샷 삭제, 4=NVRAM 삭제, 그 중 가상 디스크는 삭제되지 않음).
도메인을 호출하여 .XMLDesc()
전체 XML을 얻고, 정의된 디스크를 찾고, 파일 경로를 얻을 수 있습니다. 내 Python 스크립트가 가상 머신과 동일한 머신에서 실행되고 있다면 이를 호출할 수 있지만 os.remove()
그렇지 않고 원격 머신에서 실행되고 있습니다.
이 virsh
명령은 libvirt 원격 연결을 통해 디스크를 제거할 수 있으므로 어떻게든 구현해야 한다는 것을 알고 있습니다. 그런데 virsh 정의의 소스코드를 보고도 --remove-all-storage
여전히 헷갈립니다.
virStorageVolWipe
해당 애플리케이션은 안전한 삭제 또는 virStorageVolDelete
단순히 디스크 삭제를 요구하는 것 같습니다 . virStorageVol
이를 호출하려면 Python 객체를 얻어야 합니다.delete()
방법.
그런데 이 객체를 어떻게 얻을 수 있나요? "스토리지 풀"에 대한 참조를 많이 찾았고 이를 반복하여 경로를 찾을 수도 있고 가상 머신의 XML에서 스토리지 디스크에 대한 경로를 얻을 수도 있지만 해당 개체가 제공되지는 않습니다. 나는 delete()
그것을 부를 수 있다.
실제로 모든 스토리지 풀을 루프한 다음 해당 풀의 모든 볼륨을 루프한 다음 각 볼륨이 다음과 같은 경우 VM을 완전히 삭제할 수 있도록 삭제하려는 VM에 연결되어 있는지 수동으로 확인해야 합니까? 내가 그 일을 마치면? 또한 이론적으로 어떤 스토리지 풀에도 없는 볼륨을 갖는 것이 가능하다고 생각하므로 그것도 도움이 되지 않습니다...
왜 안 돼 virDomainGetVolumes
? 알아냈지만 virDomainGetBlockInfo
이는 object 가 아닌 경로와 유형만 반환합니다 virStorageVol
. 내가 뭐 놓친 거 없니?
답변1
제가 너무 복잡하게 생각했던 것 같습니다.
반환된 XML을 구문 분석하여 호스트에서 VM 디스크로의 경로를 가져온 .XMLDesc()
다음 호출할 수 있습니다(이전에 놓쳤던 것 같습니다) . 삭제할 개체를 .storageVolLookupByPath()
가져옵니다 .storageVol
domain = conn.lookupByName("my-vm-name")
domain_xml = domain.XMLDesc()
for disk_xml_element in ElementTree.fromstring(domain_xml).findall("devices/disk"):
for src in disk_xml_element.findall("source"):
disk = virt_conn.storageVolLookupByPath(src.get("file"))
disk.delete()