OpenStack关键技术系列:Libvirt基础知识
消息来源:baojiabao.com 作者: 发布时间:2026-06-30

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。
温馨提示:
求知若渴, 虚心若愚—Stay hungry,Stay foolish
相关文章
B站怎么炸崩了哔哩哔哩服务器今日怎么又炸挂了?技术团队公开早先原因2023-03-06 19:05:55
苹果iPhoneXS/XR手机电池容量续航最强?答案揭晓2023-02-19 15:09:54
华为荣耀两款机型起内讧:荣耀Play官方价格同价同配该如何选?2023-02-17 23:21:27
google谷歌原生系统Pixel3 XL/4/5/6 pro手机价格:刘海屏设计顶配版曾卖6900元2023-02-17 18:58:09
科大讯飞同传同声翻译软件造假 浮夸不能只罚酒三杯2023-02-17 18:46:15
华为mate20pro系列手机首发上市日期价格,屏幕和电池参数配置对比2023-02-17 18:42:49
小米MAX4手机上市日期首发价格 骁龙720打造大屏标准2023-02-17 18:37:22
武汉弘芯遣散!结局是总投资1280亿项目烂尾 光刻机抵押换钱2023-02-16 15:53:18
谷歌GoogleDrive网云盘下载改名“GoogleOne” 容量提升价格优惠2023-02-16 13:34:45
巴斯夫将裁员6000人 众化工巨头裁员潮再度引发关注2023-02-13 16:49:06
人手不足 韵达快递客服回应大量包裹派送异常没有收到2023-02-07 15:25:20
资本微念与李子柒销声匿迹谁赢? 微念公司退出子柒文化股东2023-02-02 09:24:38
三星GalaxyS8 S9 S10系统恢复出厂设置一直卡在正在检查更新怎么办2023-01-24 10:10:02
华为Mate50 RS保时捷最新款顶级手机2022多少钱?1.2万元售价外观图片吊打iPhone142023-01-06 20:27:09
芯片常见的CPU芯片封装方式 QFP和QFN封装的区别?2022-12-02 17:25:17
华为暂缓招聘停止社招了吗?官方回应来了2022-11-19 11:53:50
热血江湖手游:长枪铁甲 刚猛热血 正派枪客全攻略技能介绍大全2022-11-16 16:59:09
东京把玩了尼康微单相机Z7 尼康Z7现在卖多少钱?2022-10-22 15:21:55
苹果iPhone手机灵动岛大热:安卓灵动岛App应用下载安装量超100万次2022-10-03 22:13:45
苹果美版iPhone可以在中国保修 从哪看怎么查询iPhone的生产日期?2022-09-22 10:00:07










