OpenStack虚拟机创建过程中镜像格式的的变化过程
Glance用来作为独立的大规模镜像查找服务,当它与Nova和Swift配合使用时,就为OpenStack提供了虚拟机镜像的查找服务,像所有的OpenStack项目一样,遵循以下设计思想:
- 基于组件的架构 - 便于快速增加新特性
- 高可用性 - 支持大负荷
- 容错性 - 独立的进程地址空间,避免串行错误
- 开放标准 - 对社区驱动的API提供参考实现
1. Glancle架构
Glance主要由三个部分构成:glance-api、glance-registry以及image store。
- Glance-api接收REST API的请求,类似nova-api;
Glance-api在功能上与nova-api十分类似,都是接收REST API请求,然后通过其他模块(glance-registry及image store)来完成诸如镜像的查找、获取、上传、删除等操作,i默认监听端
口9292。
- glance-registry用于与MySQL数据库交互,用于存储或获取镜像的元数据(metadata);
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等分布式存储。
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等第三方的商业组件。

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。
- glance add name="Precise x86_64" is_public=true
- container_format=ovf disk_format=qcow2
- < ubuntu-12.04-server-cloudimg-amd64-disk1.img
- 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
通过qemu-img info命令,先看一下镜像文件的大小和格式如下:
- 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
(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上虚拟机对应的快照文件
通过查看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目录下:
- 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_40
即从: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
(2)步:
- 镜像下载成功后,openstack先去判断image文件的类型是否为qcow2,如果是,则现将其转化为raw格式,否则,直接进入(3)
- 这里通过qemu-img convert命令,将qcow2格式转化为raw格式,转化完的镜像为:d265f9d66b8be65448e6c9147a83d65a300e1852,通过qemu-imag info查看其information。
- 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
(3)(4)两步:
- 由于所请求的vm的类型为m1.small,其root disk的大小为10G,所以需要resize image fille to 10G。
- 这里比较奇怪的是,在resize之前,openstack会将d265f9d66b8be65448e6c9147a83d65a300e1852拷贝一份d265f9d66b8be65448e6c9147a83d65a300e1852_10,然后对d265f9d66b8be65448e6c9147a83d65a300e1852_10进行resize操作,将其变成10G的raw,这可能与vm的备份有关,暂时还没有理解为什么这么做。
- 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)
(5) 步:
- 以(3)中创建的d265f9d66b8be65448e6c9147a83d65a300e1852_10作为base创建qcow2格式的overlay,可以理解为以d265f9d66b8be65448e6c9147a83d65a300e1852_10为base,创建了一个快照disk,具体看对应虚拟机目录下的文件:
- 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
现在来总结下镜像文件的变化过程:
- c036d689-0336-4fcd-a8e0-4aed4dd5e420 (223M -- qcow2)
- -->d265f9d66b8be65448e6c9147a83d65a300e1852.part (223M -- qcow2)
- --> d265f9d66b8be65448e6c9147a83d65a300e1852 (2G -- raw)
- -->d265f9d66b8be65448e6c9147a83d65a300e1852_10 (10G -- raw)
- --> disk (417M -- qcow2)
3. cache机制
如果之后创建的vm的类型也是m1.small,并且是同一个image,将不会再去glance下载image文件,而是直接利用本地_base下的d265f9d66b8be65448e6c9147a83d65a300e1852_10来直接创建vm的disk文件,大大减少的vm的部署时间。
OpenStack虚拟机创建过程中镜像格式的的变化过程的更多相关文章
- 虚拟机创建流程中neutron代码分析(三)
前言: 当neutron-server创建了port信息,将port信息写入数据库中.流程返回到nova服务端,接着nova创建的流程继续走.在计算节点中neutron-agent同样要完成很多的工作 ...
- 虚拟机创建流程中neutron代码分析(一)
前言: 在openstack的学习当中有一说法就是网络占学习时间的百分之七十.这个说法或许有夸大的成分,但不可否认的是openstack中的 网络是及其重要的部分,并且难度也是相当大.试图通过nova ...
- 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(4)
六.Libvirt 对于Libvirt,在启动虚拟机之前,首先需要define虚拟机,是一个XML格式的文件 列出所有的Instance # virsh list Id Name ...
- 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(5)
八.KVM 这一步,像virsh start命令一样,将虚拟机启动起来了.虚拟机启动之后,还有很多的步骤需要完成. 步骤38:从DHCP Server获取IP 有时候往往数据库里面,VM已经有了IP, ...
- 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(3)
四.Nova-compute 步骤17:nova-compute接收到请求后,通过Resource Tracker将创建虚拟机所需要的资源声明占用 步骤18:调用Neutron API配置Networ ...
- 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(1)
还是先上图吧,无图无真相 别以为真懂Openstack!先别着急骂我,我也没有说我真懂Openstack 我其实很想弄懂Openstack,然而从哪里下手呢?作为程序员,第一个想法当然是代码,Code ...
- 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(2)
二.nova-api 步骤3:nova-api接收请求 nova-api接收请求,也不是随便怎么来都接收的,而是需要设定rate limits,默认的实现是在ratelimit的middleware里 ...
- Openstack虚拟机创建流程
续上一篇Openstack安装配置 一,keystone交互认证阶段 1,发送用户名和密码给keystone认证获取token 2,带着token访问nova-api 3,nova-api使用toke ...
- 虚拟机创建流程中neutron代码分析(二)
前言: 当nova服务发送了创建port的restful调用信息之后,在neutron服务中有相应的处理函数来处理调用.根据restful的工作原理,是按照 paste.ini文件中配置好的流程去处理 ...
随机推荐
- Java中常见数据结构
1:集合 Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector 底层数据结构是数组,查询快,增删慢 线程 ...
- 学习spring2--跟我一起学Spring 3(3)–使用Spring开发第一个HelloWorld应用
http://www.importnew.com/13246.html 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 - 首页 所有文章 资讯 ...
- c 编译异常 switch 之a label can only be part of a statement and a declaration is not a statement
client.c:996: error: a label can only be part of a statement and a declaration is not a statement sw ...
- dm8148 开发之---互斥量、条件量、枷锁、互斥枷锁
int OSA_semCreate(OSA_SemHndl *hndl, Uint32 maxCount, Uint32 initVal){ pthread_mutexattr_t mutex_att ...
- websocket数据流解析
ceilometer获取数据暂时先不做解答,本篇注重websocket解决浏览器与openstack组件之间的实时状态更新. 大致流程如下: nginx配置的反向代理如下: /etc/nginx/ng ...
- android自定义View_3——Optimizing the View
前言:现在你已经有了一个自定义的view了,并且支持手势和过度动画等属性,现在你要确认这个view 有够快的速度,为了使其在UI上不会显得迟钝或是卡停,你要保证view动画,能每秒最好有60帧. 一: ...
- SQL.Cookbook 读书笔记2 查询结果排序
第二章 查询结果排序 2.1 按查询字段排序 order by sal asc; desc;-- 3表示sal 2.2 按子串查询 );--按job的最后两个字符排序 2.3 对字符数字混合排序 cr ...
- NoSQL-MongoDB with python
前言: MongoDB,文档存储型数据库(document store).NoSQL数据库中,它独占鳌头,碾压其他的NoSQL数据库. 使用C++开发的,性能仅次C.与redis一样,开源.高扩展.高 ...
- 【BZOJ1912】[Apio2010]patrol 巡逻 树形DP
[BZOJ1912][Apio2010]patrol 巡逻 Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示 ...
- 【BZOJ1923】[Sdoi2010]外星千足虫 高斯消元
[BZOJ1923][Sdoi2010]外星千足虫 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 ...