华子的代码空间

逆水行舟,不进则退。 关注系统编程、网络编程、并发、分布式。

使用tcp方式连接libvirtd

Libvirt是一个软件集合,便于使用者管理虚拟机和其他虚拟化功能,比如存储和网络接口管理等等。这些软件包括一个API库、一个daemon(libvirtd)和一个命令行工具(virsh)。Libvirt的主要目标是:提供一种单一的方式管理多种不同的虚拟化提供方式和hypervisor。

 

只要远程服务器运行了libvirtd,libvirt的客户端就可以连接到服务器。

 

使用最简单的SSH方式,只要拥有SSH连接到服务器的权限,就可以无需配置:

qemu+ssh://root@example.com/system

例如: qemu+ssh://root@172.16.0.12/system ,本机SSH连接到172.16.0.12时,要使用证书登录,否则每次连接都需要输入SSH用户名和密码。

 

TCP方式:

qemu+tcp://example.com/system

例如:qemu+tcp://172.16.0.15/system,服务端只需要做简单配置即可:

vim /etc/libvirt/libvirtd.conf:

listen_tls = 0          #禁用tls登录
listen_tcp = 1           #启用tcp方式登录
tcp_port = "16509"       #tcp端口16509
listen_addr = "0.0.0.0"
unix_sock_group = "libvirtd"
unix_sock_rw_perms = "0770"
auth_unix_ro = "none"
auth_unix_rw = "none"
auth_tcp = "none"         #TCP不使用认证
max_clients = 1024        #最大总的连接客户数1024
min_workers = 50          #libvirtd启动时,初始的工作线程数目
max_workers = 200       #同上,最大数目
max_requests = 1000      #最大同时支持的RPC调用,必须大于等于max_workers
max_client_requests = 200   #每个客户端支持的最大连接数

 

同时修改libvirt-bin的配置文件:

vim /etc/default/libvirt-bin:

# Start libvirtd to handle qemu/kvm:
start_libvirtd="yes"

# options passed to libvirtd, add "-l" to listen on tcp
libvirtd_opts="-d -l --config /etc/libvirt/libvirtd.conf"

 

昨晚以上修改后,执行service libvirt-bin restart即可。 netstat -anpt就能看到libvirtd监听在TCP 16509端口。

 

下面附上一段python连接libvirtd的代码,并包含如何计算CPU使用率:

 1 import libvirt as _libvirt
 2 import time
 3 
 4 
 5 class libvirt_client(object):
 6     def __init__(self,uri):
 7         self.ip = uri
 8         self.uri = 'qemu+tcp://%s/system' % uri
 9         self.connect()
10     
11     def connect(self):
12         self.conn = _libvirt.open(self.uri)
13     
14     def check(self,uuid_string):
15         result = dict()
16         time_sleep = 3
17         dom = self.conn.lookupByUUIDString(uuid_string)
18         infos_first = dom.info()
19         start_cputime = infos_first[4]
20         start_time = time.time()
21         time.sleep(time_sleep)
22         infos_second = dom.info()
23         end_cputime = infos_second[4]
24         end_time = time.time()
25         cputime = (end_cputime - start_cputime)
26         cores = infos_second[3]
27         cpu_usage = 100 * cputime / (time_sleep*cores*1000000000)
28         print cpu_usage
29 
30 
31 virt = libvirt_client('172.16.0.209')
32 virt.check('ef809edd-2168-4007-8319-3d2acbc49aff')

 

再附上一个列出服务器上所有运行着的实例的UUID的函数:

 1 #!/usr/bin/python
 2 import sys
 3 
 4 try:
 5     import libvirt as _libvirt
 6 except (ImportError,ImportWarning) as e:
 7     print "Can not find python-libvirt, in ubuntu just run \"sudo apt-get install python-libvirt\"."
 8     print e
 9     sys.exit(1)
10 
11 
12 def list_uuids(host):
13     dom_ids = []
14     uri = 'qemu+tcp://%s/system' % host
15     try:
16         conn = _libvirt.open(uri)
17     except Exception,e:
18         print 'libvirt error: can not connect to remote libvirtd'
19         raise e
20     domain_ids = conn.listDomainsID()
21     for domain_id in domain_ids:
22         dom = conn.lookupByID(domain_id)
23         dom_ids.append(dom.UUIDString())
24     print dom_ids
25 
26 list_uuids('172.16.0.209')

 

下一篇介绍使用SASL认证的方式,连接libvirtd.

posted on 2012-07-24 22:55  华子的代码空间  阅读(4183)  评论(0编辑  收藏  举报

导航