ヒスねこTechBlog

日々の気になる技術をまとめてます。

Pythonで仮想マシン管理いろいろ

 Ubuntuの自動インストールはできたので、Python使ってvirshの代わりになるような基本操作をやってみました。

techblog.hys-neko-lab.com

VMの起動

 virsh startと同じ操作です。libvirtのAPI一覧で「start」とかでページ内検索してもドンピシャのものがないなぁと思っていたんですが、virDomainCreate()が該当するんですね。libvirtのライフサイクルを知っていても、これはちょっとわからなかった...。startのほうが直感的でいいと思います。

libvirt.org

 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バインディングを見比べると命名規則や引数のとり方がわかってくると思います。色々試してみてください。