Libvirt
2018-11-05 21:04:31 阿炯

Libvirt 是一组软件的汇集,提供了管理虚拟机和其它虚拟化功能(如:存储和网络接口等)的便利途径。这些软件包括:一个长期稳定的 C 语言 API、一个守护进程(libvirtd)和一个命令行工具(virsh)。Libvirt 的主要目标是提供一个单一途径以管理多种不同虚拟化方案以及虚拟化主机,包括:KVM/QEMU,Xen,LXC,OpenVZ 或 VirtualBox hypervisors。采用C语言开发并在GPL协议下授权。


主要功能如下:

VM management(虚拟机管理):各种虚拟机生命周期的操作,如:启动、停止、暂停、保存、恢复和迁移等;多种不同类型设备的热插拔操作,包括磁盘、网络接口、内存、CPU等。

Remote machine support(支持远程连接):Libvirt 的所有功能都可以在运行着 libvirt 守护进程的机器上执行,包括远程机器。通过最简便且无需额外配置的 SSH 协议,远程连接可支持多种网络连接方式。

Storage management(存储管理):任何运行 libvirt 守护进程的主机都可以用于管理多种类型的存储:创建多种类型的文件镜像(qcow2,vmdk,raw,...),挂载 NFS 共享,枚举现有 LVM 卷组,创建新的 LVM 卷组和逻辑卷,对裸磁盘设备分区,挂载 iSCSI 共享,以及更多。

Network interface management(网络接口管理):任何运行 libvirt 守护进程的主机都可以用于管理物理的和逻辑的网络接口,枚举现有接口,配置(和创建)接口、桥接、VLAN、端口绑定。

Virtual NAT and Route based networking(虚拟 NAT 和基于路由的网络):任何运行 libvirt 守护进程的主机都可以管理和创建虚拟网络。Libvirt 虚拟网络使用防火墙规则实现一个路由器,为虚拟机提供到主机网络的透明访问。


基于守护进程/客户端的架构的 libvirt 只需要安装在需要要实现虚拟化的机器上。Libvirt 守护进程允许管理员分别为客户端连接的每个网络 socket 选择不同授权机制,这主要是通过 libvirt 守护进程的主配置文件 /etc/libvirt/libvirtd.conf 来实现的。每个 libvirt socket 可以有独立的授权机制配置。目前的可选项有 none、polkit 和 sasl。
 

服务端

安装 libvirt 以及至少一个虚拟运行环境(hypervisor):
libvirt 的 KVM/QEMU 驱动 是 libvirt 的首选驱动,如果 KVM 功能已 启用,则支持全虚拟化和硬件加速的客户机。

其他受支持的虚拟运行环境,包括 LXC、VirtualBox 和 Xen。

Libvirt 的 LXC 驱动 并不依赖 lxc 提供的用户空间工具。因此即便需要使用这个驱动也并不是必须安装该工具。

Libvirt 能支持 Xen,但默认未内建支持。需要用 ABS 编辑 libvirt 的 PKGBUILD ,去掉 --without-xen 选项后重新构建(built)libvirt。由于 VirtualBox 尚未正式支持 Xen,所以应当用 --without-vbox 选项替换前述选项。

对于网络连接,安装这些包:
ebtables 和 dnsmasq 用于 默认的 NAT/DHCP网络
bridge-utils 用于桥接网络
openbsd-netcat 通过 SSH 远程管理

客户端

客户端是用于管理和访问虚拟机的用户界面,有如下一些:
virsh — virsh 是用于管理和配置域(虚拟机)的命令行程序。
https://libvirt.org/ || libvirt

GNOME Boxes — 简单的 GNOME 3 程序,可以访问远程虚拟系统。
https://wiki.gnome.org/Apps/Boxes || gnome-boxes

Libvirt Sandbox — 应用程序沙箱工具包。
https://sandbox.libvirt.org/ || libvirt-sandboxAUR

