一、libvirt简介

libvirt 是一个管理 hypervisor 的上层软件,它通过不同的驱动统一管理不同类型的 hypervisor ,并对外提供统一、稳定的应用程序接口。

在云场景中,业内广泛使用 libvirt 管理大规模的虚拟机。为了方便地对大规模的 StratoVirt 虚拟机进行部署、编排和管理,StratoVirt 标准虚拟化支持对接 libvirt,打通了 libvirt 北向接口。用户可以通过 libvirt 对应的 XML 文件描述一个虚拟机,包括虚拟机名称、CPU、磁盘等。

libvirt是目前使用最为广泛的对kvm虚拟机进行管理的工具和应用程序接口,而且一些常用的虚拟机管理工具(如virsh,virt-install,virt-manager等)和云计算框架平台(QpenStack,OpenNebula,Eucalyptus等)都在底层使用libvirt的应用程序接口。

尽管libvirt项目最初是为Xen支持也是非常得好,libvirt支持多种虚拟化方案,即支持包括KVM,QEMU,Xen,VMware,VirtualBox等在内的平台虚拟化方案,又支持QpenVZ,LXC等linux容器虚拟化系统,还支持用户态linux(UML)的虚拟化。

libvirt提供的要素:

  1. 它提供统一、稳定、开放的源代码的应用程序接口(API)、守护进程 (libvirtd)和和一个默认命令行管理工具(virsh)。
  2. 它提供了对虚拟化客户机和它的虚拟化设备、网络和存储的管理。
  3. 它提供了一套较为稳定的C语言应用程序接口。目前,在其他一些流行的编程语言中也提供了对libvirt的绑定,在Python、Perl、Java、Ruby、PHP、OCaml等高级编程语言中已经有libvirt的程序库可以直接使用。
  4. 它对多种不同的 Hypervisor 的支持是通过一种基于驱动程序的架构来实现的。libvirt 对不同的 Hypervisor 提供了不同的驱动,包括 Xen 的驱动,对QEMU/KVM 有 QEMU 驱动,VMware 驱动等。在 libvirt 源代码中,可以很容易找到 qemu_driver.c、xen_driver.c、xenapi_driver.c、vmware_driver.c、vbox_driver.c 这样的驱动程序源代码文件。
  5. 它作为中间适配层,让底层 Hypervisor 对上层用户空间的管理工具是可以做到完全透明的,因为 libvirt 屏蔽了底层各种 Hypervisor 的细节,为上层管理工具提供了一个统一的、较稳定的接口(API)。
  6. 它使用 XML 来定义各种虚拟机相关的受管理对象。

主要提供的功能:

  • 虚拟机生命周期管理:包括不同的领域生命周期操作,比如:启动、停止、暂停、保存、恢复和迁移。支持多种设备类型的热插拔操作,包括:磁盘、网卡、内存和CPU。
  • 本地&&远程访问:通过在本地运行libvirt daemon,本机和远程机器,都可以访问并使用libvirt的功能。远程一般通过简单配置SSH即可。
  • 存储管理:除了虚拟机管理,任何运行了libvirt daemon的主机都可以用来管理不同类型的存储:创建不同格式的文件镜像(qcow2、vmdk、raw等)、挂接NFS共享、列出现有的LVM卷组、创建新的LVM卷组和逻辑卷、对未处理过的磁盘设备分区、挂接iSCSI共享等。
  • 虚拟网络管理:可以用来管理和创建虚拟网络,管理物理和逻辑的网络接口。

二、libvirt简单架构原理介绍

libvirt架构:

libvirt实施一种驱动程序的架构,该架构允许一种通用的API以通用的方式为大量潜在的虚拟机监控程序提供服务。

libvirt运行原理:

在libvirt中涉及几个重要的概念:

1、节点(Node)是一个物理机器,上面可能运行着多个虚拟客户机,Hypervisor和Domain都运行在节点上。

