Ubuntuの自動インストールはできたので、Python使ってvirshの代わりになるような基本操作をやってみました。
VMの起動
virsh startと同じ操作です。libvirtのAPI一覧で「start」とかでページ内検索してもドンピシャのものがないなぁと思っていたんですが、virDomainCreate()が該当するんですね。libvirtのライフサイクルを知っていても、これはちょっとわからなかった...。startのほうが直感的でいいと思います。
Pythonバインディングされたものを使うと以下のような感じです。特定のドメイン(VM)に各種操作をするには、ドメイン名かUUIDをもとにドメインに接続する必要があります。今回の場合はlookupByNameで探して接続しています。
import sys import libvirt conn = libvirt.open('qemu:///system') if conn == None: print('[ERROR]open connection to qemu:///system') exit(1) dom = conn.lookupByName('xmltest') if dom == None: print('[ERROR]find domain') exit(1) if dom.create() != 0: print('[ERROR]create domain') exit(1) print('domain started: '+dom.name()) conn.close() exit(0)
うまいこと行っていれば、virt-viewerで接続できます。
VMの終了
停止の仕方としては穏便な方法(shutdown)と強制終了(destroy)があるので、その場に応じて使いたい方を使いましょう。できれば前者がいいのは言うまでもないですが、ゲストのサポート状況に依存するとのこと。
なので代わりにdestroyFlags()の引数に1を指定してGRACEFULに閉じようとすることもできるようです。
""" lookupByNameまで同じなので省略 """ # 強制終了の場合はdom.destroy() if dom.shutdown() != 0: print('[ERROR]shutdown domain') exit(1) print('domain shutdown: '+dom.name()) conn.close() exit(0)
VMのリストを取得
libvirtで管理しているVMのリストを表示してみます。listAllDomains()がVMリストを取得してくれます。
import sys import libvirt conn = libvirt.open('qemu:///system') if conn == None: print('[ERROR]open connection to qemu:///system') exit(1) domains = conn.listAllDomains() for dom in domains: print(dom.name() + ' UUID:' + dom.UUIDString()) if dom.isActive() is True: print('-> Active') else: print('-> Inactive') conn.close() exit(0)
C APIとそのPythonバインディングを見比べると命名規則や引数のとり方がわかってくると思います。色々試してみてください。