KVM作为后起之秀,在公有云Hytervisor市场中占主宰地位,如一大批基于OpenStack二次开发的云厂商。而老牌的商业VMware则在私有云Hytervisor市场中占主宰地位,仍然是各大中小企业搭建私有云的首选,不过目前也受到Hyper-V的挑战。
Hypervisor虚拟化技术有很多种实现方式,如KVM、QEMU、VMware、XEN、HyperV等,而不同的技术也使得他们提供的驱动和API也是多样化的,各不尽相同。如此众多的Hypervisor,有没有一种工具提供一个统一的API接口来统一管理这些Hypervisor,这是云能力的关键。
计算机科学家大卫·惠勒(David Wheeler)有一句名言:“计算机科学中的任何问题都可以通过增加一个中间层来解决。”那么,我们是不是可以通过增加一个中间层,对底层Hypervisor的技术差异进行屏蔽,对上层管理工具提供统一API接口呢。答案是可以的。
Libvirt正是这样的一个工具,Libvirt通过在底层Hypervisor和上层管理工具之间提供一个中间层。Libvirt作为一个中间层,对底层统一封装不同虚拟机,对上层管理工具提供统一的API,从而方便地实现了对虚拟机的管理,其体系架构如图1所示。
为避免使用的术语产生歧义,以下是 libvirt 文档中使用的一些特定概念的定义:
概念 | 定义 |
---|---|
节点(Node) | 是指一台物理机,Hypervisor和域都运行在节点上; |
Hypervisor | 是指虚拟化软件层,也称为虚拟机监控器,通过虚拟化一个节点,让其可以运行多个虚拟机; |
域(Domain) | 是一个运行在Hypervisor上的操作系统实例,通常是指虚拟机; |
节点、Hypervisor和域之间的关系可以简单地使用图2来表示。
Libvirt是一个免费的开源的软件,使用的许可证是LGPL,使用libvirt API库进行调用的软件程序不一定要选择开源和遵守GPL许可证。
Libvirt是一组软件集合,是用于管理虚拟化平台的API、守护进程和管理工具。
Libvirt可实现对虚拟机管理,对虚拟化网络和存储的管理。
Libvirt的主要目标是为底层各种Hypervisor提供一套统一的API,让上层的管理工具可以用一种单一的方式来管理多种不同的虚拟化技术。
Libvirt的主要组成有三部分,包括一个长期稳定的C语言API库、一个守护进程(libvirtd)和一个默认命令行工具(virsh)。
Libvirt API是为其他虚拟机管理工具(如virsh、virt-manager等)提供虚拟机管理的软件库支持。
Libvirtd守护进程负责执行对节点上的域的管理工作,virsh、virt-manager等管理工具都需要依靠libvirtd守护进程来间接访问Hypervisor及配置文件,所以这个守护进程一定要处于运行状态,如果关闭这个进程,那么virsh、virt-manager等管理工具将不能使用。
Virsh是libvirt开源项目中默认的对虚拟机管理的一个命令行工具,后续章节中将会详细介绍。
Libvirt 的主要功能包含如下五个部分:
Libvirt支持多种语言包,包括C、C++、C#、Go、Java、OCaml、Perl、PHP、Python、Ruby、D-Bus等语言,非常方便开发集成。
Libvirt支持多种虚拟化技术,包括KVM、QEMU、Xen、VMware、VirtualBox、Hyper-V等平台虚拟化,也包括OpenVZ、LXC等容器虚拟化。
Libvirt支持多种操作系统,包括Linux,FreeBSD,Windows和OS-X等操作系统。
Libvirt目前已被业界广泛使用,基于Libvirt API的管理工具包括命令行工具、图形化工具、Web管理工具、云管理平台工具等,如图1所示。
根据libvirt官方网站的显示,基于libvirt API的命令行工具统计如表1所示。
名称 | 释义 |
---|---|
guestfish | Guestfish是一个交互式shell和命令行工具,用于检查和修改虚拟机文件系统。它使用libvirt来查找虚拟机及其关联的磁盘。 |
virsh | Virsh是交互式shell和批处理脚本化工具,可用于域、网络和存储的管理工作,是libvirt核心发行版的一部分。 |
virt-clone | 允许克隆现有虚拟机的磁盘映像和配置以形成新的虚拟机。它自动将数据复制到新的磁盘映像,并更新配置中的 UUID、MAC 地址和名称。 |
virt-df | 检查虚拟机中每个文件系统的利用率。此工具查看虚拟机磁盘并确定使用了多少空间,它可以处理常见的Linux文件系统和LVM卷。 |
virt-image | 提供一种部署虚拟设备的方法。在libvirt中,虚拟机(即域)的配置是采用一种可移植的XML格式来描述的,在部署时,虚拟机的配置被转换为XML格式。 |
virt-install | 为虚拟机的安装提供了一个便捷易用的方式,支持通过光盘、ISO镜像的本地配置方式,也支持通过NFS、HTTP和FTP的远程配置方式。 |
virt-top | 是一个用于展示虚拟机运行状态和资源使用率的工具,如CPU、内存、网络和磁盘利用率等。 |
virt-what | 用于检测虚拟化平台类型的shell脚本,可以检测出 QEMU/KVM、VMware、Hyper-V、VirtualBox、OpenVZ/Virtuozzo、Xen、LXC、IBM PowerVM 以及 Parallels 等平台类型。 |
stap | SystemTap 是监控和跟踪运行中的Linux 内核的操作的动态方法,从2.4版本开始,前端应用程序stap可以通过libvirt去搜集虚拟机的数据 |
vagrant-libvirt | Vagrant-Libvirt是一个Vagrant插件,它通过libvirt来管理虚拟机,它是面向开发人员的命令行工具,可以非常快速和轻松地部署和重新部署虚拟机环境。 |
virt-lightning | Virt-Lightning通过libvirt、cloud-init和libguestfs来允许任何人快速启动新的虚拟机,它非常像容器CLI,但带有虚拟机。 |
根据libvirt官方网站的显示,基于libvirt API的迁移工具统计如表2所示。
名称 | 释义 |
---|---|
virt-p2v | P2V迁移是物理机到虚拟机的迁移。则virt-p2v迁移是物理机到KVM虚拟机的迁移,virt-p2v这个工具包含在 libguestfs 中。 |
virt-v2v | V2V迁移是不同虚拟化环境之间的迁移。则virt-v2v迁移是虚拟机(Xen、VMware)->KVM虚拟机,virt-p2v这个工具包含在 libguestfs 中。 |
vmware2libvirt | 作为virt-goodies包的一部分,vmware2libvirt 是一个 Python 脚本,用于将 vmware 映像迁移到 libvirt。 |
根据libvirt官方网站的显示,基于libvirt API的图形化工具统计如表3所示。
名称 | 释义 |
---|---|
virt-manager | 是一个通用桌面管理工具,能够跨本地和远程访问管理虚拟机,它主要针对个人和小型办公室场景使用,最多可管理10-20台主机及主机的虚拟机。 |
virt-v2v | V2V迁移是不同虚拟化环境之间的迁移。则virt-v2v迁移是虚拟机(Xen、VMware)->KVM虚拟机,virt-p2v这个工具包含在 libguestfs 中。 |
virt-viewer | 是一个显示虚拟机的图形化界面工具,使用GTK-VNC或SPICE-GTK协议,使用libvirt API去查询虚拟机的VNC或SPICE服务器端信息。常用于替换传统的VNC客户端查看器,因为后者通常不支持x509认证授权的SSL/TLS加密,而virt-viewer是支持的。 |
qt-virt-manager | 用于创建和控制 VM、另一个虚拟实体(又名网络、存储、接口、机密、网络过滤器)的Qt GUI。集成了LXC/SPICE/VNC 的查看器,用于访问与虚拟机或容器关联的文本控制台。 |
qt-remote-viewer | 用于访问远程桌面或虚拟机的Qt VNC/SPICE查看器。 |
根据libvirt官方网站的显示,基于libvirt API的IaaS云计算管理平台工具统计如表4所示。
名称 | 释义 |
---|---|
Cracow Cloud One | CC1系统为私有云计算提供了完整的解决方案。带有管理模块和简单安装程序的直观Web访问界面使您可以轻松受益于私有云计算技术。 |
Eucalyptus | Eucalyptus 是一个开源的,与AWS兼容的,本地部署的IaaS云软件平台。Eucalyptus使用libvirt 虚拟化 API直接与 Xen 和 KVM 管理程序交互。 |
Nimbus | Nimbus是一个开源工具包,专注于为科学界提供IaaS功能,它使用libvirt与所有KVM和Xen虚拟机进行通信。 |
Snooze | Snooze是一个开源的、可扩展的、自动化的、节能的虚拟机管理框架,主要用于私有云。Snooze使用libvirt API实现虚拟机的监控、实时迁移和生命周期管理。 |
OpenStack | CC1系统为私有云计算提供了完整的解决方案。带有管理模块和简单安装程序的直观Web访问界面使您可以轻松受益于私有云计算技术。 |
Cracow Cloud One | OpenStack是一个“云操作系统”,可用于公共云和私有云。它的各个部分负责计算、存储和网络资源,并使用仪表板与用户交互。计算部分使用libvirt来实现 虚拟机的监控、生命周期等的管理。 |
KubeVirt | KubeVirt是个Kubernetes的一个虚拟机管理插件,使其在原本调度容器之余能够并行调度传统虚拟机。 |
Cherrypop | Cherrypop是一个去中心化的云软件,节点自动检测其他节点并自动分配虚拟机和工作负载,宿主机也没有最低限制,非常适合在低端服务器架设云。 |
ZStack | ZStack是一款开源IaaS软件,旨在通过使用API自动管理数据中心内的所有资源(计算、存储、网络等),从而符合软件定义数据中心的原则。ZStack 在管理方面的主要优势是可扩展性、性能和快速、用户友好的部署。 |
根据libvirt官方网站的显示,基于libvirt API的软件库工具统计如表5所示。
名称 | 释义 |
---|---|
libguestfs | Libguestfs是用于访问和修改虚拟机磁盘镜像的一组工具集,它提供了访问和编辑虚拟机中的文件、脚本化修改虚拟机中的信息、监控磁盘使用和空闲的统计信息、P2V、V2V等丰富的功能。 |
libvirt-sandbox | 一个库和命令行工具,用于简化虚拟化沙箱的创建,目前支持 KVM、QEMU 或 LXC 作为后端,与 systemd 的集成有助于对 apache 等系统服务进行沙箱化。 |
Ruby Libvirt Object bindings | 允许使用简单的 ruby 对象来操作管理程序、访客、存储、网络等。它基于本地 ruby 绑定。 |
根据libvirt官方网站的显示,基于libvirt API的监控工具统计如表6所示。
名称 | 释义 |
---|---|
collectd | Libvirt-plugin是collectd的一部分,并收集统计虚拟机操作系统信息。通过这种方式,可以搜集每个虚拟机的CPU、网络接口和块设备使用情况,而无需在虚拟机系统上安装collectd。 |
host sFlow | Host sFlow是一个在KVM管理程序上运行的轻量级代理,它链接到libvirt库并导出所有虚拟机的标准化CPU、内存、网络和磁盘指标。 |
munin | Guido Günther提供的插件允许使用Munin监控各种事物,例如网络和阻止 I/O。 |
nagios-virt | Nagios-virt是一个配置工具,用于向Nagios添加对虚拟化域的监控。您可以使用此工具为Xen或QEMU/KVM虚拟机设置新的Nagios安装,或者与现有的Nagios 安装集成。 |
PCP | PCP libvirt PMDA(插件)是PCP工具包的一部分,提供虚拟机管理程序和虚拟机信息以及完整的虚拟机性能指标集。它支持每个虚拟机的pCPU、vCPU、内存、块设备、网络接口和性能事件指标。 |
根据libvirt官方网站的显示,基于libvirt API的Web管理工具统计如表7所示。
名称 | 释义 |
---|---|
AbiCloud | AbiCloud是一个开源云平台管理器,允许在您的数据中心轻松部署私有云。AbiCloud的主要区别之一是用于管理基础架构的丰富的网络界面,您只需拖放 虚拟机即可部署新服务。 |
Kimchi | Kimchi是一个基于HTML5的KVM管理工具。它旨在尽可能简单地使用KVM并创建您的第一个虚拟机。Kimchi通过libvirt管理KVM虚拟机,使用支持HTML5的浏览器通过Web访问管理界面。 |
oVirt | oVirt是一个私有云平台软件,提供了中型规模集群主机管理能力,可做服务器虚拟化,也可桌面虚拟化。 |
VMmanager | VMmanager是一种用于虚拟化管理的软件解决方案,可用于托管虚拟机和构建云。VMmanager不仅可以管理一台服务器,还可以管理大型虚拟机管理程序集群。它提供了许多功能,例如允许在集群节点之间进行负载平衡的实时迁移、监控 CPU、内存。 |
mist.io | Mist.io是一个开源项目和服务,可以帮助您以统一的方式管理您的虚拟机,为您的所有基础架构(多个公共云提供商、基于OpenStack的公共/私有云、Docker 服务器、裸机服务器和现在的 KVM 管理程序)。 |
Ravada | Ravada是用于管理虚拟桌面基础架构(VDI)的开源工具。它非常容易安装和使用。按照文档,您将在几分钟内准备好部署虚拟机。对用户的唯一要求是Web浏览器和轻量级远程查看器。 |
Libvirt的核心功能就是提供一套统一的API用来管理虚拟机,libvirt API主要划分为五个大类,如图3所示。