2.3 Libvirt技术介绍
Libvirt是一个函数库,包含实现Linux虚拟化功能的Linux API,提供了管理虚拟机的通用的、稳定的、统一的接口。其主要包括Libvirt API、Libvirtd进程和virsh工具集三部分。
为了便于理解,我们将Libvirt分为三层,从三个层级进行介绍,具体如下图所示。
其中,接口层的virsh工具集和Libvirt API负责接收程序和用户的指令;在抽象驱动层,接收上层发出的指令调用Libvirt库或控制Libvirtd进程提供统一的接口;在具体驱动层,调用底层相应的虚拟化技术接口执行操作。
Libvirt可以提供关于虚拟机管理的所有API,包括创建、修改、监控、控制、迁移和停止虚拟机。当然,并不是所有的虚拟化技术都支持Libvirt提供这些关于虚拟机的操作,但是Libvirt可以提供关于这些操作的API。任何一个对虚拟机有价值的操作,Libvirt都会提供。利用Libvirt可以同时访问多个物理主机,但是对单主机节点的操作是有限制的。Libvirt API提供了管理虚拟机所需的物理主机节点层面的所有操作,如防火墙规则、存储管理和一般配置API等。同时,它也提供了实施管理策略所需的状态监控API,对虚拟机的状态监控也从某种角度反映出物理主机的资源消耗情况,这对掌握生产环境中硬件资源的使用率极其重要。
综上所述,Libvirt实现了以下功能:
● 所有API通过安全协议都可以远端执行操作。
● 大部分API对虚拟化和物理主机操作系统的管理都是通用的,但是一些API只能应用于虚拟化管理。
● Libvirt API可以完成虚拟机需要的所有操作。
● Libvirt API不提供高级别虚拟化策略或多节点管理功能,如负载均衡功能。但是Libvirt不拒绝在其外部通过技术实现这些高级功能。
● 目前Libvirt的稳定性存在一些问题,建议将经常需要变化的、稳定性低的应用与稳定性要求高的应用进行分离。
● 被管理的物理主机节点可以来自不同的厂商,但是Libvirt对其进行远程管理必须使用安全协议。
● Libvirt API可以监控和使用被管理物理主机节点的资源,包括CPU、内存、存储和网络等。
由此可以总结出:Libvirt的目标是建立一套集中在虚拟化层面、面向应用的高级管理工具。
2.3.1 Libvirt API介绍
如前所述,Libvirt API的功能是使用有效的硬件资源服务当前的虚拟机操作系统。下面从Libvirt驱动和Libvirtd进程两方面展开介绍。
1.Libvirt驱动
Libvirt驱动是实现Libvirt功能的基本模块,保证了Libvirt程序可以处理和调用指定的虚拟化程序。Libvirt驱动在连接处理过程中被发现和注册,每个驱动都有一个注册API,其负责加载指定的驱动。下图是关于虚拟化程序驱动的简单视图。
Libvirt目前支持的虚拟化技术如下表所示。
2.Libvirtd进程
Libvirtd进程通过remote驱动可以远程处理对Libvirt驱动的访问请求。一些虚拟化技术支持来自客户端的连接和反馈,如Test、OpenVZ、VMware、PowerVM、VirtualBox、ESX、Hyper-V和Xen等。Libvirtd进程随操作系统启动而启动运行,与普通进程一样,具有足够权限的用户可以重启和停止它。确定需要使用的驱动后,Libvirtd进程可以将请求路由到正确的驱动上,建立连接并检索所请求的信息,返回状态信息或数据给应用。应用可以根据需求确定利用这些数据执行哪些操作,如展示、打印日志等。下图是Libvirtd进程的简单视图。
2.3.2 Libvirt网络架构
下面从网络逻辑架构和物理架构两方面来阐述Libvirt的网络设计。
● vlan1:该虚拟网络的流量连接到物理网络2上。
● vlan2:该虚拟网络与物理网络完全隔离。
● 虚拟机A:网络端口eth0桥接到物理网络1上,网络端口eth1连接到vlan1上。
● 虚拟机B:网络端口eth0连接到vlan1上,网络端口eth1连接到vlan2上。该虚拟主机扮演路由的角色,在两个vlan之间可以转发网络包,使虚拟机C连接到物理网络2上。
● 虚拟机C:仅有的网络端口eth0连接到vlan2上,没有直接连接物理网络,依靠虚拟机B的路由转发流量实现网络互通。
其逻辑架构如下图所示。
其物理架构如下图所示。
2.3.3 Libvirt存储架构
Libvirt的存储设计包括两个核心部分。
● 存储卷:一个存储卷可以分配给虚拟机使用,或创建成存储池以供使用。一个存储卷可以是一个块设备、一个.raw文件或其他格式的文件。
● 存储池:存储池可以理解成将存储资源池化,分割成存储卷分配给虚拟机使用。存储池用来管理物理磁盘、NFS服务器或一个LVM组。