2、Hypervisor也称虚拟监视器(VMM),如KVM,Xen,VMware,Hyper-V等,是虚拟化中一个底层软件层,它可以虚拟化一个节点让其运行多个虚拟机客户机(不同客户及可能有不同的配置和操作系统)。

3、域(Domain)实在Hypervisor上运行的一个客户机操作系统实例,域也被称为实例(instance,如亚马逊的aws云计算服务中的客户机就被称为实例),客户机操作系统(guest os),虚拟化(virtual machine),它们都是指同一个概念。

节点,Hypervisor和域的关系:

libvirt的管理功能主要包含的部分:

1、域的管理;

2、远程节点的管理;

3、存储的管理;

4、网络的管理;

5、提供一个稳定、可靠、高效的应用程序接口(API)以便可以完成前四个管理功能。

三、libvirt API介绍

libvirt API简介:

libvirt的核心价值和主要目标就是提供了一套管理虚拟机、稳定的、高效的应用程序接口(API)。

libvirti API所管理的主要对象:

对象的管理模型:

Libvirt API大致可划分为八个部分:

1、连接Hypervisor相关的API:以virCnnect开头的一系列函数。

只有与 Hypervisor 建立了连接之后,才能进行虚拟机管理操作,所以连接 Hypervisor 的API是其他所有API使用的前提条件。与 Hypervisor 建立的连接是为其他API的执行提供了路径,是其他虚拟化管理功能的基础。通过调用 virConnectOpen 函数可以建立一个连接,其返回值是一个virConnectPtr 对象,该对象就代表到 Hypervisor 的一个连接;如果连接出错,则返回空值(NULL)。而 virConnectOpenReadOnly 函数会建立一个只读的连接,在该连接上可以使用一些查询的功能,而不使用创建、修改等功能。 virConnectOpenAuth 函数提供了更具认证建立的连接。 virConnectGetCapabilities 函数是返回对 Hypervisor 和驱动的功能的描述的 XML 格式的字符串。virConnectListDomains函数返回一列域标识符,它们代表该 Hypervisor 上的活动域。

2、域管理的的API:以virDomain开头的一系列函数。

虚拟机的管理,最基本的职能就是对各个节点上的域的管理,故 libvirt API 中实现了很多针对域管理的函数。要管理域,首先就要获取virDomainPtr 这个域对象,然后才能对域进行操作。有很多种方式来获取域对象,如 virDomainPtr virDomainLookupByID (virConnectPtr conn, int id) 函数是根据域的 id 值到 conn 这个连接上去查找相应的域。类似地,virDomainLookupByName、virDomainLookupByUUID 等函数分别是根据域的名称和 UUID 去查找相应的域。在得到了某个域的对象后,就可以进行很多的操作,可以是查询域的信息(如:virDomainGetHostname、virDomainGetInfo、virDomainGetVcpus、virDomainGetVcpusFlags、virDomainGetCPUStats,等等),也可以是控制域的生命周期(如:virDomainCreate 、virDomainSuspend 、virDomainResume 、virDomainDestroy 、virDomainMigrate,等等)。

3、节点管理的API:以virNetwork开头的一系列函数。

域是运行在物理节点之上,libvirt也提供了对节点的信息查询和控制的功能。节点管理的多数函数都需要使用一个连接 Hypervisor 的对象作为其中的一个传入参数,以便可以查询或修改到该连接上的节点的信息。virNodeGetInfo函数是获取节点的物理硬件信息,virNodeGetCPUStats 函数可以获取节点上各个 CPU 的使用统计信息,virNodeGetMemoryStats 函数可以获取节点上的内存的使用统计信息,virNodeGetFreeMemory 函数可以获取节点上可用的空闲内存大小。也有一些设置或者控制节点的函数,如virNodeSetMemoryParameters 函数可以设置节点上的内存调度的参数,virNodeSuspendForDuration 函数可以让节点(宿主机)暂停运行一段时间。

