<转> 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设备直接分 ...
随机推荐
- DOM Exception error 类型
INDEX_SIZE_ERR code 1 索引是负值,或者超过了索引值 DOMSTRING_SIZE_ERR code 2 ...
- Problem I: STL——多重集的插入和删除
Problem I: STL--多重集的插入和删除 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1729 Solved: 1258[Submit][ ...
- python利用django实现简单的登录和注册,并利用session实现了链接数据库
利用session实现与数据库链接,登录模块(在views.py) def login(request): # return HttpResponseRedirect('/') # 判断是否post方 ...
- ABP框架个人开发实战(1)_环境搭建
前言 之前关注ABP框架有一阵子了,一直没有潜下心来实际研究一下.最近想自己建站,以后有自己的功能开发项目,可以在自己的站点上开发,并一步步的完善,所以找个比较好用的框架迫在眉睫,选来选去,决定用AB ...
- 07.十分钟学会tomcat数据源
一.数据源的作用及操作原理 1, 首先先看下传统JDBC的操作 在tomcat中使用数据库连接池操作数据库 2,JNDI属于命名及目录查找接口,在javaee的javax.naming包中 这套AP ...
- 一:配置使用阿里云Maven库
鉴于国内的网络环境,从默认 Maven 库下载 jar 包是非常的痛苦. 速度慢就不说了,还经常是下不下来,然后一运行就是各种 ClassNotFoundException,然后你得找到残留文件删掉重 ...
- 对SQL Server事务的4个隔离级别的理解
事务隔离级别的简单理解 ANSI/ISO SQL标准定义了4种事务隔离级别,这些隔离级别是根据事务并行出现的4个"现象"定义的. 4个现象是: 1.更新丢失(Lost Upda ...
- 【Android开发学习笔记之一】5大布局方式详解
Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...
- udp和tcp
tcp(Transmission Control Protocol 传输控制协议) 协议复杂,有序和可靠.编号和分段实现了有序,ACK(acknowledge)和重新发送实现了可靠. 滑窗实现了同时发 ...
- 树莓派远程桌面配置-开机自启SSH
必须先安装tightvncserver sudo apt-get install tightvncserver 再安装xrdp服务. sudo apt-get install xrdp 如果开着防火墙 ...