Remote Viewer — 简单的远程访问工具。
https://virt-manager.org/ || virt-viewer

Qt VirtManager — 管理虚拟机的Qt程序。
https://github.com/F1ash/qt-virt-manager || qt-virt-managerAUR

Virtual Machine Manager — 使用libvirt对KVM,Xen,LXC进行管理的图形化工具。
https://virt-manager.org/ || virt-manager


绝大部分的 libvirt 管理可以通过三个工具实现:virt-manager(图形界面)、virsh 和 guestfish(它是 libguestfs的一部分)。

virsh

visrsh 用于管理客户域(虚拟机),在脚本式虚拟化管理环境中工作良好。由于需要通过通讯管道与虚拟运行环境通讯,绝大部分 virsh 命令需要管理员权限。尽管如此,一些典型的管理操作如域的创建、运行等也可以像VirtualBox 那样以普通用户身份执行。virsh 允许带命令行选项执行。如果不带则进入其内置的交互式终端:virsh,交互式终端支持 tab 键命令补全。


默认情况下,当 libvirtd 服务启动后,即创建了一个名为 default 的 NAT 网桥与外部网络联通(仅 IPv4)。对于其他的网络连接需求,可创建下列四种类型的网络以连接到虚拟机:
bridge — 这是一个虚拟设备,它通过一个物理接口直接共享数据。使用场景为:宿主机有 静态 网络、不需与其它域连接、要占用全部进出流量,并且域运行于 系统 层级。有关如何在现有默认网桥时增加另一个网桥的方法,请参阅 网桥。网桥创建后,需要将它指定到相应客户机的 .xml 配置文件中。

network — 这是一个虚拟网络,它可以与其它虚拟机共用。使用场景为:宿主机有动态 网络(例如:NetworkManager)或使用无线网络。

macvtap — 直接连接到宿主机的一个物理网络接口。

user — 本地网络,仅用于用户会话。

绝大多数用户都可以通过 virsh 的各种可选项创建具有各种功能的网络,一般来说比通过 GUI 程序(像 virt-manager 之类)更容易做到。

libvirt 通过 dnsmasq 处理 DHCP 和 DNS 请求,以启动每个虚拟网络的不同实例。也会为特定的路由添加 iptables 规则并启用 ip_forward 内核参数。这也意味着宿主机上已运行的dnsmasq并不是libvirt所必须的。

本文参考:Archlinux Libvirt

最新版本:8.0
2202年1月中旬,Libvirt 8.0.0发布了,带来大量更新项:
安全
libxl:修复潜在的死锁和崩溃  (CVE-2021-4147)
恶意访客可能会不断地重新启动自身,导致主机上的 libvirtd 死锁或崩溃,从而制造拒绝服务攻击(DOS)的条件。

删除功能
qemu:为严格模式的 numatune 明确禁止实时更改节点集
对于 <numatune/> 的严格模式,不能保证内存完全移动到新的节点集(例如 QEMU 可能已经锁定了内存),从而违反了严格模式的条件。如果需要在 NUMA 节点之间实时迁移 QEMU 内存,建议改用限制模式。

新特性
qemu:磁盘复制操作的同步写入模式
blockdev-mirror 块作业支持将虚拟机的写操作同步传播到副本的目的地,确保任务在繁重的 I/O 下收敛。

TCG 域特性
Libvirt 现在可以为 TCG 域设置翻译块(translation block )缓存大小 (tb-size)。
qemu:添加用于在域中注入启动密钥的新 API
添加了新的 API virDomainSetLaunchSecurityState() 和 virsh 命令 domsetlaunchsecstate ,以支持在域的内存中注入启动密钥。

改进
libxl:实现 virDomainGetMessages API
qemu:在外部快照和块复制后,保留 qcow2 子集群的分配状态

除此之外,Libvirt 8.0.0 还包含一些 Bug 修复,详细内容可在更新公告中查阅。


官方主页:https://libvirt.org/index.html