9.1 libvirt与openstack


9.1.1 libvirt的基本概念

在前面的1-7章,我们分析了kvm的虚拟化原理与技术实现;第8章则分析了qemu的虚拟机的管理。在云环境下:

(1)不同的服务可能构建在不同的虚拟机实现上如kvm和xen,vmare等;因而上层就需要对不同的虚拟化技术调用不同管理工具。

(2) 对同一种类别的虚拟机,由于虚拟化技术的升级或宿主环境的变化,导致虚拟机需要的迁移。

计算机科学中解决该问题的方法就是增加一个虚拟机的抽象层; 将上层应用与底层虚拟机控制隔离开来;而libvirt  libvirt就是扮演的这个角色。有了它,上面两个问题就迎刃而解。libvirt提供各种API,供上层来管理不同的虚拟机。  Libvirt是管理虚拟机和其他虚拟化功能,比如存储管理,网络管理的软件集合。它包括一个API库,一个守护程序(libvirtd)和一个命令行工具(virsh);libvirt本身构建于一种抽象的概念之上。它为受支持的虚拟机监控程序实现的常用功能提供通用的API。    libvirt库用C(支持 C++)实现,且包含对Python的直接支持。不过它还支持大量语言绑定。目前已经对Ruby、Java语言,Perl和 OCaml实施了绑定。libvirt支持最流行的系统编程语言(C和C++)、多种脚本语言。Libvirt主要支持的功能:

    a.虚拟机管理:包括不同的领域生命周期操作,比如:启动、停止、暂停、保存、恢复和迁移。支持多种设备类型的热插拔操作,包括:磁盘、网卡、内存和CPU。
    b.远程机器支持:只要机器上运行了libvirt daemon,包括远程机器,所有的libvirt功能就都可以访问和使用。支持多种网络远程传输,使用最简单的SSH,不需要额外配置工作。
    c.存储管理:任何运行了libvirt daemon的主机都可以用来管理不同类型的存储:创建不同格式的文件镜像(qcow2、vmdk、raw等)、挂接NFS共享、列出现有的LVM卷组、创建新的LVM卷组和逻辑卷、对未处理过的磁盘设备分区、挂接iSCSI共享,等等。因为libvirt可以远程工作,所有这些都可以通过远程主机使用。
    d.网络接口管理:任何运行了libvirt daemon的主机都可以用来管理物理和逻辑的网络接口。
    e.虚拟NAT和基于路由的网络:任何运行了libvirt daemon的主机都可以用来管理和创建虚拟网络。

 下面是使用virtsh的查看本地虚拟机运行列表一个示例:

 virsh -cqemu+ss://root@192.168.128.1.31/system "list"

 

libvirtd 是libvirt虚拟机管理系统中的服务器端守护程序,上层管理工具(virtsh, virt-manager等)先将请求提交到libvirtd,然后由libvirtd发送虚拟化管理指令。

 

libvirt采用xml来管理虚拟机的配置,如qemu的配置默认存在/ect/libvirt/qemu 中,下面是一个xml文件的示例:

 

<domaintype='kvm'>

  <name>ubuntu-1</name>

 <uuid>0b9aa5de-59fb-4e81-a79e-69976fa54bf6</uuid>

  <memory unit='KiB'>1048576</memory>

  <currentMemoryunit='KiB'>1048576</currentMemory>

  <vcpu placement='static'>2</vcpu>//cpu设置

  <os>

    <type arch='x86_64'machine='pc-i440fx-utopic'>hvm</type>

    <boot dev='hd'/>

  </os>

  <features>

    <acpi/>

    <apic/>

    <pae/>

  </features>

  <cpu mode='custom' match='exact'>

    <modelfallback='allow'>Nehalem</model>

  </cpu>

  <clock offset='utc'> //虚拟时钟设置

    <timer name='rtc'tickpolicy='catchup'/>

    <timer name='pit'tickpolicy='delay'/>

    <timer name='hpet' present='no'/>

  </clock>

 <on_poweroff>destroy</on_poweroff> //突发事件处理

  <on_reboot>restart</on_reboot>

  <on_crash>restart</on_crash>

  <pm>

    <suspend-to-mem enabled='no'/>

    <suspend-to-disk enabled='no'/>

  </pm>

  <devices>

    <emulator>/usr/bin/kvm-spice</emulator>

    <disk type='file' device='disk'>//block设备信息

      <driver name='qemu' type='raw'/>

      <source file='/mnt/ubuntu1.img'/>

      <target dev='hda' bus='ide'/>

      <address type='drive' controller='0'bus='0' target='0' unit='0'/>

    </disk>

    <controller type='usb' index='0'model='ich9-ehci1'> //usb 控制器

      <address type='pci' domain='0x0000'bus='0x00' slot='0x05' function='0x7'/>

    </controller>

    <controller type='usb' index='0'model='ich9-uhci1'>

      <master startport='0'/>

      <address type='pci' domain='0x0000'bus='0x00' slot='0x05' function='0x0' multifunction='on'/>

    </controller>

     。。。。。。。。。。。

    <controller type='pci' index='0'model='pci-root'/>

    <controller type='ide' index='0'>

      <address type='pci' domain='0x0000'bus='0x00' slot='0x01' function='0x1'/>

    </controller>

    <controller type='virtio-serial'index='0'>

      <address type='pci' domain='0x0000'bus='0x00' slot='0x06' function='0x0'/>

    </controller>

    <interface type='network'> //网路设置

      <mac address='52:54:00:3f:5c:51'/>

      <source network='default'/>

      <model type='rtl8139'/>

      <address type='pci' domain='0x0000'bus='0x00' slot='0x03' function='0x0'/>

    </interface>

    <serial type='pty'>

      <target port='0'/>

    </serial>

    <console type='pty'>

      <target type='serial' port='0'/>

    </console>

    <channel type='spicevmc'>

      <target type='virtio'name='com.redhat.spice.0'/>

      <address type='virtio-serial'controller='0' bus='0' port='1'/>

    </channel>

    <input type='mouse' bus='ps2'/>

    <input type='keyboard' bus='ps2'/>

    <graphics type='spice'autoport='yes'/>

    <sound model='ich6'>

      <address type='pci' domain='0x0000'bus='0x00' slot='0x04' function='0x0'/>

    </sound>

    <video>

      <model type='qxl' ram='65536'vram='65536' heads='1'/>

      <address type='pci' domain='0x0000'bus='0x00' slot='0x02' function='0x0'/>

    </video>

    <memballoon model='virtio'>

      <address type='pci' domain='0x0000'bus='0x00' slot='0x07' function='0x0'/>

    </memballoon>

  </devices>