4、网络管理的API:以virNetwork开头的一系列函数和部分以virlnterface开头的函数。

libvirt 对虚拟化环境中的网络管理也提供了丰富的API。libvirt 首先需要创建virNetworkPtr 对象,然后才能查询或控制虚拟网络。一些查询网络相关信息的函数,如:virNetworkGetName 函数可以获取网络的名称,virNetworkGetBridgeName 函数可以获取该网络中网桥的名称,virNetworkGetUUID 函数可以获取网络的 UUID 标识,virNetworkGetXMLDesc 函数可以获取网络的以 XML 格式的描述信息,virNetworkIsActive 函数可以查询网络是否正在使用中。一些控制或更改网络设置的函数,有:virNetworkCreateXML 函数可以根据提供的 XML 格式的字符串创建一个网络(返回 virNetworkPtr 对象),virNetworkDestroy 函数可以销毁一个网络(同时也会关闭使用该网络的域),virNetworkFree 函数可以回收一个网络(但不会关闭正在运行的域),virNetworkUpdate 函数可根据提供的 XML 格式的网络配置来更新一个已存在的网络。另外,virInterfaceCreate、virInterfaceFree、virInterfaceDestroy、virInterfaceGetName、virInterfaceIsActive 等函数可以用于创建、释放和销毁网络接口,以及查询网络接口的名称和激活状态。

5、存储卷管理的API:以virStouageVol开头的一系列函数。

libvirt 对存储卷(volume)的管理,主要是对域的镜像文件的管理,这些镜像文件可能是 raw、qcow2、vmdk、qed等各种格式。libvirt 对存储卷的管理,首先需要创建virStorageVolPtr 这个存储卷的对象,然后才能对其进行查询或控制操作。libvirt 提供了3个函数来分别通过不同的方式来获取存储卷对象,如:virStorageVolLookupByKey 函数可以根据全局唯一的键值来获得一个存储卷对象,virStorageVolLookupByName 函数可以根据名称在一个存储资源池(storage pool)中获取一个存储卷对象,virStorageVolLookupByPath 函数可以根据它在节点上路径来获取一个存储卷对象。有一些函数用于查询存储卷的信息,如:virStorageVolGetInfo 函数可以查询某个存储卷的使用情况,virStorageVolGetName 函数可以获取存储卷的名称,virStorageVolGetPath 函数可以获取存储卷的路径,virStorageVolGetConnect 函数可以查询存储卷的连接。一些函数用于创建和修改存储卷,如:virStorageVolCreateXML 函数可以根据提供的 XML 描述来创建一个存储卷,virStorageVolFree 函数可以释放存储卷的句柄(但是存储卷依然存在),virStorageVolDelete 函数可以删除一个存储卷,virStorageVolResize 函数可以调整存储卷的大小。

6、存储池管理的API:以virStoragePool开头的一系列函数。

libvirt 对存储池(pool)的管理,包括对本地的基本文件系统、普通网络共享文件系统、iSCSI共享文件系统、LVM分区等的管理。libvirt 需要基于 virStoragePoolPtr 这个存储池对象才能进行查询和控制操作。一些函数可以通过查询获取一个存储池对象,如:virStoragePoolLookupByName 函数可以根据存储池的名称来获取一个存储池对象,virStoragePoolLookupByVolume 可以根据一个存储卷返回其对应的存储池对象。virStoragePoolCreateXML 函数可以根据 XML 描述来创建一个存储池(默认已激活),virStoragePoolDefineXML 函数可以根据 XML 描述信息静态地定义个存储池(尚未激活),virStoragePoolCreate 函数可以激活一个存储池。virStoragePoolGetInfo、virStoragePoolGetName、virStoragePoolGetUUID等函数可以分别获取存储池的信息、名称和 UUID 标识。virStoragePoolIsActive函数可以查询存储池是否处于使用中状态。virStoragePoolFree 函数可以释放存储池相关的内存(但是不改变其在宿主机中的状态),virStoragePoolDestroy 函数可以用于销毁一个存储池(但并没有释放virStoragePoolPtr 对象,之后还可以用virStoragePoolCreate 函数重新激活它),virStoragePoolDelete 函数可以物理删除一个存储池资源(该操作不可恢复)。

7、事件管理的API:以virEvent开头的一系列函数。

libvirt 支持事件机制,使用该机制注册之后,可以在发生特定的事件(如:域的启动、暂停、恢复、停止等)之时,得到自己定义的一些通知。

8、数据流管理的API:以virStream开头的一系列函数。

libvirt 还提供了一系列函数用于数据流的传输。

与Hypervisor建立连接:

要使用Libvirt API进行虚拟化管理,就必须先建立到Hypervisor的连接,因为有了连接才能管理节点,Hypervisor,域,网络等虚拟化中的要素。

libvirt中连接的标识符URI,其本地URI和远程URI有一些区别。

使用方式:

1、本地URI

在libvirt的客户端使用本地的URI用于连接本地系统范围内的Hypervisor,本地URI的一般格式如下driver[+transport]:///[path][?extral-param]

2、远程URI

除了本地管理,libvirt还提供了非常方便的远程的虚拟化管理功能,libvirt可以使用远程URI来建立到网络上的Hypervisor的连接,远程URI和本地URI也是类似的,只是会增加用户名,主机名,(或IP地址)和连接端口来连接到远程的节点,远程的UPI的一般格式如下drive[+transport]://[user@][host][:port]/[path][?extral-pparam]

3、使用URI建立到Hypervisor的连接

在某个节点启动libvirtd后,一般在客户端都可以通过ssh方式连接到该节点,而TLS和TCP等连接方式却不一定都处于开启可用状态,如RHEL 6.3系统中的libvirtd服务在启动时就没有默认打开TLS和TCP这两种连接方式,而在服务器端的libvirtd打开了TLS和TCP连接方式,也需要一些认证方面的配置,当然也可直接关闭认证功能,可以参考libvirtd,comf配置文件。

四、libvirt工具集介绍

libvirt安装于配置:

libvirt 工具采用 XML 格式的文件描述一个虚拟机特征,包括虚拟机名称、CPU、内存、磁盘、网卡等信息。用户可以通过修改配置文件,对虚拟机进行管理。

StratoVirt 对接 libvirt 之前,需要先配置 XML 文件。本小节介绍 StratoVirt 对接 libvirt 时支持的 XML 配置项以及配置方式。

在介绍libvirt工具集之前我们需要在操作系统中安装libvirt,这样才能使用libvirt相关工具,普通用户使用libvirt只需要安装对应的Linux系统上的libvirt软件包即可,不需要从源码编译安装libvirt,但是一些高级用户或者开发者,可能希望对libvirt有个更多的了解,甚至通过修改libvirt的源代码实现自己的功能。

libvirtd的使用:

libvirt是一个作为libvirt虚拟化管理系统中的服务器端的守护进程,要让某个节点能够利用libvirt进行管理(无论是本地还是远程管理),都需要在这个节点上运行linbvirtd这个守护进程,以便让其他上层管理工具可以连接到该节点,libvirtd负责执行其他管理工具发送给它的虚拟化管理操作指令。而libvirt的客户端工具(包括virsh,virt-manager等)可以连接到本地或远程的libvirtd进程,以便管理节点上的客户机(启动、关闭、重启、迁移),收集节点上的宿主机和客户机的配置和资源使用状态。

libvirtd是一个可执行程序,不仅可以使用“systemctl”命令调用它作为服务来运行,而且可以单独地运行libvirtd命令来使用它。

libvirtd命令行的参数:

1)、-d或--daemon   表示让libvirtd作为守护进程(daemon)在后台运行。

2)、-f或--config FILE   指定libvirtd的配置文件为FILE,而不是使用默认值(通常是/etc/libvirt/libvirtd.conf).

