libvirtError: no connection driver available for qemu:///system 解決辦法


今天部署了一套K版的OpenStack環境后,啟動nova-compute后,日志里狂報如下錯誤(因為其內部有定時任務需要去連libvirtd進程):

2015-08-14 10:01:00.061 28580 TRACE nova.virt.libvirt.host   File "/usr/lib64/python2.7/site-packages/libvirt.py", line 105, in openAuth
2015-08-14 10:01:00.061 28580 TRACE nova.virt.libvirt.host     if ret is None:raise libvirtError('virConnectOpenAuth() failed')
2015-08-14 10:01:00.061 28580 TRACE nova.virt.libvirt.host libvirtError: no connection driver available for qemu:///system

剛開始看到這個錯誤,首先第一反應是不是 libvirtd 進程沒有啟起來,於是 ps 查看確定下,發現已經啟動起來了:

[root@localhost ~]# ps aux | grep libvirtd
root      2648  0.0  0.0 112640   980 pts/1    S+   10:34   0:00 grep --color=auto libvirtd
root     31850  0.1  0.0 1053776 7264 ?        Ssl  10:17   0:01 /usr/sbin/libvirtd --listen

后來,嘗試直接執行下 virsh list 命令,同樣得到如下錯誤:

[root@localhost ~]# virsh list
error: failed to connect to the hypervisor
error: no valid connection
error: no connection driver available for <null>
error: Failed to reconnect to the hypervisor

然后在想是不是URI不對,於是我指定URI再次嘗試執行命令,同樣返回錯誤:

[root@localhost ~]# virsh -c qemu:///system list
error: failed to connect to the hypervisor
error: no connection driver available for qemu:///system

為保持每次使用的URI都正確,后來我將 /etc/libvirt/libvirt.conf 配置文件里的 uri_default 直接設置為 qemu:///system:

[root@localhost ~]# cat /etc/libvirt/libvirt.conf 
#
# This can be used to setup URI aliases for frequently
# used connection URIs. Aliases may contain only the
# characters  a-Z, 0-9, _, -.
#
# Following the '=' may be any valid libvirt connection
# URI, including arbitrary parameters

#uri_aliases = [
#  "hail=qemu+ssh://root@hail.cloud.example.com/system",
#  "sleet=qemu+ssh://root@sleet.cloud.example.com/system",
#]

#
# This can be used to prevent probing of the hypervisor
# driver when no URI is supplied by the application.

uri_default = "qemu:///system"

然后重啟 libvirtd 進程,通過 systemctl 命令查看下 libvirtd 進程的狀態,發現有如下3個錯誤:

[root@localhost ~]# systemctl status libvirtd
libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled)
   Active: active (running) since Fri 2015-08-14 10:11:13 CST; 4s ago
     Docs: man:libvirtd(8)
           http://libvirt.org
 Main PID: 30568 (libvirtd)
   CGroup: /system.slice/libvirtd.service
           └─30568 /usr/sbin/libvirtd --listen

