跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 虚拟化指南 / 使用 libvirt 管理虚拟机 / libvirt 守护程序
适用范围 SUSE Linux Enterprise Server 15 SP6

8 libvirt 守护程序

访问 KVM 或 Xen 的 libvirt 部署需要在主机上安装并激活一个或多个守护程序。libvirt 提供两个守护程序部署选项:一体化守护程序或模块化守护程序。libvirt 始终提供单个一体化守护程序 libvirtd。它包括主要超级管理程序驱动程序,以及管理存储空间、网络、节点设备等所需的所有次要驱动程序。一体化 libvirtd 还为外部客户端提供安全的远程访问途径。随着时间的推移,libvirt 增加了对模块化守护程序的支持,其中每个驱动程序都在自身的守护程序中运行,使用户能够自定义其 libvirt 部署。模块化守护程序默认处于启用状态,但可以通过禁用各个守护程序并启用 libvirtd,来将部署切换到传统的一体化守护程序。

在需要最低程度的 libvirt 支持的方案中,模块化守护程序部署非常有用。例如,如果虚拟机存储空间和网络不是由 libvirt 提供的,则不需要 libvirt-daemon-driver-storagelibvirt-daemon-driver-network 软件包。Kubernetes 是一个极端的示例,它会处理网络、存储、cgroup 和名称空间集成等方面的所有工作。对于 Kubernetes,只需安装提供 virtqemudlibvirt-daemon-driver-QEMU 软件包即可。模块化守护程序允许配置仅包含用例所需组件的自定义 libvirt 部署。

8.1 启动和停止模块化守护程序

模块化守护程序按照它们运行的驱动程序命名,其软件集为 virtDRIVERd。它们是通过文件 /etc/libvirt/virtDRIVERd.conf 配置的。SUSE 支持 virtqemudvirtxend 超级管理程序守护程序,以及所有次要守护程序:

  • 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 将允许远程客户端访问类似于一体化 libvirtdlibvirt API。连接到一体化 libvirtd 套接字的本地客户端也可以使用 virtproxyd。

  • virtlogd - 用于从虚拟机控制台管理日志的守护程序。一体化 libvirtd 也使用 virtlogd。一体化守护程序和 virtqemud systemd 单元文件需要 virtlogd,因此无需明确启动 virtlogd。

  • virtlockd - 用于管理针对虚拟机资源(例如磁盘)持有的锁的守护程序。一体化 libvirtd 也使用 virtlockd。一体化守护程序、virtqemud 和 virtxend systemd 单元文件需要 virtlockd,因此无需明确启动 virtlockd。

一体化 libvirtd 也使用 virtlogdvirtlockd。出于安全考虑,这些守护程序始终是与 libvirtd 分开的。

默认情况下,模块化守护程序会侦听 /var/run/libvirt/virtDRIVERd-sock/var/run/libvirt/virtDRIVERd-sock-ro Unix 域套接字上的连接。客户端库偏向于使用这些套接字而不是传统的 /var/run/libvirt/libvirtd-sock。virtproxyd 守护程序适用于需要传统 libvirtd 套接字的远程客户端或本地客户端。

virtqemudvirtxend 服务在 systemd 预设中处于启用状态。​virtnetworkdvirtnodedevdvirtnwfilterdvirtstoragedvirtsecretd 的套接字在预设中也处于启用状态,以确保在安装相应的软件包时,这些守护程序已启用且可用。尽管为了方便起见,模块化守护程序已在预设中启用,但也可以使用其 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.socketvirtDRIVERd-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.socketvirtDRIVERd-ro.socketvirtDRIVERd-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.socketlibvirtd-tls.socket 单元文件中的 ListenStream 参数独立控制。

  • unix_sock_group - UNIX 套接字组拥有者,通过 libvirtd.socketlibvirtd-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.socketlibvirtd-ro.socketlibvirtd-admin.socket

重要
重要:有冲突的服务:libvirtdxendomains

如果 libvirtd 无法启动,请检查是否加载了 xendomains 服务:

> systemctl is-active xendomains active

如果该命令返回 active,您需要停止 xendomains,然后才可以启动 libvirtd 守护程序。如果您希望在重引导后也要启动 libvirtd,另外还需禁止 xendomains 自动启动。禁用该服务:

> sudo systemctl stop xendomains
> sudo systemctl disable xendomains
> sudo systemctl start libvirtd

xendomainslibvirtd 提供相同的服务,如果同时使用,可能会互相干扰。例如,xendomains 可能会尝试启动已由 libvirtd 启动的 domU。

8.3 切换到一体化守护程序

要从模块化守护程序切换到一体化守护程序,需要更改多个服务。在守护程序选项之间切换之前,建议停止或逐出所有正在运行的虚拟机。

  1. 停止模块化守护程序及其套接字。以下示例会禁用 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
  2. 禁止将来启动模块化守护程序

    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
  3. 启用一体化 libvirtd 服务和套接字

    > sudo systemctl enable libvirtd.service
    > sudo systemctl enable libvirtd{,-ro,-admin}.socket
  4. 启动一体化 libvirtd 套接字

    > sudo systemctl start libvirtd{,-ro,-admin}.socket