</domain>

 

 

9.1.2 libvirt 模型与示例

用户可以采用libvirt提供的api来开发自己的客户端管理工具,下面是一个简单的例子:

#include <stdio.h>

#include<libvirt/libvirt.h>

 

void getDomainInfo(int id)

{

    virConnectPtr conn = NULL;

    virDomainPtr dom = NULL;

        virDomainInfo info;

   

    conn = virConnectOpenReadOnly(NULL);   //建立连接

    if (conn == NULL) {

       printf("failed to connect hypervisort\n");

       goto exit;

    }

 

    dom = virDomainLookupByID(conn, id); //根据domain id查账domain

    if (dom == NULL) {

       printf("failed to get domain\n");

       goto exit;

    }

 

    if (virDomainGetInfo(dom, &info) < 0) { //取得domain信息

       printf("failed to get domaininfo\n");

       goto exit;

    }

 

    printf("vCput:%d\n", info.nrVirtCpu); //打印该domain的vcpu个数

exit:

    if (dom != NULL)

       virDomainFree(dom);

    if (conn != NULL)

       virConnectClose(conn);  

   

}

 

int main(int argc, char **argv) {

    getDomainInfo(3); //取虚拟机的domain信息,id=3

}

gcc l test.c -o getdominfo-lvirt

 

高级libvirt API可划分为5个API部分:虚拟机监控程序连接API、域API、网络API、存储卷API、存储池API.

 在libvirt中,连接是系统中的每一个动作和对象的基础。每一个实体,要与libvirt互相作用,应用virsh, virt-manager或者使用libvirt库,都需要首先获得一个到主机上libvirt守护进程的连接。链接是与特定的hypervisor相关联的,它可能与libvirt客户端程序同时运行在本地的一个节点上,也可能通过网络连接到远程的机器上。通常情况下,链接由virConnectPtr对象代表,并且由一个URI来定义。 一个libvirt代理程序要做的第一件事就是调用libvirt连接函数获得virConnectPtr句柄。在后续的操作中,该句柄作为所有其他管理功能的基础。

   域API用于虚拟机管理,包括创建,启动,停用,迁移,动态修改配置等。进入虚拟机监控程序后,便可以使用一组 API 调用函数重复使用该虚拟机监控程序上的各种资源。API实现大量针对域的函数。要探究或管理域,首先需要一个virDomainPtr对象。您可通过多种方式获得该句柄(使用ID、UUID或域名)。域可以指任何正在运行的虚拟机或者是可以用来启动虚拟机的配置。链接对象提供了API用来枚举域、创建新域和管理现有域。域用virDomainPtr对象来表示,并有自己唯一的标示符。 Libvirt能够控制域的整个生命周期。域可以在它的整个生命周期的几个状态之间进行转换:

    Undefined这是一个基本的状态。任何没有定义或者没有建立的域的状态。

    Defined这是一个域已定义但是没有运行的状态。这种状态也可以被描述为停止。

    Running这是一个已经定义并运行在一个hypervisor上面的域的状态。

    Paused这个状态是形容一个域系统从运行状态转换为暂停状态。它的内存镜像已经被暂时地存储,它可以恢复到运行状态

 

libvirt 中的存储管理独立于虚拟机管理。也就是存储池和存储卷的操作独立于虚拟机的操作存在,因此进行存储管理时,不需要有虚拟机的存在,可以当虚拟机需要存储资源时再进行分配,非常灵活

  为了将不同的后端存储设备以统一的接口供虚拟机使用,libvirt 将存储管理分为两个方面:存储卷 (volume) 和存储池 (pool)。存储卷是一种可以分配给虚拟机使用的存储设备。在虚拟机中与一个挂载点对应,而物理上可以是一个虚拟机磁盘文件或一个真实的磁盘分区。

