<转> 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设备直接分 ...
随机推荐
- jQuery添加删除节点例子第十节"员工增删表"
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 全国DNS服务器地址(部分)
广东: 广东省广州市(中国电信) 首选DNS:61.144.56.100 备份DNS:61.144.56.101 广东省广州市越秀区(中国电信) 首选DNS:202.96.128.86 备份DNS:2 ...
- 菜鸟谈谈C#中的构造函数和析构函数
本节说明对象的创建.初始化和销毁过程.本节介绍下列主题: l 类构造函数 l 结构构造函数 l 析构函数 类构造函数 本节将讨论三种类构造函数: 类构造 ...
- 使用swiper简单的h5下滑翻页效果,
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...
- java的String构造对象的几种方法以及内存运行过程
String类创建对象的方法可以分为以下三种 1.String a = "123"; 2.String b = new String("123"); 3.Str ...
- Python argparse模块实现模拟 linux 的ls命令
python 模拟linux的 ls 命令 sample: python custom_ls.py -alh c:/ 选项: -a ,--all 显示所有文件,包括'.'开头的隐藏文件 -l 列表显 ...
- vue+node+webpack搭建环境
一.环境搭建 1.1.去官网安装node.js( http://www.runoob.com/nodejs/nodejs-install-setup.html ) 注意node的版本,只有支持和谐模 ...
- 作为新手 HTML5如何自学为好?
互联网发展到今天,越来越多的技术岗位人才出现了稀缺的状态,就拿当前的HTML5来讲,基本成为了每家互联网公司不可缺少的人才.如果抓住这个机会,把HTML5搞好,那么前途不可限量,而且这门行业是越老越吃 ...
- c# winform 窗体之间的传参
说起winform程序中窗体之间的参数互传,大家找度娘会找到很多方法: 1.在窗体类中创建全局变量,类型为公开.静态的: 2.在窗体类中定义狗仔函数: 3.通过实践来船体参数: 这三种思路完全来自于霖 ...
- JAVAFX-4 开发应用
JavaFx 形状 Node类是所有JavaFX场景图形节点的基本基类.它提供了转换和应用效果到任何节点的能力. javafx.scene.shape.Shape类是Node类的子类.所有较旧的Jav ...