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

本文介绍OpenStack Glance组件的功能与架构,包括glance-api、glance-registry及imagestore的工作原理。同时,详细解析了在创建虚拟机过程中镜像格式的变化,以及OpenStack如何利用缓存机制提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。

  1. glance add name="Precise x86_64" is_public=true  container_format=ovf disk_format=qcow2  < ubuntu-12.04-server-cloudimg-amd64-disk1.img
    1. ubuntu@compute-63-02:/var/lib/glance/images$ ll -alh
    2. total 2.5G
    3. drwxr-xr-x 2 glance glance 4.0K Jan 30 01:30./
    4. drwxr-xr-x 6 glance glance 4.0K Dec 27 21:11../
    5. -rw-r----- 1 glance glance 768M Dec 27 04:31 5b298155-8bcf-442f-bc83-bc52f3fe5be9
    6. -rw-r----- 1 glance glance 712M Jan 30 01:31 8760d55b-0d91-4987-8980-d6659c7856ab
    7. -rw-r----- 1 glance glance 223M Dec 25 03:58 c036d689-0336-4fcd-a8e0-4aed4dd5e420
    8. -rw-r----- 1 glance glance 768M Dec 27 04:44 d771b2ce-9310-4757-8ec5-d80f8d1e1712
    通过qemu-img info命令,先看一下镜像文件的大小和格式如下:
    1. ubuntu@compute-63-02:/var/lib/glance/images$ sudo qemu-imginfo c036d689-0336-4fcd-a8e0-4aed4dd5e420
    2. image: c036d689-0336-4fcd-a8e0-4aed4dd5e420
    3. file format: qcow2                                      //qcow2格式的镜像
    4. virtual size: 2.0G(2147483648 bytes)                    //镜像文件大小的上限为2G,实际使用了223M
    5. disk size: 223M
    6. cluster_size: 65536
    (2)通过horizon创建m1.small(具体配置为:1vcpu,2G memory,10G root disk,20G extra volume的virtual machine。新创建的虚拟机存放在/var/lib/nova/instances目录下,该目录的大体结构如下:
    1. ubuntu@compute-63-12:/var/lib/nova/instances$ ll
    2. total 32
    3. drwxr-xr-x 8 nova nova 4096 Feb 28 21:39./
    4. drwxr-xr-x 10 nova nova 4096Dec 25 01:07../
    5. drwxrwxr-x 2 nova nova 4096 Feb 28 21:39 _base/                    //相当于镜像文件的cache目录,在此host上创建的所有的vm,都会先cache到这里
    6. drwxrwxr-x 2 nova nova 4096 Jan 8 05:56 instance-00000022/         //instance-xxxxx新创建的虚拟机
    7. drwxrwxr-x 2 nova nova 4096 Feb 28 03:40 instance-00000034/         
    8. drwxrwxr-x 2 nova nova 4096 Feb 28 04:02 instance-00000037/
    9. drwxrwxr-x 2 nova nova 4096 Feb 28 21:39 instance-0000003a/
    10. drwxrwxr-x 2 nova nova 4096 Jan 30 01:30 snapshots/                 //此host上虚拟机对应的快照文件
  1.   通过查看nova-compute.log可以看到vm创建过程中,镜像文件格式的变化过程,下面总结了下,具体参见下图。

        从glance中得知,有个virtual size =2G的qcow2格式的镜像文件Precise x86_64,它在glance中的ID=c036d689-0336-4fcd-a8e0-4aed4dd5e420

  2.   当Nova Compute接收到vm创建的请求时,通过以下步骤完成一个VM的创建过程:
  3.   
  4. (1)步:
  5.     从vm的描述文件中获得所使用的image文件的ID,然后向Glance发起索取image文件的HTTP请求,结果是image文件从Glance的存储节点下载到发起请求的host机器上,即:/var/lib/nova/instances/_base目录下:
    1. ubuntu@compute-63-11:/var/lib/nova/instances/_base$ ll-alh
    2. total 4.0G
    3. drwxrwxr-x 2 nova nova 4.0K Feb 28 21:39./
    4. drwxr-xr-x 8 nova nova 4.0K Feb 28 21:39../
    5. -rw-r--r-- 1 nova kvm 2.0G Mar 1 02:06 d265f9d66b8be65448e6c9147a83d65a300e1852
    6. -rw-r--r-- 1 nova kvm 10G Mar 1 02:06 d265f9d66b8be65448e6c9147a83d65a300e1852_10
    7. -rw-rw-r-- 1 nova nova 223M Feb 28 03:17 d265f9d66b8be65448e6c9147a83d65a300e1852.part
    8. -rw-r--r-- 1 nova nova 20G Feb 28 04:01 ephemeral_0_20_None
    9. -rw-r--r-- 1 libvirt-qemu kvm 20G Feb 28 04:01 ephemeral_0_20_None_20
    10. -rw-r--r-- 1 nova nova 40G Feb 28 21:39 ephemeral_0_40_None
    11. -rw-r--r-- 1 libvirt-qemu kvm 40G Feb 28 21:39 ephemeral_0_40_None_40
    即从:c036d689-0336-4fcd-a8e0-4aed4dd5e420 ---> d265f9d66b8be65448e6c9147a83d65a300e1852.part
  6. 通过qemu-img info,可以发现d265f9d66b8be65448e6c9147a83d65a300e1852.part仍为qcow2格式的镜像,且大小与glance上的大小一致。
    1. ubuntu@compute-63-11:/var/lib/nova/instances/_base$ sudo qemu-img info d265f9d66b8be65448e6c9147a83d65a300e1852.part
    2. image: d265f9d66b8be65448e6c9147a83d65a300e1852.part
    3. file format: qcow2
    4. virtual size: 2.0G(2147483648 bytes)
    5. disk size: 223M
    6. cluster_size: 65536
    (2)步:
  7.       镜像下载成功后,openstack先去判断image文件的类型是否为qcow2,如果是,则现将其转化为raw格式,否则,直接进入(3)
  8.       这里通过qemu-img convert命令,将qcow2格式转化为raw格式,转化完的镜像为:d265f9d66b8be65448e6c9147a83d65a300e1852通过qemu-imag info查看其information。
    1. ubuntu@compute-63-11:/var/lib/nova/instances/_base$ sudo qemu-img info d265f9d66b8be65448e6c9147a83d65a300e1852
    2. image: d265f9d66b8be65448e6c9147a83d65a300e1852
    3. file format: raw
    4. virtual size: 2.0G(2147483648 bytes)
    5. disk size: 659M
    (3)(4)两步:
  9.      由于所请求的vm的类型为m1.small,其root disk的大小为10G,所以需要resize image fille to 10G。
  10.     这里比较奇怪的是,在resize之前,openstack会将d265f9d66b8be65448e6c9147a83d65a300e1852拷贝一份d265f9d66b8be65448e6c9147a83d65a300e1852_10,然后对d265f9d66b8be65448e6c9147a83d65a300e1852_10进行resize操作,将其变成10G的raw,这可能与vm的备份有关,暂时还没有理解为什么这么做。
    1. cp /var/lib/nova/instances/_base/d265f9d66b8be65448e6c9147a83d65a300e1852 /var/lib/nova/instances/_base/d265f9d66b8be65448e6c9147a83d65a300e1852_10 (raw-->raw 2G-->2G)
    2. qemu-img resize /var/lib/nova/instances/_base/d265f9d66b8be65448e6c9147a83d65a300e1852_10 10737418240 (raw--> raw 2G -->10G)
    (5) 步:
  11.     以(3)中创建的d265f9d66b8be65448e6c9147a83d65a300e1852_10作为base创建qcow2格式的overlay,可以理解为以d265f9d66b8be65448e6c9147a83d65a300e1852_10为base,创建了一个快照disk,具体看对应虚拟机目录下的文件:
    1. ubuntu@compute-63-12:/var/lib/nova/instances/instance-0000003a$ ll -alh
    2. total 417M
    3. drwxrwxr-x 2 nova nova 4.0K Feb 28 21:39./
    4. drwxr-xr-x 8 nova nova 4.0K Feb 28 21:39../
    5. -rw-rw---- 1 libvirt-qemu kvm 23K Feb 28 21:40 console.log
    6. -rw-r--r-- 1 libvirt-qemu kvm 417M Mar 1 02:36 disk
    7. -rw-r--r-- 1 libvirt-qemu kvm 576K Mar 1 01:35 disk.local
    8. -rw-rw-r-- 1 nova nova 1.6K Feb 28 21:38 libvirt.xml
    现在来总结下镜像文件的变化过程:
  12.  c036d689-0336-4fcd-a8e0-4aed4dd5e420    (223M -- qcow2)
  13.      -->d265f9d66b8be65448e6c9147a83d65a300e1852.part   (223M -- qcow2)
  14.            --> d265f9d66b8be65448e6c9147a83d65a300e1852      (2G -- raw)
  15.                  -->d265f9d66b8be65448e6c9147a83d65a300e1852_10   (10G -- raw)
  16.                         --> disk    (417M -- qcow2)

3. cache机制

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

<think>好的,我需要详细解释OpenStack虚拟机创建的流程。首先,用户的问题是关于流程的详细步骤,所以我需要结合之前提供的引用内容来组织回答。根据引用2和引用5,流程大致分为几个阶段:身份验证、调度、资源准备、网络配置和虚拟机实例化。首先,用户发起请求,这涉及到nova-api接收请求。然后,Keystone进行身份验证,确保用户有权限。接着,nova-scheduler会选择合适的计算节点。这部分需要详细说明调度过程,可能涉及过滤和权重计算,不过引用中没有提到具体调度算法,可能需要保持一般性描述。 然后是nova-compute的工作,包括与Glance获取镜像,Neutron分配网络,Cinder提供存储(如果有的话)。这里要强调各组件之间的协作,比如通过消息队列通信,以及各服务如何通过Keystone验证。引用4和引用5提到nova-conductor的作用,用来安全访问数据库,需要解释这一点。最后是虚拟机实例化的具体步骤,比如调用libvirt创建虚拟机,并更新数据库状态。同时,整个流程中数据库记录的状态变化也很重要,比如初始状态到运行中的转变。 需要确保回答结构清晰,分步骤说明,并正确引用相关的引用编号。同时,要检查是否有遗漏的步骤,比如安全组配置、密钥对注入等,这些在引用3中提到过,需要包含在内。 另外,用户可能对各个组件之间的交互感兴趣,例如nova-api如何与数据库通信,nova-scheduler如何选择节点,以及消息队列的作用。引用5详细说明了消息队列作为交通枢纽的重要性,这点要突出。 最后,生成相关问题时要考虑用户可能进一步想知道的内容,比如如何优化流程、常见错误排查,或者各个组件的详细功能。确保问题与创建流程相关,并引导用户深入理解。</think>### OpenStack虚拟机创建详细流程 OpenStack虚拟机创建是一个涉及多个组件协同工作的复杂过程,主要分为以下几个阶段: #### 一、用户请求与身份验证 1. **用户发起请求**:通过命令行或Dashboard向`nova-api`发送创建虚拟机请求,包含镜像、规格(flavor)、网络等参数[^3][^5]。 2. **Keystone认证**: - 用户首先需提供用户名和密码获取临时令牌(token)[^5]。 - `nova-api`携带该令牌向Keystone验证权限,确保用户有权执行操作[^2][^5]。 #### 二、调度与资源分配 3. **数据库记录初始化**: - `nova-api`将虚拟机元数据写入数据库(如MySQL),并生成初始记录[^4][^5]。 4. **调度器选择计算节点**: - `nova-scheduler`通过消息队列接收请求,根据资源可用性(CPU、内存等)和策略选择最优的`nova-compute`节点[^2][^5]。 #### 三、资源准备与组件协作 5. **镜像获取**: - `nova-compute`从Glance下载指定镜像,期间需通过Keystone验证镜像访问权限[^5]。 6. **网络配置**: - 调用Neutron分配IP并配置虚拟网络(如创建端口、绑定安全组),Neutron同样需验证Token[^3][^5]。 7. **存储资源分配**(可选): - 若需云硬盘,`nova-compute`会请求Cinder创建并挂载卷,Cinder需通过Keystone认证[^5]。 #### 四、虚拟机实例化 8. **底层虚拟化调用**: - `nova-compute`通过Libvirt(默认使用KVM)创建虚拟机实例,加载镜像并配置虚拟硬件[^5]。 9. **状态同步与更新**: - `nova-conductor`持续更新数据库中的虚拟机状态(如“构建中”→“运行中”)[^5]。 10. **网络连通性检查**: - Neutron确保虚拟机获得IP并可通过网络访问[^3]。 #### 五、流程完成 11. **用户接收结果**: - 创建成功后,用户可通过Dashboard或命令行访问虚拟机[^1]。 ```plaintext 流程图简化为: 用户 → nova-api → Keystone认证 → 调度 → nova-compute → 资源协调 → 实例化 → 状态更新 → 完成 ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值