6.1.3 libvirt、libvirtd的配置和使用
1. libvirt的配置文件
以RHEL 6.3为例,libvirt相关的配置的配置文件都在 /etc/libvirt/ 目录之中,如下所示:
[root@rhel6u3-ga libvirt]# cd /etc/libvirt/
[root@rhel6u3-ga libvirt]# ls
cim libvirt.conf libvirtd.conf lxc.conf nwfilter qemu qemu.conf qemu-sanlock.conf storage
[root@rhel6u3-ga libvirt]# cd qemu
[root@rhel6u3-ga qemu]# ls
networks rhel6u3-1.xml rhel6u3-2.xml
下面简单介绍其中几个重要的配置文件和目录:
(1)/etc/libvirt/libvirt.conf
libvirt.conf 文件是用于配置一些常用 libvirt 连接(通常是远程连接)的别名,和Linux中的普通配置文件一样,该配置文件中以井号(#)开头的行是注释,本次示例中的该配置文件如下:
[root@rhel6u3-ga kvm_demo]# 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 = [
"remote1=qemu+ssh://root@192.168.93.201/system",
]
其中,配置了 remote1 这个别名用于指代 qemu+ssh://root@192.168.93.201/system 这个远程的libvirt连接,有这个别名后,就可以在 virsh 等工具或者自己写代码调用libvirt API 时使用这个别名而不需要写完整的、冗长的URI连接标识了。用 virsh 使用这个别名,连接到远程的 libvirt 上查询当前已经启动的客户机状态,然后退出连接,命令行操作如下:
[root@rhel6u3-ga kvm_demo]# service libvirtd reload
Reloading libvirtd configuration: [ OK ]
[root@rhel6u3-ga kvm_demo]# virsh -c remote1
root@192.168.93.201's password:
Welcome to virsh, the virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virsh # list
Id Name State
----------------------------------------------------
1 rhel6u3-remote running
virsh # quit
[root@rhel6u3-ga kvm_demo]#
在代码中调用 libvirt API 也可以使用这个别名用于建立连接,如下的 python 代码行就是使用这个别名来建立连接:
conn = libvirt.openReadOnly('remote1')
(2)/etc/libvirt/libvirtd.conf
libvirtd.conf 是 libvirt 的守护进程 libvirtd 的配置文件,修改后需要让libvirtd重新加载配置文件(或重启libvirtd)才会生效。 libvirtd.conf 文件中,用井号(#)开头的行是注释内容,真正有用的配置在文件的每一行中使用“配置项 = 值”(如tcp_port = "16509")这样配对的格式来设置。 libvirtd.conf 配置值了 libvirtd 启动时的许多设置,包括是否建立 TCP、UNIX domain socket 等连接方式及其最大连接数,以及这些连接的认证机制,等等。
例如,下面的几个配置项,表示关闭TLS安全认证的连接(默认值是打开的)、打开 TCP 连接(默认是关闭TCP连接的),设置TCP监听的端口,TCP连接不使用认证授权方式,设置UNIX domain socket 的保存目录等。
listen_tls = 0
listen_tcp = 1
tcp_port = "16666"
unix_sock_dir = "/var/run/libvirt"
auth_tcp = "none"
注意:要让TCP、TLS等连接的生效,需要在启动 libvirtd 时加上 --listen 参数(简写为 -l )。而默认的 service libvirtd start 命令启动 libvirtd 服务时,并没带 --listen 参数,所以如果要使用TCP等连接方式,可以使用 libvirtd --listen -d 命令来启动libvirtd。
上面配置选项让 UNIX socket 放到 /var/run/libvirt 目录下,启动 libvirtd 并检验配置是否生效,命令行操作如下:
[root@rhel6u3-ga ~]# libvirtd --listen -d
2012-12-01 07:54:02.715+0000: 6788: info : libvirt version: 0.9.10, package: 21.el6 (Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>, 2012-05-23-09:15:11, x86-003.build.bos.redhat.com)
[root@rhel6u3-ga ~]# virsh -c qemu+tcp://localhost:16666/system
Welcome to virsh, the virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virsh # quit
[root@rhel6u3-ga ~]# ls /var/run/libvirt/libvirt-sock*
/var/run/libvirt/libvirt-sock /var/run/libvirt/libvirt-sock-ro
(3)/etc/libvirt/qemu.conf
qemu.conf 是 libvirt 对QEMU的驱动的配置文件,包括 VNC、SPICE等和连接它们时采用的权限认证方式的配置,也包括内存大页、SELinux、Cgroups等相关配置。
(4)/etc/libvirt/qemu/ 目录
qemu 目录下是存放使用QEMU驱动的域的配置文件,查看qemu目录如下:
[root@rhel6u3-ga ~]# ls /etc/libvirt/qemu/
networks rhel6u3-1.xml rhel6u3-2.xml
其中包括了两个域的XML配置文件(rhel6u3-1.xml 和 rhel6u3-2.xml),这就是笔者用virt-manager 工具创建的两个域,默认会将其配置文件保存到 /etc/libvirt/qemu/ 目录下。而其中的 networks 目录是保存了创建一个域时默认使用的网络配置。
2. libvirtd的使用
libvirtd 是一个作为 libvirt 虚拟化管理系统中的服务器端的守护程序,如果要让某个节点能够用 libvirt 进行管理(无论是本地还是远程管理),都需要在这个节点上运行着 libvirtd 这个守护进程,以便让其他上层管理工具可以连接到该节点,libvirtd 负责执行其他管理工具发送它的虚拟化管理操作指令。而 libvirt 的客户端工具(包括virsh、virt-manager等)可以连接到本地或远程的 libvirtd 进程,以便管理节点上的客户机(启动、关闭、重启、迁移等)、收集节点上的宿主机和客户机的配置和资源使用状态。
在RHEL 6.3 中 libvirtd 是作为一个服务(service)配置在系统中的,所以可以通过 service 命令来对其进行操作(实际是通过 /etc/init.d/libvirtd 服务脚本来实现的)。常用的操作方式有:“service libvirtd start”命令表示启动libvirtd,“service libvirtd restart”表示重启 libvirtd,“service libvirtd reload”表示不重启服务但是重新加载配置文件(即 /etc/libvirt/libvirtd.conf 配置文件)。对 libvirtd 服务进行操作示例的命令行如下:
[root@rhel6u3-ga ~]# service libvirtd
Usage: /etc/init.d/libvirtd {start|stop|status|restart|condrestart|reload|force-reload|try-restart}
[root@rhel6u3-ga ~]# service libvirtd start
Starting libvirtd daemon: 2012-12-01 08:14:33.048+0000: 31202: info : libvirt version: 0.9.10, package: 21.el6 (Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>, 2012-05-23-09:15:11, x86-003.build.bos.redhat.com)
[ OK ]
[root@rhel6u3-ga ~]# service libvirtd status
libvirtd (pid 31327) is running...
[root@rhel6u3-ga ~]# service libvirtd restart
Stopping libvirtd daemon: [ OK ]
Starting libvirtd daemon: 2012-12-01 08:14:43.522+0000: 31325: info : libvirt version: 0.9.10, package: 21.el6 (Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>, 2012-05-23-09:15:11, x86-003.build.bos.redhat.com)
[ OK ]
默认情况下,libvirtd监听在一个本地的Unix domain socket上,而没有监听基于网络的TCP/IP socket,需要使用“-l 或 --listen”的命令行参数来开启对 libvirtd.conf 配置文件中对TCP/IP socket的配置。另外,libvirtd 守护进程的启动或停止,并不会直接影响到正在运行中的客户机。 libvirtd 在启动或重启完成时,只要客户机的XML配置文件是存在的,libvirtd 会自动加载这些客户的配置,获取它们的信息;当然,如果客户机没有基于 libvirt 格式的XML文件来运行,libvirtd 则不能发现它。
libvirtd 是一个可执行程序,不仅可以使用“service”命令调用它作为服务来运行,而且可以单独地运行 libvirtd 命令来使用它。libvirtd 命令行主要有如下几个参数:
-d,或 --daemon
表示让 libvirtd 作为守护进程(daemon)在后台运行。
-f,或 --config FILE
指定libvirtd的配置文件为FILE,而不是使用默认值(通常是 /etc/libvirt/libvirtd.conf )。
-l,或 --listen
开启配置文件中配置的 TCP/IP 连接。
-p,或 --pid-file FILE
将 libvirtd 进程的PID写入到FILE文件中,而不是使用默认值(通常是 /var/run/libvirtd.pid )。
-t,或 --timeout SECONDS
设置对 libvirtd 连接的超时时间为SECONDS秒。
-v,或 --verbose
让命令输出详细的输出信息。特别是运行出错时,详细的输出信息便于用户查找原因。
--version
显示 libvirtd 程序的版本信息。
对libvirtd 命令的使用,几个简单的命令行操作示例如下:
#使用libvirtd 命令前,先停止已有的服务
[root@rhel6u3-ga ~]# service libvirtd stop
Stopping libvirtd daemon: [ OK ]
[root@rhel6u3-ga ~]# libvirtd --version
libvirtd (libvirt) 0.9.10
[root@rhel6u3-ga ~]# libvirtd
2012-12-01 08:57:38.475+0000: 2196: info : libvirt version: 0.9.10, package: 21.el6 (Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>, 2012-05-23-09:15:11, x86-003.build.bos.redhat.com)
^C #没有以daemon的形式启动,标准输出被libvirtd 占用;这里用 Ctrl-C 结束掉libvirtd 进程,以便继续进行后续操作。
[root@rhel6u3-ga ~]# libvirtd -l -d -p /root/libvirtd.pid
2012-12-01 08:56:14.665+0000: 7683: info : libvirt version: 0.9.10, package: 21.el6 (Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>, 2012-05-23-09:15:11, x86-003.build.bos.redhat.com)
[root@rhel6u3-ga ~]# cat /root/libvirtd.pid
7685
您好,我安装完libvirt后,使用sudo service libvirtd命令,得到结果libvirtd: unrecognized service
但是单独运行libvirtd是可以版本号是1.0.2
不知道是什么原因?如何解决?求助!谢谢了!
不知你运行的什么系统;在RHEL、CentOS、Fedora等系统中,可以执行 “ls -l /etc/init.d/libvirt*”命令看看,是否有libvirtd这个服务存在。解决方法可能是,卸载libvirt然后重装。如果是自己编译的libvirt那么,很可能就是没有配置libvirtd为service的。用'yum install libvirtd'这样安装的一般都有。
您好。
我想远程的主机地址是 : 10.66.12.137.此机器上安装了libvirt
本地我在/etc/libvirt/libvirt.conf 文件中加入了 "remote1=qemu+ssh://root@10.66.12.137/system",
执行 service libvirtd reload 是ok的.但是执行 virsh -c remote1的时候出现了
错误:配置文件语法错误: /etc/libvirt/libvirt.conf:10: 需要一个名称
错误:连接到管理程序失败
想请问这是什么回事呢,感觉语法没有不正确的地方呀。另外访问本地的也不行,就算把地址改为127.0.0.1也是不行的。
在使用 virt-manager 时遇到 “libvirtError: 将插槽连接到 '/usr/local/var/run/libvirt/virtlogd-sock' 失败: 没有那个文件或目录”
请问怎么解决,谢谢!!
你确认下是否libvirtd没有启动~
selinux关了试试