<转> 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设备直接分 ...
随机推荐
- css 权重 特殊性
选择器的特异性由 CSS2 规范定义如下: !important的规则比其他的权值都大 p{color: red !important} 如果声明来自于“style”属性,而不是带有选 ...
- linux-cp
cp 更改时间: 2017-10-26 - 21:00:54 cp:用来复制文件或者目录的命令,当源文件与目标文件名字相同的时候,当cp 没有参数,源文件会覆盖目标文件 参数 -p:保留源文件或者目录 ...
- VS2013创建Windows服务
一.创建服务 1.文件->新建->项目->windows桌面->windows服务,修改你要的项目名称.我这不改名,仍叫WindowsService1,确定. 2.其中的Pro ...
- 【ThinkPHP框架学习 】(2) --- 后台管理系统如何用iframe点击左边右边局部刷新
如题: 在写后台管理系统时,需要实现后台界面的局部动态刷新. 左边的导航栏使用a标签进行设置,通过href和target属性的配合,就可以将iframe中的子页实现动态 ...
- 闲聊select和input常用的小插件
前言 在pc端的项目中,经常会用到表单标签,莫过于是select和input这两种,这两种相当常用.但往往原生的功能不尽人意,即使 input中type有n多属性,甚至连时间控件都有,但仍旧满足不了我 ...
- websocket做手机页面聊天与PC页面聊天一对一的即时通讯
当时要写这个需求的时候,很头痛,手机端页面的客服功能,相当于QQ这样一个一对一聊天室功能了,瞬间蒙蔽的我也不知道用什么去写这个东西,一开始用ajax,定时器去写,写着写着发现这尼玛不在同一个页面怎么做 ...
- MS08_067漏洞学习研究
p197 MS08-067漏洞渗透攻击 按照书上的设置做,exploit得到错误信息: Exploit failed [unreachable]: Rex::ConnectionRefused The ...
- 老男孩最新Python全栈开发视频教程(92天全)重点内容梳理笔记 看完就是全栈开发工程师
为什么要写这个系列博客呢? 说来讽刺,91年生人的我,同龄人大多有一份事业,或者有一个家庭了.而我,念了次985大学,年少轻狂,在大学期间迷信创业,觉得大学里的许多课程如同吃翔一样学了几乎一辈子都用不 ...
- jquery.uploadify+spring mvc实现上传图片
一.前端页面 1.下载jquery.uploadify 去uploadify官网(http://www.uploadify.com/download/)下载压缩包,解压后放在如下路径: 2.html结 ...
- Winform远程更新代码
本软件具备以下形: 1.通过http形式在客户端更新winform代码文件 2.在服务端通过软件生成xml配置文件,客户端通过比对xml配置文件来更新代码文件. 服务端: 在服务器上建立一个IIS发布 ...