云计算 频道

OpenStack关键技术系列:Libvirt基础知识

  【IT168 技术】libvirt是什么?从字面上看,由lib和virt两部分组成。lib是指库library的缩写,virt是虚拟化virtualization的缩写,所以他的定位是“虚拟化的库”。它是一套开源的API、管理工具,用来管理虚拟化平台。可以应用在KVM、XEN、VMware ESX、QEMU等虚拟化技术,在OpenStack Nova中,默认采用libvirt对不同类型的虚拟机(OpenStack默认KVM)进行管理。

  libvirt是目前使用最为广泛的针对KVM虚拟机进行管理的工具和API。Libvirtd是一个daemon进程,可以被本地和远程的virsh(命令行工具)调用,Libvirtd通过调用qemu-kvm操作管理虚拟机。libvirt 由应用程序编程接口 (API) 库、一个守护进程 (libvirtd),和默认命令行实用工具 (virsh)等部分组成。那么,libvirt支持什么? 一张图了解libvirt支持的Hypervisor和哪些管理工具支持libvirt。

  对上层libvirt是个C语言库,但同时它也提供了其他编程语言的封装,这些语言使用libvirt封装好的libvirtmod。2014年以前的libvirt代码中,包含python接口,在2014年某个版本以后,将python单独提出去了,不再和libvirt代码使用同一个git库,独立成为libvirt-python的Git库。

  对下层libvirt也支持多种Hypervisor,几乎囊括了目前世界上所有主流/大公司的虚拟化Hyperviosr,主要包括的Hyperviosr如下。

  libvirt既然是开源社区项目,那么作为一个libvirt技术爱好者,就必须要了解libvirt开源社区情况。Libvirt目前已经对Ruby、Java语言,Perl和 OCaml实施了绑定,支持最流行的系统编程语言(C和C++)、多种脚本语言。Libvirt的架构如下。

  没有使用libvirt架构如下左图,为支持各种Hypervisor的可扩展性,libvirt实施一种基于驱动程序的架构,该架构允许一种通用的API以通用方式为不同的Hyperviosr供服务。右图展示了libvirt API与相关驱动程序的层次结构(Hypervisor和Domain在同一个节点)。

  Hypervisor和Domain位于不同节点上时,管理应用程序通过一种通用协议从本地libvirt连接到远程libvirtd,通过运行于远程节点的libvirtd的特殊守护进程来实现管理。libvirtd提供从远程应用程序访问本地Domain的方式。

  2005年12月19日,libvirt第一个版本问世,创始人是Daniel Veillard,libvirt项目虽然是开源的,但是也有它的copyright。目前libvirt项目copyright是Redhat的。目前大部分libvirt社区的maintainer也是redhat主导。maintainer列表大家可以看源码目录下的AUTHORS.in文件。

  在maintainer中Redhat占了16席,Suse和富士通各占2席。其中创始人Daniel Veillard目前基本不负责合代码,只负责出版本(锁库、打tag、偶尔自己跑一下测试用例、发版本release notes、解库)。注意libvirt社区maintainer中有两个Daniel,一个就是创始人Veillard,另外一个是Daniel P.Berrange。创始人相当于帮主,另外一个Daniel P也是个大牛,在社区的地位相当于副帮主,其他的maintainer都很听从他的建议。

  除了在libvirt社区邮件进行交流外,libvirt还在IRC上开放了在线交流频道。IRC是国际上一个知名度很高的类似于简单的聊天室功能的一个交流平台,很多开源组织和其他组织都会在上面开通自己的频道。

  如果要参与到libvirt的代码开发,必须遵守libvirt现有的风格和框架。libvirt 的核心价值和主要目标就是提供了一套管理虚拟机的、稳定的、高效的应用程序接口(API)。libvirt API 大致可划分为如下8个大的部分:

  连接 Hypervisor相关的API:以virConnect 开头的一系列函数。

  域管理的 API:以virDomain 开头的一系列函数。

  节点管理的 API:以virNode 开头的一系列函数。

  网络管理的 API:以 virNetwork 开头的一系列函数和部分以 virInterface 开头的函数。

  存储卷管理的 API:以 virStorageVol 开头的一系列函数。

  存储池管理的 API:以virStoragePool 开头的一系列函数。

  事件管理的API:以virEvent 开头的一系列函数。

  数据流管理的API:以virStream 开头的一系列函数。

  以连接相关API为例进行说明。凡是跟连接相关libvirt接口(virConnect*)调用都需要首先调用virConnectOpen。此接口目的是通过libvirtd建立与底层Hypervisor连接,长期执行后续接口任务直至不再需要为止。调用步骤分为client端及server端,解析如下:

  1、Client端直接调用virConnectOpen,获取后端真正的driver,此时会先连接libvirtd,即C/S模式中的connect。

  2、Server端首先经事件机制分发,添加与client端对应的响应对象virNetServerClient,后续所有来自此client端的请求都由对应的响应对象处理。

  3、Client端调用virConnectOpen的RPC接口去连接libvirtd,以便获取真正的Hypervisor;

  4、Server端事件机制分发read事件,经线程池再分发线程任务,响应对象据信息头proc,选择真实的remote Dispatch Connect OpenHelper过程,最终再次调用virConnectOpen,至此RPC调用完成。

  5、Server端调用virConnectOpen的目的是连接真正的hypervisor,比如Qemu,保存driver指针到响应对象的privateData,后续普通接口调用就能直接使用。

  当已经建立了与libvirtd服务的连接,后续接口调用就可直接使用连接对象。

  在KVM虚拟化技术中,KVM负责CPU和内存虚拟化,但KVM不能模拟其他设备;Qemu是模拟IO设备(网卡,磁盘等),KVM和Qemu一起就能实现真正意义上服务器虚拟化;故而一般都称之为Qemu-KVM。

0
相关文章