(KVM连载) 6.1.7 libvirt API 使用示例(Python API)

2. libvirt Python API的使用

6.1.1小节中已经介绍过,许多种编程语言都提供了libvirt的绑定。Python作为一种在Linux上比较流行的编程语言,它也提供了libvirt API的绑定。在使用Python调用libvirt之前,需要安装libvirt-python软件包,或者使用6.1.2节中介绍的方法来自行编译和安装libvirt及其Python API。

本次示例是基于RHEL 6.3系统自带libvirt和libvirt-python软件包来进行的,对libvirt-python以及Python中的libvirt API文件的查询,命令行如下:

[root@rhel6u3-ga ~]# rpm -q libvirt-python

libvirt-python-0.9.10-21.el6.x86_64

[root@rhel6u3-ga ~]# ls /usr/lib64/python2.6/site-packages/libvirt*

/usr/lib64/python2.6/site-packages/libvirtmod_qemu.so  /usr/lib64/python2.6/site-packages/libvirt.pyo

/usr/lib64/python2.6/site-packages/libvirtmod.so       /usr/lib64/python2.6/site-packages/libvirt_qemu.py

/usr/lib64/python2.6/site-packages/libvirt.py          /usr/lib64/python2.6/site-packages/libvirt_qemu.pyc

/usr/lib64/python2.6/site-packages/libvirt.pyc         /usr/lib64/python2.6/site-packages/libvirt_qemu.pyo

如下是本次示例使用的一个Python小程序(libvirt-test.py),用于通过调用libvirt Python API来查询域的一些信息。该示例Python程序的源代码如下:

#!/usr/bin/python

# Get domain info via libvirt python API.

# Tested with python2.6 and libvirt-python-0.9.10 on a KVM host.

 

import libvirt

import sys

 

def createConnection():

conn = libvirt.openReadOnly(None)

if conn == None:

print 'Failed to open connection to QEMU/KVM'

sys.exit(1)

else:

print '-----Connection is created successfully-----'

return conn

 

def closeConnnection(conn):

print ''

try:

conn.close()

except:

print 'Failed to close the connection'

return 1

 

print 'Connection is closed'

 

def getDomInfoByName(conn, name):

print ''

print '----------- get domain info by name ----------"'

try:

myDom = conn.lookupByName(name)

except:

print 'Failed to find the domain with name "%s"' % name

return 1

 

print "Dom id: %d   name: %s" % (myDom.ID(), myDom.name())

print "Dom state: %s" % myDom.state(0)

print "Dom info: %s" % myDom.info()

print "memory: %d MB" % (myDom.maxMemory()/1024)

print "memory status: %s" % myDom.memoryStats()

print "vCPUs: %d" % myDom.maxVcpus()

 

def getDomInfoByID(conn, id):

print ''

print '----------- get domain info by ID ----------"'

try:

myDom = conn.lookupByID(id)

except:

print 'Failed to find the domain with ID "%d"' % id

return 1

 

print "Domain id is %d ; Name is %s" % (myDom.ID(), myDom.name())

 

if __name__ == '__main__':

name1 = "kvm-guest"

name2 = "notExist"

id1 = 3

id2 = 9999

print "---Get domain info via libvirt python API---"

conn = createConnection()

getDomInfoByName(conn, name1)

getDomInfoByName(conn, name2)

getDomInfoByID(conn, id1)

getDomInfoByID(conn, id2)

closeConnnection(conn)

该示例程序比较简单,只是简单地调用libvirt Python API获取一些信息,这里唯一需要注意的是“import libvirt ”语句引入了libvirt.py这个API文件,然后才能够使用libvirt.openReadOnly 、conn.lookupByName 等libvirt中的方法。本次示例中,必须被引入的libvirt.py这个API文件的绝对路径在 /usr/lib64/python2.6/site-packages/libvirt.py ,它实际调用是/usr/lib64/python2.6/site-packages/ libvirtmod.so 这个共享库文件。

获得该示例Python程序后,运行该程序(libvirt-test.py),查看其运行结果,命令行操作如下:

[root@rhel6u3-ga kvm_demo]# python libvirt-test.py 2>/dev/null

---Get domain info via libvirt python API---

-----Connection is created successfully-----

 

----------- get domain info by name ----------"

Dom id: 3   name: kvm-guest

Dom state: [1, 1]

Dom info: [1, 1048576L, 1048576L, 4, 257070000000L]

memory: 1024 MB

memory status: {'actual': 1048576L, 'rss': 680228L}

vCPUs: 4

 

----------- get domain info by name ----------"

Failed to find the domain with name "notExist"

 

----------- get domain info by ID ----------"

Domain id is 3 ; Name is kvm-guest

 

----------- get domain info by ID ----------"

Failed to find the domain with ID "9999"

 

Connection is closed

 

master

Stay hungry, stay foolish.

4 Comments

  1. 老大,能不能多写些呢,libvirt python这块的讲解,现在用python操作libvirt api 很吃力,很多看不懂啊!!!

    • 本书重点不是libvirt API,而且这个东西的内容也比较多的,详细地讲那就太长了。。 当然,另一个原因也是我研究libvirt时间较少,不是这方面的专家。
      你既然在Python使用libvirt时遇到困难,我觉得可以有两个不错的学习方法:1. 看libvirt python api源码 2. 看一下virt-manager的源代码,它里面用python调用libvirt api做了很多的功能,很有参考价值。 git://git.fedorahosted.org/git/virt-manager.git

      • libvirt的python源码没什么有价值的东西,他还是去调了libvirt的C的实现,其实对于libvirt的python API,最好的方法就是去libvirt的官网,打开C的API说明文档(非常详细),然后看python源码调用的C函数名字去对着查,比如cpuinfo()接口的返回值,python API中根本没讲具体意义和单位,但是在C的文档中讲了,对比下就明白了。

        • 是的,libvirt python API是调用其C实现,不过我认为libvirt python API依然很有其价值,因为Python来做一些工具,可以“糙快猛”的 哈哈 比如:virt-manager就是调用libvirt python API,还有OpenStack也是的~

发表评论

邮箱地址不会被公开。 必填项已用*标注

*