python-libvirtを使用してストレージを含む仮想マシンを削除する

python-libvirtを使用してストレージを含む仮想マシンを削除する

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これはオブジェクトではなくパスとタイプのみを返します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()

関連情報