8 libvirt
守护程序 #
访问 KVM 或 Xen 的 libvirt
部署需要在主机上安装并激活一个或多个守护程序。libvirt
提供两个守护程序部署选项:一体化守护程序或模块化守护程序。libvirt
始终提供单个一体化守护程序 libvirtd
。它包括主要超级管理程序驱动程序,以及管理存储空间、网络、节点设备等所需的所有次要驱动程序。一体化 libvirtd
还为外部客户端提供安全的远程访问途径。随着时间的推移,libvirt
增加了对模块化守护程序的支持,其中每个驱动程序都在自身的守护程序中运行,使用户能够自定义其 libvirt
部署。模块化守护程序默认处于启用状态,但可以通过禁用各个守护程序并启用 libvirtd
,来将部署切换到传统的一体化守护程序。
在需要最低程度的 libvirt
支持的方案中,模块化守护程序部署非常有用。例如,如果虚拟机存储空间和网络不是由 libvirt
提供的,则不需要 libvirt-daemon-driver-storage 和 libvirt-daemon-driver-network 软件包。Kubernetes 是一个极端的示例,它会处理网络、存储、cgroup 和名称空间集成等方面的所有工作。对于 Kubernetes,只需安装提供 virtqemud
的 libvirt-daemon-driver-QEMU 软件包即可。模块化守护程序允许配置仅包含用例所需组件的自定义 libvirt
部署。
8.1 启动和停止模块化守护程序 #
模块化守护程序按照它们运行的驱动程序命名,其软件集为 “virtDRIVERd”。它们是通过文件 /etc/libvirt/virtDRIVERd.conf
配置的。SUSE 支持 virtqemud
和 virtxend
超级管理程序守护程序,以及所有次要守护程序:
virtnetworkd - 提供
libvirt
虚拟网络管理 API 的虚拟网络管理守护程序。例如,virtnetworkd 可用于在主机上创建供虚拟机使用的 NAT 虚拟网络。virtnodedevd - 主机物理设备管理守护程序,提供
libvirt
的节点设备管理 API。例如,virtnodedevd 可用于从主机分离供虚拟机使用的 PCI 设备。virtnwfilterd - 提供
libvirt
防火墙管理 API 的主机防火墙管理守护程序。例如,virtnwfilterd 可用于为虚拟机配置网络流量过滤规则。virtsecretd - 提供
libvirt
机密管理 API 的主机机密管理守护程序。例如,virtsecretd 可用于存储与 LUK 卷关联的密钥。virtstorged - 提供
libvirt
存储管理 API 的主机存储管理守护程序。virtstorged 可用于创建存储池,并基于这些池创建卷。virtinterfaced - 主机 NIC 管理守护程序,提供
libvirt
的主机网络接口管理 API。例如,virtinterfaced 可用于在主机上创建绑定的网络设备。SUSE 不建议使用libvirt
的接口管理 API,最好使用 wicked 或 NetworkManager 等默认网络工具。建议禁用 virtinterfaced。virtproxyd - 充当传统
libvirtd
套接字与模块化守护程序套接字之间的连接代理的守护程序。如果使用模块化libvirt
部署,virtproxyd 将允许远程客户端访问类似于一体化libvirtd
的libvirt
API。连接到一体化libvirtd
套接字的本地客户端也可以使用 virtproxyd。virtlogd - 用于从虚拟机控制台管理日志的守护程序。一体化
libvirtd
也使用 virtlogd。一体化守护程序和 virtqemudsystemd
单元文件需要 virtlogd,因此无需明确启动 virtlogd。virtlockd - 用于管理针对虚拟机资源(例如磁盘)持有的锁的守护程序。一体化
libvirtd
也使用 virtlockd。一体化守护程序、virtqemud 和 virtxendsystemd
单元文件需要 virtlockd,因此无需明确启动 virtlockd。
一体化 libvirtd
也使用 virtlogd
和 virtlockd
。出于安全考虑,这些守护程序始终是与 libvirtd
分开的。
默认情况下,模块化守护程序会侦听 /var/run/libvirt/virtDRIVERd-sock
和 /var/run/libvirt/virtDRIVERd-sock-ro
Unix 域套接字上的连接。客户端库偏向于使用这些套接字而不是传统的 /var/run/libvirt/libvirtd-sock
。virtproxyd 守护程序适用于需要传统 libvirtd
套接字的远程客户端或本地客户端。
virtqemud
和 virtxend
服务在 systemd
预设中处于启用状态。virtnetworkd
、virtnodedevd
、virtnwfilterd
、virtstoraged
和 virtsecretd
的套接字在预设中也处于启用状态,以确保在安装相应的软件包时,这些守护程序已启用且可用。尽管为了方便起见,模块化守护程序已在预设中启用,但也可以使用其 systemd
单元文件进行管理:
virtDRIVERd.service - 用于启动 virtDRIVERd 守护程序的主单元文件。如果 VM 配置为在主机引导时启动,我们建议也将服务配置为在引导时启动。
virtDRIVERd.socket - 与主读写 UNIX 套接字
/var/run/libvirt/virtDRIVERd-sock
对应的单元文件。默认情况下,我们建议在引导时启动此套接字。virtDRIVERd-ro.socket - 与主只读 UNIX 套接字
/var/run/libvirt/virtDRIVERd-sock-ro
对应的单元文件。默认情况下,我们建议在引导时启动此套接字。virtDRIVERd-admin.socket - 与管理 UNIX 套接字
/var/run/libvirt/virtDRIVERd-admin-sock
对应的单元文件。默认情况下,我们建议在引导时启动此套接字。
使用 systemd
套接字激活时,将不再遵循 virtDRIVERd.conf 中的多个配置设置。必须通过系统单元文件控制这些设置:
unix_sock_group - UNIX 套接字组拥有者,通过
virtDRIVERd.socket
和virtDRIVERd-ro.socket
单元文件中的SocketGroup
参数进行控制。unix_sock_ro_perms - 只读 UNIX 套接字权限,通过
virtDRIVERd-ro.socket
单元文件中的SocketMode
参数进行控制。unix_sock_rw_perms - 读写 UNIX 套接字权限,通过
virtDRIVERd.socket
单元文件中的SocketMode
参数进行控制。unix_sock_admin_perms - 管理员 UNIX 套接字权限,通过
virtDRIVERd-admin.socket
单元文件中的SocketMode
参数进行控制。unix_sock_dir - 在其中创建所有 UNIX 套接字的目录,通过以下任意单元文件中的
ListenStream
参数独立控制:virtDRIVERd.socket
、virtDRIVERd-ro.socket
和virtDRIVERd-admin.socket
。
8.2 启动和停止一体化守护程序 #
一体化守护程序称为 libvirtd
,通过 /etc/libvirt/libvirtd.conf
配置。可使用多个 systemd
单元文件来管理 libvirtd
:
libvirtd.service - 用于启动
libvirtd
的主systemd
单元文件。如果 VM 配置为在主机引导时启动,我们建议也将libvirtd.service
配置为在引导时启动。libvirtd.socket - 与主读写 UNIX 套接字
/var/run/libvirt/libvirt-sock
对应的单元文件。我们建议在引导时启用此单元。libvirtd-ro.socket - 与主只读 UNIX 套接字
/var/run/libvirt/libvirt-sock-ro
对应的单元文件。我们建议在引导时启用此单元。libvirtd-admin.socket - 与管理 UNIX 套接字
/var/run/libvirt/libvirt-admin-sock
对应的单元文件。我们建议在引导时启用此单元。libvirtd-tcp.socket - 与用于进行非 TLS 远程访问的 TCP 16509 端口对应的单元文件。在管理员已配置适当的身份验证机制之前,不应将此单元配置为在引导时启动。
libvirtd-tls.socket - 与用于进行非 TLS 远程访问的 TCP 16509 端口对应的单元文件。在管理员已部署 x509 证书并选择性地配置适当的身份验证机制之前,不应将此单元配置为在引导时启动。
使用 systemd
套接字激活时,将不再遵循 libvirtd.conf
中的某些配置设置。必须通过系统单元文件控制这些设置:
listen_tcp - 通过启动
libvirtd-tcp.socket
单元文件启用 TCP 套接字。listen_tls - 通过启动
libvirtd-tls.socket
单元文件启用 TLS 套接字。tcp_port - 非 TLS TCP 套接字的端口,通过
libvirtd-tcp.socket
单元文件中的ListenStream
参数进行控制。tls_port - TLS TCP 套接字的端口,通过
libvirtd-tls.socket
单元文件中的ListenStream
参数进行控制。listen_addr - 要侦听的 IP 地址,通过
libvirtd-tcp.socket
或libvirtd-tls.socket
单元文件中的ListenStream
参数独立控制。unix_sock_group - UNIX 套接字组拥有者,通过
libvirtd.socket
和libvirtd-ro.socket
单元文件中的SocketGroup
参数进行控制。unix_sock_ro_perms - 只读 UNIX 套接字权限,通过
libvirtd-ro.socket
单元文件中的SocketMode
参数进行控制。unix_sock_rw_perms - 读写 UNIX 套接字权限,通过
libvirtd.socket
单元文件中的SocketMode
参数进行控制。unix_sock_admin_perms - 管理员 UNIX 套接字权限,通过
libvirtd-admin.socket
单元文件中的SocketMode
参数进行控制。unix_sock_dir - 在其中创建所有 UNIX 套接字的目录,通过以下任意单元文件中的
ListenStream
参数独立控制:libvirtd.socket
、libvirtd-ro.socket
和libvirtd-admin.socket
。
libvirtd
和 xendomains
如果 libvirtd
无法启动,请检查是否加载了 xendomains
服务:
>
systemctl is-active xendomains active
如果该命令返回 active
,您需要停止 xendomains
,然后才可以启动 libvirtd
守护程序。如果您希望在重引导后也要启动 libvirtd
,另外还需禁止 xendomains
自动启动。禁用该服务:
>
sudo
systemctl stop xendomains>
sudo
systemctl disable xendomains>
sudo
systemctl start libvirtd
xendomains
和 libvirtd
提供相同的服务,如果同时使用,可能会互相干扰。例如,xendomains
可能会尝试启动已由 libvirtd
启动的 domU。
8.3 切换到一体化守护程序 #
要从模块化守护程序切换到一体化守护程序,需要更改多个服务。在守护程序选项之间切换之前,建议停止或逐出所有正在运行的虚拟机。
停止模块化守护程序及其套接字。以下示例会禁用 KVM 的 QEMU 守护程序和几个次要守护程序。
for drv in qemu network nodedev nwfilter secret storage do
>
sudo
systemctl stop virt${drv}d.service>
sudo
systemctl stop virt${drv}d{,-ro,-admin}.socket done禁止将来启动模块化守护程序
for drv in qemu network nodedev nwfilter secret storage do
>
sudo
systemctl disable virt${drv}d.service>
sudo
systemctl disable virt${drv}d{,-ro,-admin}.socket done启用一体化
libvirtd
服务和套接字>
sudo
systemctl enable libvirtd.service>
sudo
systemctl enable libvirtd{,-ro,-admin}.socket启动一体化
libvirtd
套接字>
sudo
systemctl start libvirtd{,-ro,-admin}.socket