解决libvirtd初始化异常的方法

解决libvirtd初始化异常的方法

今天在一台通过apt-get安装过老版本libvirt(0.9.8)的机器上安装OpenStack,由于老版本的libvirt有Bug,故通过源码编译安装1.2.0版本。编译安装一切正常,不过在启动nova-compute服务时出现错误:

 

Traceback (most recent call last):
 File "/usr/local/lib/python2.7/dist-packages/eventlet/hubs/hub.py", line 346, in fire_timers
  timer()
 File "/usr/local/lib/python2.7/dist-packages/eventlet/hubs/timer.py", line 56, in __call__
  cb(*args, **kw)
 File "/usr/local/lib/python2.7/dist-packages/eventlet/event.py", line 163, in _do_send
  waiter.switch(result)
 File "/usr/local/lib/python2.7/dist-packages/eventlet/greenthread.py", line 194, in main
  result = function(*args, **kwargs)
 File "/opt/stack/nova/nova/service.py", line 132, in run_server
  server.start()
 File "/opt/stack/nova/nova/service.py", line 398, in start
  self.manager.init_host()
 File "/opt/stack/nova/nova/compute/manager.py", line 294, in init_host
  self.driver.init_host(host=self.host)
 File "/opt/stack/nova/nova/virt/libvirt/driver.py", line 344, in init_host
  if not self.has_min_version(MIN_LIBVIRT_VERSION):
 File "/opt/stack/nova/nova/virt/libvirt/driver.py", line 332, in has_min_version
  libvirt_version = self._conn.getLibVersion()
 File "/opt/stack/nova/nova/virt/libvirt/driver.py", line 361, in _get_connection
  self._connect, self.uri, self.read_only)
 File "/usr/local/lib/python2.7/dist-packages/eventlet/tpool.py", line 139, in proxy_call
  rv = execute(f,*args,**kwargs)
 File "/usr/local/lib/python2.7/dist-packages/eventlet/tpool.py", line 77, in tworker
  rv = meth(*args,**kwargs)
 File "/opt/stack/nova/nova/virt/libvirt/driver.py", line 415, in _connect
  return libvirt.openAuth(uri, auth, 0)
 File "/usr/lib/python2.7/dist-packages/libvirt.py", line 102, in openAuth
  if ret is None:raise libvirtError('virConnectOpenAuth() failed')
libvirtError: Failed to connect socket to '/usr/local/var/run/libvirt/libvirt-sock': No such file or directory
2014-03-08 09:13:10 CRITICAL nova [-] Failed to connect socket to '/usr/local/var/run/libvirt/libvirt-sock': No such file or directory

由于之前也遇到过,是由于libvirtd没有正常启动导致的,于是尝试启动libvirtd服务:

 

/usr/local/sbin/libvirtd -l -f /etc/libvirtd.conf

这时候本该正常启动,却出现以下问题,/var/log/libvirt/下的日志中也完全找不到任何异常。

 

/usr/local/sbin/libvirtd: initialization failed

Google后说是字符编码的问题,需要修改:

 

#将以下语句添加到 /etc/profile 中
export export LC_ALL=POSIX 
#重新加载
source /etc/profile

再次重启libvirtd,这次仍有错误:

 

# /usr/local/sbin/libvirtd -l -f /etc/libvirtd.conf
2014-03-08 00:57:31.361+0000: 10577: info : libvirt version: 1.2.0
2014-03-08 00:57:31.361+0000: 10577: error : virNetTLSContextCheckCertFile:117 : Cannot read CA certificate '/usr/local/etc/pki/CA/cacert.pem': No such file or directory

 

但发现正常运行的机器上也没有 /usr/local/etc/pki/CA/cacert.pem这个文件,再次检查/etc/libvirtd.conf文件,发现有这么一段:

 

# Flag listening for secure TLS connections on the public TCP/IP port.
# NB, must pass the --listen flag to the libvirtd process for this to
# have any effect.
#
# It is necessary to setup a CA and issue server certificates before
# using this capability.
#
# This is enabled by default, uncomment this to disable it
# listen_tls = 0

于是将最后一行解除注释,关闭验证,再次启动libvirtd,启动正常,问题得解。

 

补充,有时候创建不了快照,可能是qemu-common或是qemu-utils没有安装好,apt-get重装也可解决,主要还是从错误信息中找相关线索。

 

参考资料:

http://www.cnblogs.com/zhangzhang/archive/2013/03/04/2943263.html

http://liuzhijun.iteye.com/blog/1783698