存储池是一种可以从中生成存储卷的存储资源,后端可以支持以下存储介质:

·        目录池:以主机的一个目录作为存储池,这个目录中包含文件的类型可以为各种虚拟机磁盘文件、镜像文件等。

·        本地文件系统池:使用主机已经格式化好的块设备作为存储池,支持的文件系统类型包括 ext2,ext3,vfat 等。

·        网络文件系统池:使用远端网络文件系统服务器的导出目录作为存储池。默认为 NFS 网络文件系统。

·        逻辑卷池:使用已经创建好的 LVM 卷组,或者提供一系列生成卷组的源设备,libvirt 会在其上创建卷组,生成存储池。

·        磁盘卷池:使用磁盘作为存储池。

·        iSCSI 卷池:使用 iSCSI 设备作为存储池。

·        SCSI 卷池:使用 SCSI 设备作为存储池。

下面是一个简单的使用例子:

a. 定义存储池

<pool type="logical">

 <name>lvm_pool</name>

 <source>

 <device path="/dev/sdc1"/>

 <device path="/dev/sdc2"/>

 </source>

 <target>

 <path>/lvm_pool</path>

 </target>

 </pool>

 

virsh pool-define /etc/libvirt/storage/lvm_pool.xml

 

b. 建立存储池

virsh pool-build lvm_pool

 

c.开始存储池

virsh pool-start lvm_pool

 

d. 从存储池中分配卷

virsh vol-create-as --pool lvm_pool --name vol3 --capacity 30M

 

e.虚拟机使用卷

virsh attach-disk – domain dom1 – -source /dev/pic_pool2/vol1 – -target sda

 

9.1.3 OpenStack 与libvirt

OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件开放源代码项目。

OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成。

OpenStack覆盖了网络、虚拟化、操作系统、服务器等各个方面。它是一个正在开发中的云计算平台项目,根据成熟及重要程度的不同,被分解成核心项目、孵化项目,以及支持项目和相关项目。每个项目都有自己的委员会和项目技术主管,而且每个项目都不是一成不变的,孵化项目可以根据发展的成熟度和重要性,转变为核心项目。截止到Icehouse版本,下面列出了10个核心项目(即OpenStack服务)。

计算(Compute):Nova。一套控制器,用于为单个用户或使用群组管理虚拟机实例的整个生命周期,根据用户需求来提供虚拟服务。负责虚拟机创建、开机、关机、挂起、暂停、调整、迁移、重启、销毁等操作,配置CPU、内存等信息规格。 关于虚拟机管理的模块是virt; libvirt就是其中的一个包。

对象存储(Object Storage):Swift。一套用于在大规模可扩展系统中通过内置冗余及高容错机制实现对象存储的系统,允许进行存储或者检索文件。可为Glance提供镜像存储,为Cinder提供卷备份服务。自Austin版本集成到项目中

镜像服务(Image Service):Glance。一套虚拟机镜像查找及检索系统,支持多种虚拟机镜像格式(AKI、AMI、ARI、ISO、QCOW2、Raw、VDI、VHD、VMDK),有创建上传镜像、删除镜像、编辑镜像基本信息的功能。自Bexar版本集成到项目中。

身份服务(Identity Service):Keystone。为OpenStack其他服务提供身份验证、服务规则和服务令牌的功能,管理Domains、Projects、Users、Groups、Roles。自Essex版本集成到项目中。

网络&地址管理(Network):Neutron。提供云计算的网络虚拟化技术,为OpenStack其他服务提供网络连接服务。为用户提供接口,可以定义Network、Subnet、Router,配置DHCP、DNS、负载均衡、L3服务,网络支持GRE、VLAN。插件架构支持许多主流的网络厂家和技术,如OpenvSwitch。自Folsom版本集成到项目中。

块存储 (Block Storage):Cinder。为运行实例提供稳定的数据块存储服务,它的插件驱动架构有利于块设备的创建和管理,如创建卷、删除卷,在实例上挂载和卸载卷。自Folsom版本集成到项目中。

UI 界面 (Dashboard):Horizon。OpenStack中各种服务的Web管理门户,用于简化用户对服务的操作,例如:启动实例、分配IP地址、配置访问控制等。自Essex版本集成到项目中。

测量 (Metering):Ceilometer。像一个漏斗一样,能把OpenStack内部发生的几乎所有的事件都收集起来,然后为计费和监控以及其它服务提供数据支撑。自Havana版本集成到项目中。

部署编排 (Orchestration):Heat[2] 。提供了一种通过模板定义的协同部署方式,实现云基础设施软件运行环境(计算、存储和网络资源)的自动化部署。自Havana版本集成到项目中。

数据库服务(Database Service):Trove。为用户在OpenStack的环境提供可扩展和可靠的关系和非关系数据库引擎服务。自Icehouse版本集成到项目中。

 

下一节将分析libvirt 如何控制qemu。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值