8 libvirt
守护程序 #
访问 KVM 或 Xen 的 libvirt
部署需要在主机上安装并激活一个或多个守护程序。libvirt
提供两个守护程序部署选项:一体化守护程序或模块化守护程序。libvirt
始终提供单个一体化守护程序 libvirtd
。该守护程序包含主要超级管理程序驱动程序,以及用于存储的所有支持性次要驱动程序,例如用于网络、节点设备和管理的驱动程序。一体化 libvirtd
还为外部客户端提供安全的远程访问。如果使用模块化守护程序,每个驱动程序将在自身的守护程序中运行,使用户能够自定义其 libvirt
部署。默认已启用一体化守护程序,但可以通过管理相应的 systemd
服务文件将部署切换到模块化守护程序。
在需要最低程度的 libvirt
支持的方案中,模块化守护程序部署非常有用。例如,如果 libvirt
不提供虚拟机存储和网络,则不需要 libvirt-daemon-driver-storage 和 libvirt-daemon-driver-network 类型的软件包。Kubernetes 是一个极端的示例,它会处理所有网络、存储、cgroup 和名称空间集成等方面的任务。对于 Kubernetes,只需安装提供 virtqemud
的 libvirt-daemon-driver-QEMU 软件包即可。模块化守护程序允许配置仅包含用例所需组件的自定义 libvirt
部署。
8.1 启动和停止一体化守护程序 #
一体化守护程序称为 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 套接字的目录,通过任意
libvirtd.socket
、libvirtd-ro.socket
和libvirtd-admin.socket
单元文件中的ListenStream
参数独立控制。
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.2 启动和停止模块化守护程序 #
模块化守护程序按照它们运行的驱动程序命名,其软件集为 “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。
libvirt
包含两个模块化守护程序:virtlockd 和 virtlogd,一体化 libvirtd
也使用这两个守护程序。
默认情况下,模块化守护程序监听 /var/run/libvirt/virtDRIVERd-sock
和 /var/run/libvirt/virtDRIVERd-sock-ro
Unix 域套接字上的连接。客户端库偏向于使用这些套接字而不是传统的 /var/run/libvirt/libvirtd-sock
。virtproxyd 守护程序适用于需要传统 libvirtd
套接字的远程客户端或本地客户端。
与一体化守护程序一样,模块化守护程序是通过多个 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 套接字的目录,通过任意
virtDRIVERd.socket
、virtDRIVERd-ro.socket
和virtDRIVERd-admin.socket
单元文件中的ListenStream
参数独立控制。
8.3 切换到模块化守护程序 #
需要更改多个服务才能从一体化守护程序切换到模块化守护程序。在守护程序选项之间切换之前,建议停止或逐出所有正在运行的虚拟机。
停止一体化守护程序及其套接字
>
sudo
systemctl stop libvirtd.service>
sudo
systemctl stop libvirtd{,-ro,-admin}.socket禁止将来启动一体化守护程序
>
sudo
systemctl disable libvirtd.service>
sudo
systemctl disable libvirtd{,-ro,-admin}.socket启用 KVM 或 Xen 的新守护程序,包括必需的次要驱动程序。以下示例启用 KVM 的 QEMU 驱动程序,以及所有必需的次要驱动程序:
for drv in qemu network nodedev nwfilter secret storage do
>
sudo
systemctl enable virt${drv}d.service>
sudo
systemctl enable virt${drv}d{,-ro,-admin}.socket done启动同一组守护程序的套接字
for drv in qemu network nodedev nwfilter secret storage do
>
sudo
systemctl start virt${drv}d{,-ro,-admin}.socket done如果需要支持从远程主机进行连接,必须启用并启动 virtproxyd 守护程序:
>
sudo
systemctl enable virtproxyd.service>
sudo
systemctl enable virtproxyd{,-ro,-admin}.socket>
sudo
systemctl start virtproxyd{,-ro,-admin}.socket