libvirt 架构

148 阅读6分钟

本页描述了 libvirt API 定义背后的主要原则和架构选择

libvirt API 旨在公开管理系统的虚拟化支持所需的所有资源。通过 API 作的第一个对象是 virConnectPtr,它表示与虚拟机管理程序的连接。

任何使用 libvirt 的应用程序都可能通过调用其中一个 virConnectOpen 函数来开始使用 API。

请注意,这些函数采用 name 参数,该参数实际上是 connection URI 来选择要打开的正确虚拟机管理程序。需要一个 URI 来允许远程连接,并在不同的可能虚拟机管理程序之间进行选择。

例如,在 Linux 系统上,可以在同一节点上同时使用 KVM 和 LinuxContainers。NULL 名称将默认为预先选择的虚拟机管理程序,但在大多数情况下,这样做可能不是明智之举。

查看连接 URI 页面,了解允许的值的完整描述。

1. 架构

应用程序获取 virConnectPtr 连接到虚拟机管理程序,然后,它可以使用它来管理虚拟机管理程序的可用域和相关虚拟化资源, 例如存储和网络。所有这些都被公开为“一等公民对象”,并连接到虚拟机管理程序连接(以及节点或集群)。

image.png

上图显示了 API 导出的 5 个主要对象:

  • virConnectPtr: 表示与虚拟机管理程序的连接。使用 virConnect 打开 函数来获取与虚拟机管理程序的连接,然后使用该虚拟机管理程序 作为其他连接 API 的参数。

  • virDomainPtr:表示一个域,无论是活动的还是定义的(即作为 永久配置文件和存储,但当前未在该文件上运行 节点)。函数 virConnectListAllDomains 列出虚拟机管理程序的所有域。

  • virNetworkPtr:表示一个活动或定义的网络(即作为 永久配置文件和存储,但当前未激活)。这 功能 virConnectListAllNetworks 列出虚拟机管理程序的所有虚拟化网络。

  • virStorageVolPtr:表示一个通常用作块存储设备的存储卷 可用于其中一个域。函数 virStorageVolLookupByPath 根据存储卷对象在节点上的路径查找该对象。

  • virStoragePoolPtr:表示存储池,它是用于分配的逻辑区域 和存储存储卷。函数 virConnectListAllStoragePools 列出 Hypervisor 上的所有虚拟化存储池。这功能 virStoragePoolLookupByVolume 查找包含给定存储卷的存储池。

该库处理的大多数对象也可以使用 XML 描述来表示。这主要用于创建这些对象,但也有助于修改或保存其描述。

域、网络和存储池可以是活动的 ,即正在运行或可立即使用,也可以是定义的 ,在这种情况下,它们是非活动的,但系统中有一个永久的定义可供它们使用。基于此,可以动态激活它们以供使用。

大多数对象也可以用各种方式命名:

  • name: 用户友好的标识符,但无法保证其在两个节点之间的唯一性。

  • ID:虚拟机管理程序为对象的一个给定激活提供的运行时唯一标识符;但是,一旦资源被停用,它就会失效。

  • UUID:RFC 4122 中定义的 16 字节唯一标识符,保证在长期使用和跨一组节点时是唯一的。

2. # 函数和命名约定

库中存在的函数的命名通常由描述与函数关联的对象的前缀和描述对该对象的作的动词组成。

对于每个第一类对象,您将找到用于以下作的 API:

用于按某种类型的标识符对对象执行查找,例如:

3. libvirt 驱动程序

驱动程序是 libvirt 功能的基础,用于支持处理特定虚拟机监控程序驱动程序调用的功能。 在连接处理过程中,驱动程序被发现并注册为虚拟化模块 virInitialize 的一部分初始化应用程序接口。

每个驱动程序都有一个注册 API,用于加载驱动程序要调用的 libvirt API 的特定函数引用。

以下是虚拟机监控程序驱动程序机制的简单视图。

image.png

其实这里看来,容器(基于 lxc ),虚拟机都可以在libvirt管理之下

仔细考虑 驱动程序的堆叠列表,作为可插入的一系列模块,架构取决于 libvirt 的构建方式。

驱动程序体系结构还用于支持其他虚拟化组件,例如存储、存储池、主机设备、网络、网络接口和网络过滤器。

5. 守护进程和远程访问 

对 libvirt 驱动程序的访问主要由 libvirtd 守护程序通过远程驱动程序(通过 RPC)进行连接和响应。

某些虚拟机管理程序确实支持客户端:例如 Test、OpenVZ、VMware、VirtualBox (vbox)、ESX、Hyper-V、Xen 和 Virtuozzo。

libvirtd 守护程序服务是在系统引导时在主机上启动,只要权限足够,可以随时重启。

libvirtd 守护程序使用相同的 libvirt API virInitialize 序列作为客户端驱动程序注册的应用程序,但随后 扩展已注册的驱动程序列表,以便包含所有已知的驱动程序,从而可以使用主机上支持的所有驱动程序类型。

libvirt 客户端应用程序使用 URI 以获取 virConnectPtr。

virConnectPtr 跟踪驱动程序连接以及各种其他连接(网络、接口、存储等)。然后,virConnectPtr 将用作其他虚拟化函数的参数(请参阅函数和命名约定 )。

根据所使用的驱动程序,调用将通过远程驱动程序路由到 libvirtd 守护程序。守护程序将引用特定于连接的驱动程序,以便检索请求的信息,然后通过连接将状态和/或数据传回应用程序。

然后,应用程序可以决定如何处理该数据,例如显示、写入日志数据等。 迁移是正在使用的体系结构的许多方面的一个示例。

image.png

上图的关键要点是,有一个远程驱动程序可以处理大多数驱动程序的事务。主机上运行的 libvirtd 守护程序将接收来自远程驱动程序的事务请求,然后查询 virConnectPtr 中指定的虚拟机管理程序驱动程序以获取数据。然后,数据将通过远程驱动程序返回给客户端应用程序进行处理。

参考:

  1. libvirt.org/api.html