Aug 14 10:11:13 localhost.localdomain libvirtd[30568]: libvirt version: 1.2.8, package: 16.el7_1.3 (CentOS BuildSystem <http://bugs.centos.org>, 2015-05-12-20:12:58, worker1.bsys.centos.org)
Aug 14 10:11:13 localhost.localdomain libvirtd[30568]: failed to load module /usr/lib64/libvirt/connection-driver/libvirt_driver_storage.so /usr/lib64/libvirt/connection-driver/...e reference
Aug 14 10:11:13 localhost.localdomain libvirtd[30568]: failed to load module /usr/lib64/libvirt/connection-driver/libvirt_driver_qemu.so /usr/lib64/libvirt/connection-driver/lib...eFileCreate
Aug 14 10:11:13 localhost.localdomain libvirtd[30568]: Module /usr/lib64/libvirt/connection-driver/libvirt_driver_lxc.so not accessible
Aug 14 10:11:13 localhost.localdomain systemd[1]: Started Virtualization daemon.
Hint: Some lines were ellipsized, use -l to show in full.

從上面錯誤來看,兩個錯誤是由於libvirt_driver_storage.so、libvirt_driver_qemu.so加載失敗,一個錯誤是由於沒有libvirt_driver_lxc.so module。

於是查看下目錄 /usr/lib64/libvirt/connection-driver/ 看看是否都有上面三個module:

[root@localhost ~]# ll /usr/lib64/libvirt/connection-driver/
total 1996
-rwxr-xr-x 1 root root  107440 May 13 04:16 libvirt_driver_interface.so
-rwxr-xr-x 1 root root  148600 May 13 04:16 libvirt_driver_network.so
-rwxr-xr-x 1 root root  107144 May 13 04:16 libvirt_driver_nodedev.so
-rwxr-xr-x 1 root root  165688 May 13 04:16 libvirt_driver_nwfilter.so
-rwxr-xr-x 1 root root 1175776 May 13 04:16 libvirt_driver_qemu.so
-rwxr-xr-x 1 root root   86448 May 13 04:16 libvirt_driver_secret.so
-rwxr-xr-x 1 root root  233448 May 13 04:16 libvirt_driver_storage.so

發現libvirt_driver_storage.so、libvirt_driver_qemu.so存在,而libvirt_driver_lxc.so確實不存在。

對於 libvirt_driver_lxc.so不存在 的情況,應該是相應的rpm包沒有安裝,我們只需要安裝下即可:

[root@localhost ~]# yum install libvirt-daemon-lxc

安裝完后,再次通過 systemctl 查看下 libvirtd 進程的狀態,剩下兩個錯誤還是沒有得到解決:

[root@localhost ~]# systemctl status libvirtd
libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled)
   Active: active (running) since Fri 2015-08-14 10:14:23 CST; 3s ago
     Docs: man:libvirtd(8)
           http://libvirt.org
 Main PID: 31204 (libvirtd)
   CGroup: /system.slice/libvirtd.service
           └─31204 /usr/sbin/libvirtd --listen

Aug 14 10:14:22 localhost.localdomain libvirtd[31204]: libvirt version: 1.2.8, package: 16.el7_1.3 (CentOS BuildSystem <http://bugs.centos.org>, 2015-05-12-20:12:58, worker1.bsys.centos.org)
Aug 14 10:14:22 localhost.localdomain libvirtd[31204]: failed to load module /usr/lib64/libvirt/connection-driver/libvirt_driver_storage.so /usr/lib64/libvirt/connection-driver/...e reference
Aug 14 10:14:23 localhost.localdomain libvirtd[31204]: failed to load module /usr/lib64/libvirt/connection-driver/libvirt_driver_qemu.so /usr/lib64/libvirt/connection-driver/lib...eFileCreate
Aug 14 10:14:23 localhost.localdomain systemd[1]: Started Virtualization daemon.
Hint: Some lines were ellipsized, use -l to show in full.

於是查看 /var/log/message 關於libvirtd進程的系統日志,發現錯誤日志:

Aug 14 10:14:22 localhost journal: failed to load module /usr/lib64/libvirt/connection-driver/libvirt_driver_storage.so /usr/lib64/libvirt/connection-driver/libvirt_driver_storage.so: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference
Aug 14 10:14:23 localhost journal: failed to load module /usr/lib64/libvirt/connection-driver/libvirt_driver_qemu.so /usr/lib64/libvirt/connection-driver/libvirt_driver_qemu.so: undefined symbol: virStorageFileCreate

從上面錯誤來看,undefined symbol,很明顯,是因為driver所需要的引用未定義,於是想應該是 libdevmapper.so.1.02 庫太老,與 libvirtd 庫不匹配,於是就嘗試更新下 device-mapper:

[root@localhost ~]# yum update device-mapper

更新后,重啟 libvirtd 進程,再次查看其狀態:

[root@localhost ~]# systemctl restart libvirtd
[root@localhost ~]# systemctl status libvirtd
libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled)
   Active: active (running) since Fri 2015-08-14 10:17:20 CST; 2s ago
     Docs: man:libvirtd(8)
           http://libvirt.org
 Main PID: 31850 (libvirtd)
   CGroup: /system.slice/libvirtd.service
           └─31850 /usr/sbin/libvirtd --listen

Aug 14 10:17:20 localhost.localdomain systemd[1]: Started Virtualization daemon.

發現沒有問題出現了,嘗試執行 virsh list 命令,也OK了:

[root@localhost ~]# virsh list
 Id    Name                           State
----------------------------------------------------

最后,啟動openstack-nova-compute,也不再出現最初的錯誤了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM