访问 KVM 或 Xen 的 libvirt 部署需要在主机上安装并激活一个或多个守护进程。 libvirt 提供了两种守护进程部署选项:单体或模块化守护进程。 libvirt 一直提供单个单体守护进程 libvirtd。 它包括主要的 hypervisor 驱动程序和所有支持的辅助驱动程序,这些驱动程序用于存储,例如网络、节点设备和管理。 单体 libvirtd 还为外部客户端提供安全的远程访问。 使用模块化守护进程,每个驱动程序都在自己的守护进程中运行,允许用户自定义其 libvirt 部署。 默认情况下,启用单体守护进程,但可以通过管理相应的 systemd 服务文件来切换到模块化守护进程。
模块化守护进程部署在只需要最少 libvirt 支持的场景中很有用。 例如,如果虚拟机的存储和网络不由 libvirt 提供,则不需要 libvirt-daemon-driver-storage 和 libvirt-daemon-driver-network 类型的软件包。 Kubernetes 是一个极端案例,它处理所有网络、存储、cgroups 和命名空间集成等。 只需要提供 virtqemud 的 libvirt-daemon-driver-QEMU 软件包。 模块化守护进程允许配置自定义的 libvirt 部署,其中仅包含用例所需的组件。
单体守护进程被称为 libvirtd,并通过 /etc/libvirt/libvirtd.conf 进行配置。 libvirtd 使用几个 systemd 单元文件进行管理
libvirtd.service - 启动 libvirtd 的主要 systemd 单元文件。 如果虚拟机也配置为在主机启动时启动,我们建议配置 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,则需要在启动 libvirtd 守护进程之前停止 xendomains。 如果希望 libvirtd 在重新启动后也启动,则还需要防止 xendomains 自动启动。 禁用该服务
>sudosystemctl stop xendomains>sudosystemctl disable xendomains>sudosystemctl start libvirtd
xendomains 和 libvirtd 提供相同的服务,并且并行使用时,可能会相互干扰。 例如,xendomains 可能会尝试启动已由 libvirtd 启动的 domU。
模块化守护进程以运行的驱动程序的名称命名,模式为 “virtDRIVERd”。 它们通过文件 /etc/libvirt/virtDRIVERd.conf 进行配置。 SUSE 支持 virtqemud 和 virtxend hypervisor 守护进程,以及所有支持的辅助守护进程
virtnetworkd - 虚拟网络管理守护进程,它提供 libvirt 的虚拟网络管理 API。 例如,virtnetworkd 可用于为主机创建一个 NAT 虚拟网络,供虚拟机使用。
virtnodedevd - 主机物理设备管理守护进程,它提供 libvirt 的节点设备管理 API。 例如,virtnodedevd 可用于将 PCI 设备从主机分离出来供虚拟机使用。
virtnwfilterd - 主机防火墙管理守护进程,它提供 libvirt 的防火墙管理 API。 例如,virtnwfilterd 可用于为虚拟机配置网络流量过滤规则。
virtsecretd - 主机密钥管理守护进程,它提供 libvirt 的密钥管理 API。 例如,virtsecretd 可用于存储与 LUKs 卷关联的密钥。
virtstoraged - 主机存储管理守护进程,它提供 libvirt 的存储管理 API。 virtstoraged 可用于创建存储池并从这些池创建卷。
virtinterfaced - 主机 NIC 管理守护进程,它提供 libvirt 的主机网络接口管理 API。 例如,virtinterfaced 可用于在主机上创建一个绑定网络设备。 SUSE 不建议使用 libvirt 的接口管理 API,而推荐使用默认网络工具,如 wicked 或 NetworkManager。 建议禁用 virtinterfaced。
virtproxyd - 一个代理守护进程,用于代理传统 libvirtd 套接字和模块化守护进程套接字之间的连接。 使用模块化 libvirt 部署时,virtproxyd 允许远程客户端访问 libvirt API,类似于单体 libvirtd。 它也可以被连接到单体 libvirtd 套接字的本地客户端使用。
virtlogd - 一个管理虚拟机控制台日志的守护进程。 virtlogd 也由单体 libvirtd 使用。 单体守护进程和 virtqemud systemd 单元文件需要 virtlogd,因此无需显式启动 virtlogd。
virtlockd - 一个管理虚拟机的资源(如磁盘)锁的守护进程。 virtlockd 也由单体 libvirtd 使用。 单体守护进程、virtqemud 和 virtxend systemd 单元文件需要 virtlockd,因此无需显式启动 virtlockd。
libvirt 包含两个也由单体 libvirtd 使用的模块化守护进程,virtlockd 和 virtlogd。
默认情况下,模块化守护进程侦听 /var/run/libvirt/virtDRIVERd-sock 和 /var/run/libvirt/virtDRIVERd-sock-ro Unix 域套接字上的连接。 客户端库更喜欢这些套接字而不是传统的 /var/run/libvirt/libvirtd-sock。 virtproxyd 守护进程可供远程客户端或期望传统 libvirtd 套接字的本地客户端使用。
与单体守护进程一样,模块化守护进程使用几个 systemd 单元文件进行管理
virtDRIVERd.service - 启动 virtDRIVERd 守护进程的主要单元文件。 如果虚拟机也配置为在主机启动时启动,我们建议配置该服务在启动时启动。
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 参数独立控制。
在从单体守护进程切换到模块化守护进程时,需要更改几个服务。 我们建议在切换守护进程选项之前停止或驱逐任何正在运行的虚拟机。
停止单体守护进程及其套接字
>sudosystemctl stop libvirtd.service>sudosystemctl stop libvirtd{,-ro,-admin}.socket
禁用单体守护进程的未来启动
>sudosystemctl disable libvirtd.service>sudosystemctl disable libvirtd{,-ro,-admin}.socket
启用新的守护进程,用于 KVM 或 Xen,包括所需的辅助驱动程序。 以下示例启用 KVM 的 QEMU 驱动程序和所有必需的辅助驱动程序
for drv in qemu network nodedev nwfilter secret storage do>sudosystemctl enable virt${drv}d.service>sudosystemctl enable virt${drv}d{,-ro,-admin}.socket done
启动相同一组守护进程的套接字
for drv in qemu network nodedev nwfilter secret storage do>sudosystemctl start virt${drv}d{,-ro,-admin}.socket done
如果需要支持来自远程主机的连接,则必须启用并启动 virtproxyd 守护进程
>sudosystemctl enable virtproxyd.service>sudosystemctl enable virtproxyd{,-ro,-admin}.socket>sudosystemctl start virtproxyd{,-ro,-admin}.socket