3)、-l或--listen  开启配置文件中配置的TCP/IP连接。

4)、-p或--pid-file FILE  将libvirtd进程的PID写入到FILE文件中,而不是使用默认值。

5)、-t或--timeout SECONEDS  设置对libvirtd连接的超时时间为SECONDS秒。

6)、-v或--verbose  执行命令输出详细的输出信息,特别是在运行出错时,详细的输出信息便于用户查找原因。

virsh:

libvirt项目的源代码中包含了virsh这个虚拟化管理工具的代码,virsh是用于管理虚拟化环境中的客户机和Hypervisor的命令行工具,与virt-manager等工具类似,它也是通过调用libvirt API来实现虚拟化的管理,virsh是完全在命令行文本模式下运行的用户态工具,它是系统管理员通过脚本程序实现虚拟化自动部署和管理的理想工具之一。

在使用virsh命令进行虚拟化管理操作时,可以使用两个工作模式时,可以使用两个工作模式:交互模式和非交互模式,交互模式,是连接到相应的Hypervisor上,然后输入一个命令得到一个返回结构,直到用户使用“quit”命令退出连接,是直接在命令行中一个建立连接的URI之后添加需要执行的一个或多个命令,执行完成后将命令的输出结果返回到当前终端上,然后自动断开连接。

五、实验四实验步骤

1、直接安装带图形化界面的CentOS 7系统,通过VMware创建一台虚拟机,勾选Lntel VT-x或AND-v CPU虚拟化。

2、编写XML配置文件,本次实验的虚拟机配件如下。

3、创建虚拟机硬盘,然后将CentOS 7的镜像上传至系统内,放在xml文件说明的路径内,否则胡报错。

4、创建虚拟机。

5、通过Windows的VNC Vewer客户端连接虚拟机的安装操作界面,这里需要注意的是,需要更改Windows端的VNC Ciewer的颜色配选项,如果不配置对导致连接至虚拟机是闪退。

a、在VNC Vewer客户端窗口,选择“optinos……”----“expert”选项卡。

b、在“expert”选项卡中将Colorl evel的值设置成fgb222。

完成后单机“Connect”按钮进入虚拟机的安装界面。

安装完成后,需要重新配置虚拟机,将虚拟机的开机启动方式改为从硬盘启动,如果不更改,之前的虚拟机XML配置文件中编写的是从cdrom启动,那么在重启之后还会进入安装界面,在此先关闭虚拟机,再重新编写虚拟机。

virsh list

virsh undefine centos 7-1

新的XML配置文件主要是将centos7.xml中的启动盘由cdrom改为hd,否则启动虚拟机后依然会再次执行安装操作系统给的过程,其他没有改变。

重新创建虚拟机并进入:

virshdefine centos 7.xml

virsh list --all

virsh start centos 7-1

通过VNC Viewer连接至虚拟机。

