<转> Libvirt学习总结
感谢朋友支持本博客。欢迎共同探讨交流。因为能力和时间有限,错误之处在所难免,欢迎指正!
假设转载,请保留作者信息。
博客地址:http://blog.csdn.net/gaoxingnengjisuan
邮箱地址:dong.liu@siat.ac.cn
这是本人之前在实验室做的一个LIBVIRT学习报告。
1.什么是libvirt
比方。启动。停用,配置,连接控制台等。这样在构建云管理的时候就存在两个问题:
为了适应变化,我们惯用的手段是分层。使之相互透明。在虚拟机和云管理中设置一个抽象管理层。
libvirt就是扮演的这个角色。有了它,上面两个问题就迎刃而解。
libvirt提供各种API,供上层来管理不同的虚拟机。
它为受支持的虚拟机监控程序实现的经常使用功能提供通用的API。
2.Libvirt主要支持的功能
虚拟机管理:包含不同的领域生命周期操作。比方:启动、停止、暂停、保存、恢复和迁移。
支持多种设备类型的热插拔操作,包含:磁盘、网卡、内存和CPU。
远程机器支持:仅仅要机器上执行了libvirt daemon,包含远程机器,全部的libvirt功能就都能够訪问和使用。
支持多种网络远程传输。使用最简单的SSH,不须要额外配置工作。
存储管理:不论什么执行了libvirt daemon的主机都能够用来管理不同类型的存储:创建不同格式的文件镜像(qcow2、vmdk、raw等)、挂接NFS共享、列出现有的LVM卷组、创建新的LVM卷组和逻辑卷、对未处理过的磁盘设备分区、挂接iSCSI共享。等等等等。由于libvirt能够远程工作。全部这些都能够通过远程主机使用。
网络接口管理:不论什么执行了libvirt daemon的主机都能够用来管理物理和逻辑的网络接口。
虚拟NAT和基于路由的网络:不论什么执行了libvirt daemon的主机都能够用来管理和创建虚拟网络。
libvirt库用C(支持 C++)实现。且包括对Python的直接支持。
只是它还支持大量语言绑定。眼下已经对Ruby、Java语言,Perl和
OCaml实施了绑定。libvirt支持最流行的系统编程语言(C和C++)、多种脚本语言。因此。无论您側重何种语言。都能够方便的应用Libvirt。
4.Libvirt支持的虚拟机
眼下支持的虚拟化技术包含:
能够说是很丰富,主流的虚拟化技术都包括了。
5.Libvirt体系结构
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2FveGluZ25lbmdqaXN1YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
为支持各种虚拟机监控程序的可扩展性。libvirt实施一种基于驱动程序的架构,该架构同意一种通用的API以通用方式为大量潜在的虚拟机监控程序提供服务。下图展示了libvirt API与相关驱动程序的层次结构。这里也须要注意,libvirtd提供从远程应用程序訪问本地域的方式。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2FveGluZ25lbmdqaXN1YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
该管理应用程序通过一种通用协议从本地libvirt连接到远程libvirtd。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2FveGluZ25lbmdqaXN1YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
6.Libvirt相关工具介绍
它构建于libvirt之上,同意以交互方式使用多个libvirt功能。
这仅仅是个简单的配置。libvirt真正支持的属性更加多样化。
启动新域时,使用create命令和域配置文件:
3).使用virsh内的list命令列出给定主机上的活动域、域ID以及状态:
4).也能够使用suspend命令中止域。该命令可停止处于调度中的域,只是该域仍存在于内存中。可高速恢复执行。
如今我们看一个使用Python来控制域的样例。
在本例中,从导入libvirt模块開始。然后连接到本地虚拟机监控程序。
对每一个 ID 创建一个域对象,然后中止,继续。最后删除该域。
- import libvirt
- conn = libvirt.open('qemu:///system')# 连接
- for id in conn.listDomainsID():
- dom = conn.lookupByID(id)
- print "Dom %s State %s"%(dom.name(), dom.info()[0])
- dom.suspend()# 停止
- print "Dom %s State%s(after suspend)"%(dom.name(), dom.info()[0])
- dom.resume()# 继续
- print "Dom %s State%s(after resume)"%(dom.name(), dom.info()[0])
- dom.destroy()# 删除
输出结果:
8.Libvirt API介绍
高级libvirt API可划分为5个API部分:虚拟机监控程序连接API、域API、网络API、存储卷API、存储池API。
每个实体,要与libvirt互相作用,应用virsh, virt-manager或者使用libvirt库。都须要首先获得一个到主机上libvirt守护进程的连接。
演示样例:
virConnectPtr conn;
连接本地和远程的hypervisor都是libvirt使用URI来进行处理。
driver+unix:///session
參数解释:
如xen, qemu,lxc, openvz和test。
port:非常少使用。
返回虚拟机监控程序和驱动程序的功能描写叙述。它包括一个指针。假设调用成功,将返回一个字符串,当中包括了描写叙述功能信息的XML文件。
它採用了一个连接指针和一个virNodeInfo指针(由调用者分配)作为输入,假设成功。则会返回0。而且将获取信息填写在virNodeInfo结构体中。
提供关于引发错误的很具体的信息。假设多个发生错误在没有错误监測机制的连接上的时候。错误信息有可能会丢失。由于这个原因。强烈建议常常对错误进行监測,并在libvirt API调用失败以后,马上进行错误收集。
、virDomainSuspend 、virDomainResume 、virDomainDestroy)。
一个暂时的域仅仅由当它在主机上执行的时候才干够被管理,一旦关闭。全部执行的迹象都会消失。
当一个持续的域被关闭时,仍然可能会管理这个域的无效的配置。当执行定义好的配置文件时。一个暂时的域能够转变成一个持续的域。
演示样例:
dom = virDomainLookupByUUIDString(conn, domainUUID);
为了确定ID数组的大小,应用程序能够调用virConnectNumOfDomains API来解决。把这两个API调用放在一起,打印执行域ID列表的代码将会是例如以下所看到的:
- int i;
- int numDomains;
- int *activeDomains;
- numDomains = virConnectNumOfDomains(conn);
- activeDomains = malloc(sizeof(int) * numDomains);
- numDomains = virConnectListDomains(conn, activeDomains, numDomains);
- printf("Active domain IDs:\n");
- for (i = 0 ; i < numDomains ; i++) {
- printf(" %d\n", activeDomains[i]);
- }
- free(activeDomains);
除了正在执行的域。可能还会有一些持久的无效域配置存储在主机上。假设一个无效的域不具备不论什么的ID标志,这个不活跃域的列表将会以name字符串列表的形式输出。
打印无效的持久域的name列表的代码将会是例如以下所看到的:
- int i;
- int numDomains;
- char **inactiveDomains;
- numDomains = virConnectNumOfDefinedDomains(conn);
- inactiveDomains = malloc(sizeof(char *) * numDomains);
- numDomains = virConnectListDomains(conn, inactiveDomains, numDomains);
- printf("Inactive domain names:\n");
- for (i = 0 ; i < numDomains ; i++) {
- printf(" %s\n", inactiveDomains[i]);
- free(inactiveDomains[i]);
- }
- free(inactiveDomains);
不论什么未定义或者没有建立的域的状态。
当这个域系统关闭的时候。全部的执行痕迹将会消失。
virDomainCreate将会从持久性配置中引导启动一个预先定义的域。
- virDomainPtr dom;
- const char *xmlconfig = "<domain>........</domain>";
- dom = virConnectCreateXML(conn, xmlconfig, 0);
- if (!dom)
- {
- fprintf(stderr, "Domain creation failed");
- return;
- }
- fprintf(stderr, "Guest %s has booted",virDomainName(dom));
- virDomainFree(dom);
假设创建域的尝试成功,那么将会返回virDomainPtr作为这个域的句柄。虽然域引导启动成功。可是这不能保证这个域的持续执行。
- virDomainPtr dom;
- const char *xmlconfig = "<domain>........</domain>";
- dom = virConnectDefineXML(conn, xmlconfig, 0);
- if(virDomainCreate(dom) < 0){
- virDomainFree(dom);
- fprintf(stderr, "Cannot boot guest");
- return;
- }
- fprintf(stderr,"Guest %s has booted",virDomainName(dom));
- virDomainFree(dom);
至于网络 API(监控虚拟网络)、存储卷 API(管理存储设备)和存储池 API(管理存储文件系统)这里先不做介绍了。假设有须要的话,能够直接看官方文档,介绍的非常具体,还有非常多简单明了的演示样例。
<转> Libvirt学习总结的更多相关文章
- libvirt学习
高级libvirt API可划分为5个API部分:虚拟机监控程序连接API.域API.网络API.存储卷API.存储池API.
- kvm/qemu/libvirt学习笔记 (1) qemu/kvm/libvirt介绍及虚拟化环境的安装
kvm简介 kvm最初由Quramnet公司开发,2008年被RedHat公司收购.kvm全称基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux的一个内核模块 ...
- Libvirt代码架构
Libvirt介绍 参考资料 Libvirt学习 通过virsh了解libvirt api的调用方式 通过virHypervisorDriver了解libvirt api的实现 virsh代码阅读 通 ...
- KVM,QEMU,libvirt入门学习笔记【转】
转自:http://blog.csdn.net/julykobe/article/details/27571387 注:本文内容均来自网络,我只是在此做了一些摘抄和整理的工作,来源均有注明. 0.虚拟 ...
- 学习OpenStack之(6):Neutron 深入学习之 OVS + GRE 之 Compute node 篇
0.环境 硬件环境见上一篇博客:学习OpenStack之(5):在Mac上部署Juno版本OpenStack 四节点环境 OpenStack网络配置:一个tenant, 2个虚机 Type drive ...
- KVM 介绍(8):使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机 [Nova Libvirt QEMU/KVM Live Migration]
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- KVM 介绍(7):使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照 (Nova Instances Snapshot Libvirt)
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain]
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- KVM 介绍(5):libvirt 介绍 [ Libvrit for KVM/QEMU ]
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
随机推荐
- 堆排序HeapSort
堆排序,顾名思义,是采用数据结构堆来进行排序的一种排序算法. 研究没有规律的堆,没有任何意义.特殊的堆有最大堆(父节点值大于等于左右字节点值),最小堆(父节点值小于等于子节点值).一般采用最大堆来进行 ...
- 掌握numpy(四)
数组的累加(拼接) 在前面讲了使用切片方法能够对数组进行切分,使用copy对切片的数组进行复制,那么数组该如何拼接呢? a1 = np.full((2,3),1)#填充数组 a2 = np.full( ...
- SpringBoot之彩色输出
spring.output.ansi.enabled NEVER:禁用ANSI-colored输出(默认项) DETECT:会检查终端是否支持ANSI,是的话就采用彩色输出(推荐项) ALWAYS:总 ...
- canvas图表(3) - 饼图
原文地址:canvas图表(3) - 饼图 这几天把canvas图表都优化了下,动画效果更加出色了,可以说很逼近echart了.刚刚写完的饼图,非常好的实现了既定的功能,交互的动画效果也是很棒的. 效 ...
- python PIL图像处理
新建图像 # 三个参数分别代表图像的模式:常用的为RGB(3通道) .RGBA(4通道为透明通道,0为完全透明, 256为不透明) # 第二个参数为图像的长宽参数 # 第三个为默认的填充颜色,RGB时 ...
- 京东分布式缓存redis应用实战
互联网应用特点三高:高并发.高可用.高性能,要达到这几个目标,好的方法方式是建立相应指标, 来进行准确描述,有了准确指标进行监控,方能易于实现我们设定目标. 先将指标介绍下,方便下面相关术语使用,qp ...
- [全排列]--A Number Puzzle
标签: ACM Lele 最近上课的时候都很无聊,所以他发明了一个数字游戏来打发时间. 这个游戏是这样的,首先,他拿出几张纸片,分别写上0到9之间的任意数字(可重复写某个数字),然后,他叫同学随便写两 ...
- TCP/IP 协议栈 ------ ICMP
I C M P经常被认为是 I P层的一个组成部分.它传递差错报文以及其他需要注意的信息.I C M P报文通常被I P层或更高层协议( T C P或U D P)使用.一些I C M P报文把差错报文 ...
- Java爬虫实践--爬取CSDN网站图片为例
实现的效果,自动在工程下创建Pictures文件夹,根据网站URL爬取图片,层层获取.在Pictures下以网站的层级URL命名文件夹,用来装该层URL下的图片.同时将文件名,路径,URL插入数据库, ...
- PHP通过ZABBIX API获取主机信息 VS 直接从数据库获取主机信息
最近项目需要获取linux主机的一些信息,如CPU使用率,内存使用情况等.由于我们本身就装了zabbix系统,所以我只用知道如何获取信息即可,总结有两种方法可以获取. 一.通过ZABBIX API获取 ...