易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 5420|回复: 0
收起左侧

OpenStack虚拟机创建过程中镜像格式的的变化过程

[复制链接]
发表于 2016-12-8 22:22:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x

Glance用来作为独立的大规模镜像查找服务,当它与Nova和Swift配合使用时,就为openstack提供了虚拟机镜像的查找服务,像所有的OpenStack项目一样,遵循以下设计思想:

  • 基于组件的架构 - 便于快速增加新特性
  • 高可用性 - 支持大负荷
  • 容错性 - 独立的进程地址空间,避免串行错误
  • 开放标准 - 对社区驱动的API提供参考实现) y  z1 r; S6 N) J6 k

1. Glancle架构

    Glance主要由三个部分构成:glance-api、glance-registry以及image store。

  • Glance-api接收REST API的请求,类似nova-api;
    * ]4 U. L' G. e- @) Q1 w/ d- x/ Y

          Glance-api在功能上与nova-api十分类似,都是接收REST API请求,然后通过其他模块(glance-registry及image store)来完成诸如镜像的查找、获取、上传、删除等操作,i默认监听端

          口9292。

  • glance-registry用于与MySQL数据库交互,用于存储或获取镜像的元数据(metadata);5 L+ r0 q: z, g1 W$ I* p+ q0 i2 F

          Glance-registry用于提供镜像元数据相关的REST接口,通过glance-registry,可以向数据库中写入或获取镜像的各种数据,glance-registry监听端口9191。Glance的数据库中有两张表,

          一张是image表,另一张是image property表。Image表保存了镜像格式、大小等信息;image property表则主要保存镜像的定制化信息。

  • image store是一个存储的接口层,通过这个接口,glance可以获取镜像,image store支持的存储有Amazon的S3、OpenStack本身的Swift,还有诸如ceph,sheepdog,GlusterFS等分布式存储。9 d- F6 R) n& M4 E5 h0 F2 [0 L

          Image store是镜像保存与获取的接口,它仅仅是一个接口层,具体的实现需要外部的存储支持,目前,支持的接口有Amazon S3、GlusterFS、Swift,sheepdog,ceph等。

    Glance体系结构如下图所示,通过glance,OpenStack的三个模块计算组件(nova)、镜像管理组件(glance)、存储组件(swift,ceph,sheepdog等)被连接成一个整体,Glance为Nova提供镜像的查找等操作,而存储组件又为Glance提供了实际的存储服务。而Swift,ceph,gluster,sheepdog等又是Glance存储接口的一些具体实现,Glance的存储接口还能支持S3等第三方的商业组件。

0 [- C( H9 c* r7 d2 k" y; z7 h
                               
登录/注册后可看大图

# ?) [0 v; E& Y8 P& M

2. Openstack创建虚拟机的过程中镜像文件格式的变化过程

   这里通过OpenStack的horizon组件来创建一个m1.small的virtual machine,来详细分析下镜像格式的变化以及glance底层具体执行的哪些操作。

(1)首先看一下Glance管理的镜像,如果采用local storage,glance将镜像文件默认存储到/var/lib/glance/image目录下,这里我们选择c036d689-0336-4fcd-a8e0-4aed4dd5e420这个镜像来作为创建虚拟机的模板,此镜像是通过如下命令添加的,因此在horizon中显示的名称为:Precise x86_64。# `( S+ j2 J  L- q  M7 ]- N- i

  • glance add name="Precise x86_64" is_public=true
  • container_format=ovf disk_format=qcow2
  • < ubuntu-12.04-server-cloudimg-amd64-disk1.img
    ! E- w- p* d( E+ {, [
$ m7 p6 h; W1 }
    • ubuntu@compute-63-02:/var/lib/glance/images$ ll -alh
    • total 2.5G
    • drwxr-xr-x 2 glance glance 4.0K Jan 30 01:30 ./
    • drwxr-xr-x 6 glance glance 4.0K Dec 27 21:11 ../
    • -rw-r----- 1 glance glance 768M Dec 27 04:31 5b298155-8bcf-442f-bc83-bc52f3fe5be9
    • -rw-r----- 1 glance glance 712M Jan 30 01:31 8760d55b-0d91-4987-8980-d6659c7856ab
    • -rw-r----- 1 glance glance 223M Dec 25 03:58 c036d689-0336-4fcd-a8e0-4aed4dd5e420
    • -rw-r----- 1 glance glance 768M Dec 27 04:44 d771b2ce-9310-4757-8ec5-d80f8d1e1712
      ; u  S1 }2 b* H* {1 h5 t. T) `: w
    . b1 S5 j, _% s1 S; [
    通过qemu-img info命令,先看一下镜像文件的大小和格式如下:' l( L0 C6 K3 H% y5 u' Y
    • ubuntu@compute-63-02:/var/lib/glance/images$ sudo qemu-img info c036d689-0336-4fcd-a8e0-4aed4dd5e420
    • image: c036d689-0336-4fcd-a8e0-4aed4dd5e420
    • file format: qcow2                                       //qcow2格式的镜像
    • virtual size: 2.0G (2147483648 bytes)                    //镜像文件大小的上限为2G,实际使用了223M
    • disk size: 223M
    • cluster_size: 65536
      ( b9 Z; N' R2 Y( D3 }% K4 d
    , X3 h7 L% S0 p; s4 _
    (2)通过horizon创建m1.small(具体配置为:1vcpu,2G memory,10G root disk,20G extra volume)的virtual machine
  •       新创建的虚拟机存放在/var/lib/nova/instances目录下,该目录的大体结构如下:
    • ubuntu@compute-63-12:/var/lib/nova/instances$ ll
    • total 32
    • drwxr-xr-x 8 nova nova 4096 Feb 28 21:39 ./
    • drwxr-xr-x 10 nova nova 4096 Dec 25 01:07 ../
    • drwxrwxr-x 2 nova nova 4096 Feb 28 21:39 _base/                    //相当于镜像文件的cache目录,在此host上创建的所有的vm,都会先cacha到这里
    • drwxrwxr-x 2 nova nova 4096 Jan 8 05:56 instance-00000022/         //instance-xxxxx新创建的虚拟机
    • drwxrwxr-x 2 nova nova 4096 Feb 28 03:40 instance-00000034/
    • drwxrwxr-x 2 nova nova 4096 Feb 28 04:02 instance-00000037/
    • drwxrwxr-x 2 nova nova 4096 Feb 28 21:39 instance-0000003a/
    • drwxrwxr-x 2 nova nova 4096 Jan 30 01:30 snapshots/                 //此host上虚拟机对应的快照文件
      5 F. \9 P- ]4 G
    . ?1 ]5 t7 I5 u" y6 K8 U0 K$ w
  •   通过查看nova-compute.log可以看到vm创建过程中,镜像文件格式的变化过程,下面总结了下,具体参见下图。
        从glance中得知,有个virtual size =2G的qcow2格式的镜像文件Precise x86_64,它在glance中的ID=c036d689-0336-4fcd-a8e0-4aed4dd5e420
  • 当Nova Compute接收到vm创建的请求时,通过以下步骤完成一个VM的创建过程:
  •   
  • (1)步:
  •     从vm的描述文件中获得所使用的image文件的ID,然后向Glance发起索取image文件的HTTP请求,结果是image文件从Glance的存储节点下载到发起请求的host机器上,即:/var/lib/nova/instances/_base目录下:! b) a3 j! s7 w# L* o7 F+ q
    • ubuntu@compute-63-11:/var/lib/nova/instances/_base$ ll -alh
    • total 4.0G
    • drwxrwxr-x 2 nova nova 4.0K Feb 28 21:39 ./
    • drwxr-xr-x 8 nova nova 4.0K Feb 28 21:39 ../
    • -rw-r--r-- 1 nova kvm 2.0G Mar 1 02:06 d265f9d66b8be65448e6c9147a83d65a300e1852
    • -rw-r--r-- 1 nova kvm 10G Mar 1 02:06 d265f9d66b8be65448e6c9147a83d65a300e1852_10
    • -rw-rw-r-- 1 nova nova 223M Feb 28 03:17 d265f9d66b8be65448e6c9147a83d65a300e1852.part
    • -rw-r--r-- 1 nova nova 20G Feb 28 04:01 ephemeral_0_20_None
    • -rw-r--r-- 1 libvirt-qemu kvm 20G Feb 28 04:01 ephemeral_0_20_None_20
    • -rw-r--r-- 1 nova nova 40G Feb 28 21:39 ephemeral_0_40_None
    • -rw-r--r-- 1 libvirt-qemu kvm 40G Feb 28 21:39 ephemeral_0_40_None_402 T. B: w, u, }8 v
    / B1 {3 E& O9 N3 V
    即从:c036d689-0336-4fcd-a8e0-4aed4dd5e420 ---> d265f9d66b8be65448e6c9147a83d65a300e1852.part
  • 通过qemu-img info,可以发现d265f9d66b8be65448e6c9147a83d65a300e1852.part仍为qcow2格式的镜像,且大小与glance上的大小一致。
    • ubuntu@compute-63-11:/var/lib/nova/instances/_base$ sudo qemu-img info d265f9d66b8be65448e6c9147a83d65a300e1852.part
    • image: d265f9d66b8be65448e6c9147a83d65a300e1852.part
    • file format: qcow2
    • virtual size: 2.0G (2147483648 bytes)
    • disk size: 223M
    • cluster_size: 65536
      , s9 b% ~& A& _; B& Q2 F% T. V  M
    5 a! [% I, H  M6 D+ n; g7 H
    (2)步:
  •       镜像下载成功后,openstack先去判断image文件的类型是否为qcow2,如果是,则现将其转化为raw格式,否则,直接进入(3)
  •       这里通过qemu-img convert命令,将qcow2格式转化为raw格式,转化完的镜像为:d265f9d66b8be65448e6c9147a83d65a300e1852,通过qemu-imag info查看其information。3 h  {9 q# H# Z0 i9 U
    • ubuntu@compute-63-11:/var/lib/nova/instances/_base$ sudo qemu-img info d265f9d66b8be65448e6c9147a83d65a300e1852
    • image: d265f9d66b8be65448e6c9147a83d65a300e1852
    • file format: raw
    • virtual size: 2.0G (2147483648 bytes)
    • disk size: 659M
      * }4 Y. {& i* f. l9 i% p
    / J2 ]& F4 F/ f
    (3)(4)两步:
  •      由于所请求的vm的类型为m1.small,其root disk的大小为10G,所以需要resize image fille to 10G。
  •     这里比较奇怪的是,在resize之前,openstack会将d265f9d66b8be65448e6c9147a83d65a300e1852拷贝一份d265f9d66b8be65448e6c9147a83d65a300e1852_10,然后对d265f9d66b8be65448e6c9147a83d65a300e1852_10进行resize操作,将其变成10G的raw,这可能与vm的备份有关,暂时还没有理解为什么这么做。
    & M: n0 v+ h3 m
    • cp /var/lib/nova/instances/_base/d265f9d66b8be65448e6c9147a83d65a300e1852 /var/lib/nova/instances/_base/d265f9d66b8be65448e6c9147a83d65a300e1852_10 (raw-->raw 2G-->2G)
    • qemu-img resize /var/lib/nova/instances/_base/d265f9d66b8be65448e6c9147a83d65a300e1852_10 10737418240 (raw--> raw 2G -->10G)# M& Y1 B7 Q. ?
    6 m8 b! q$ K; @6 T- G# c1 I
    (5) 步:
  •     以(3)中创建的d265f9d66b8be65448e6c9147a83d65a300e1852_10作为base创建qcow2格式的overlay,可以理解为以d265f9d66b8be65448e6c9147a83d65a300e1852_10为base,创建了一个快照disk,具体看对应虚拟机目录下的文件:
    , t5 U2 S7 ]/ K: s* j
    • ubuntu@compute-63-12:/var/lib/nova/instances/instance-0000003a$ ll -alh
    • total 417M
    • drwxrwxr-x 2 nova nova 4.0K Feb 28 21:39 ./
    • drwxr-xr-x 8 nova nova 4.0K Feb 28 21:39 ../
    • -rw-rw---- 1 libvirt-qemu kvm 23K Feb 28 21:40 console.log
    • -rw-r--r-- 1 libvirt-qemu kvm 417M Mar 1 02:36 disk
    • -rw-r--r-- 1 libvirt-qemu kvm 576K Mar 1 01:35 disk.local
    • -rw-rw-r-- 1 nova nova 1.6K Feb 28 21:38 libvirt.xml! ^% Q/ f7 D9 Y& z
    3 T8 J7 K* t) x! f" N
    现在来总结下镜像文件的变化过程:
  • c036d689-0336-4fcd-a8e0-4aed4dd5e420    (223M -- qcow2)
  •      -->d265f9d66b8be65448e6c9147a83d65a300e1852.part   (223M -- qcow2)
    % g5 Z- u! ~8 X$ G3 d: N
  •            --> d265f9d66b8be65448e6c9147a83d65a300e1852      (2G -- raw)
  • -->d265f9d66b8be65448e6c9147a83d65a300e1852_10   (10G -- raw)
  •                       --> disk    (417M -- qcow2)5 u% v- W: Z! r0 R

3. cache机制

   如果之后创建的vm的类型也是m1.small,并且是同一个image,将不会再去glance下载image文件,而是直接利用本地_base下的d265f9d66b8be65448e6c9147a83d65a300e1852_10来直接创建vm的disk文件,大大减少的vm的部署时间。

7 c9 g. V" D) k0 _5 q2 Z
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-9 00:31 , Processed in 0.063846 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表