libvirt虚拟化技术介绍相关推荐

  1. 【HCIA】虚拟化技术介绍

    虚拟化技术介绍 虚拟化(Virtualization)的含义很广泛.将任何一种形式的资源抽象成另一种形式的技术都是虚拟化,是资源的一种逻辑表示.解除了物理硬件和操作系统之间的紧耦合关系. •虚拟化是云 ...

  2. 交换机虚拟化和堆叠的区别_网工知识角|一分钟记熟NFV网络功能虚拟化技术介绍...

    点上方蓝字关注,每天都有新收获! 学网络,就在IE-LAB 国内高端网络工程师培养基地 NFV网络功能虚拟化(Network Functions Virtualization),是一种网络架构的概念, ...

  3. 虚拟化技术—— 介绍

    什么是虚拟化 虚拟化是指计算机元件在虚拟的基础上而不是真实的基础上运行.虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程.CPU的虚拟化技术可以单CPU模拟多CPU并行,允许一个平台同时运行多个操 ...

  4. 虚拟化技术之虚拟化技术介绍及Xen的应用实现

    虚拟化技术是什么: 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器.网络.内存及存储等,予以抽象.转换后呈现出来,打破实体结构间的不可切 ...

  5. KVM虚拟化技术介绍及搭建

    目录 前言 一.虚拟化 1.1 虚拟化发展历史 1.2 虚拟化分类 1.2.1 架构分类 1.2.2 虚拟化程度分类 1.3 虚拟化的优势及劣势 1.3.1 优势 1.3.2 劣势 二.KVM 2.1 ...

  6. Xen、OpenVZ、KVM、Hyper-V、VMWare虚拟化技术介绍

    已经迁移:https://www.heguo.org/blog/myweishanli/article/389 国内外vps主机提供商所提供的主机大多是基于Xen.OpenVZ.KVM.Hyper-V ...

  7. haproxy和oracle,IRF虚拟化技术介绍

    ainiyanyan13142007-03-30 22:39 1 编写applet 程序的页面输出 红色的 "hello would !" 2 请编写application 计算并 ...

  8. 虚拟化与网络存储技术:虚拟化技术、Qemu-KVM

    目录 虚拟化技术 一.虚拟化技术分类 二.XEN虚拟化技术简介 XEN虚拟化技术的优缺点: 三.KVM虚拟化技术简介 KVM虚拟化技术的优势 四.红帽RHEV虚拟化系统简介 1.红帽RHEV虚拟化系统 ...

  9. 微软TechEd大会着重宣传其虚拟化技术

    当奥兰多举行的Tech-Ed大会进行到第二周时,微软公司的虚拟化策略成为了会议的重中之重. 在Tech-Ed北美2008IT专家会议上,微软将虚拟化技术介绍给IT专家,同时描绘了一项计划,以在它安全产 ...

最新文章

  1. Linux系统详解 系统的启动、登录、注销与开关机
  2. dataframe筛选数据根据某一个列的数据在另外的一个数组中
  3. 文本挖掘之文本相似度判定
  4. voc定位数据xml转coco数据集格式json
  5. 为内置对象添加原型方法 把局部变量编程全局变量
  6. lamp自动部署工具_salt实现lamp自动化部署
  7. boost电路输出电流公式_boost电路解析
  8. 一道笔试题:贿赂选民
  9. 启动优化 · 基础论 · 浅析Android启动优化
  10. hdu5510 Bazinga(KMP 剪枝) !!
  11. 开源网上商城程序(简介国内外开源网店系统)
  12. SDWebImage第三方库加载图片生硬
  13. `Caché/IRIS` 代码优化效率提升十一条 - 持续更新
  14. DSP TMS320C5509A 控制DDS AD9854芯片进行AM幅度调制时的噪声抑制
  15. css div自适应高度height
  16. 自媒体人必备,5个免费找短视频素材的网站,赶紧收藏
  17. 简述TCP/IP 协议栈
  18. 计算机专业mba申请材料案例,MBA申请材料案例分析–简历中的个人简介 第一篇...
  19. 如何使用CNN进行物体识别和分类_基于CNN目标检测方法(RCNN系列,YOLO,SSD)
  20. 基于数字孪生的管道数字化平台建设要点

热门文章

  1. python计算互信息_Maximal Information Coefficient (MIC)最大互信息系数详解与实现
  2. java员工试用期工作总结
  3. [IPv6] 如何在ASUS無線路由器設定IPv6網際網路?
  4. 《浪矢解忧杂货店》——品味最真实的感动
  5. OctopusWallets(章鱼钱包)是什么
  6. sql server row_number() over(partition by grower_pk order by a.pk_id desc)
  7. 手机闪存速度排行_内置UFS2.1:小米9手机闪存速度测试
  8. 网上找到一个可以用来测试网站安全性能的测试ASP页面
  9. 开学必备好物推荐,电池最耐用的蓝牙耳机分享
  10. 农业温室智能监控系统方案,实现农业自动化的最后一步