如果没有虚拟机镜像(有些人称之为 “虚拟设备”),OpenStack 就不会非常有用。本指南介绍如何获取、创建和修改与 OpenStack 兼容的虚拟机镜像。
为了简明扼要,我们有时会使用image(镜像)
一词来代替虚拟机镜像。
什么是虚拟机镜像?
虚拟机镜像是一个单一文件,其中包含一个安装了可启动操作系统
的虚拟磁盘。
镜像的磁盘和容器格式
虚拟机镜像有不同的格式。格式描述了组成文件的位在存储介质上的排列方式。使用者需要了解格式才能正确解释文件的内容(而不是简单地将其视为一堆位)。
在考虑存储虚拟机镜像时,有两种格式可以发挥作用。
容器格式
存储文件可以是包含虚拟磁盘的容器。例如,虚拟磁盘可能包含在一个 tar 文件中,必须先打开该文件才能检索磁盘。但也有可能虚拟磁盘不包含在文件中,而只是由镜像服务按原样存储。
磁盘格式
虚拟磁盘本身的位以某种格式排列。使用者必须知道这种格式是什么,才能有效地使用虚拟磁盘。
镜像元数据
镜像元数据(也称为 “镜像属性”)提供有关镜像服务所存储虚拟磁盘的信息。元数据存储为镜像服务与镜像数据关联的镜像记录的一部分。镜像元数据可帮助最终用户确定镜像的性质,并被与镜像服务接口的相关 OpenStack 组件和驱动程序使用。
为了让镜像消费者能轻松识别镜像的容器和磁盘格式,镜像服务为其预留了特定的元数据密钥。容器格式(container_format)和磁盘格式(disk_format)的名称不足为奇。每个键的法定值都在镜像服务的镜像模式中指定,您可以在任何 OpenStack 安装中通过调用以下 API 来获取:
GET /v2/schemas/image
不同 OpenStack 云支持的格式可能有所不同。特定云接受的格式将在该云对镜像 API 的 get-schema 响应中指定。
注意
镜像模式列出了容器和磁盘格式的合法标识符。要了解这些标识符的含义,请查阅《Glance 用户指南》中的 “磁盘和容器格式”部分。
镜像元数据还能决定主机的调度。如果在镜像上设置了特定的元数据(可能的元数据有体系结构、hypervisor的类型和虚拟机模式),并且 Compute 已配置为启用 ImagePropertiesFilter 调度器过滤器(默认),那么调度器只会考虑满足指定属性的计算主机。
注意
Compute 的 ImagePropertiesFilter 值在 /etc/nova/nova.conf 文件 [filter_scheduler] 部分的 enabled_filters 值中指定。
其他 Compute 调度器过滤器也可能受到镜像元数据的影响。有关有效属性键和值的完整列表,请参阅《Glance 管理指南》中的 “有用的镜像属性”部分。
为镜像添加元数据
通过在 openstack image create
或 openstack image set
命令中使用 --property key=value
参数,可以为 Image 服务镜像添加元数据。可以指定多个属性。例如
openstack image set --property architecture=arm \
--property hypervisor_type=qemu image_name_or_id
常用镜像属性也在 /etc/glance/schema-image.json
文件中指定。其他有用的属性键和值列在《Glance 管理指南》的 “有用的镜像属性”部分。
可以使用 openstack image show
命令显示镜像的所有相关属性。例如:
$ openstack image show cirros
+------------------+------------------------------------------------------+
| Field | Value |
+------------------+------------------------------------------------------+
| checksum | ee1eca47dc88f4879d8a229cc70a07c6 |
| container_format | bare |
| created_at | 2016-04-15T13:57:38Z |
| disk_format | qcow2 |
| file | /v2/images/55f0907f-70a5-4376-a346-432e4ec509ed/file |
| id | 55f0907f-70a5-4376-a346-432e4ec509ed |
| min_disk | 0 |
| min_ram | 0 |
| name | cirros |
| owner | f9574e69042645d6b5539035cb8c00bf |
| properties | architecture='arm', hypervisor_type='qemu' |
| protected | False |
| schema | /v2/schemas/image |
| size | 13287936 |
| status | active |
| tags | |
| updated_at | 2016-04-15T13:57:57Z |
| virtual_size | None |
| visibility | public |
+------------------+------------------------------------------------------+
注意
Volume-from-Image 属性
当从镜像创建块存储卷时,还要考虑你配置的镜像属性。如果更改核心镜像属性,还应更新块存储配置。修改所有控制器节点上/etc/cinder/cinder.conf
文件中的glance_core_properties
,以匹配你在镜像服务中设置的核心属性。
元数据定义 (metadefs) 服务
镜像并不是唯一可以关联元数据的 OpenStack 资源。许多其他资源(例如卷)都支持在资源上设置元数据。与镜像一样,元数据可能会被人们使用,以了解有关资源的信息,也可能会被其他 OpenStack 服务使用,以便有效地使用资源(例如,nova 过滤器调度程序使用镜像架构属性来确定合适的主机,在该主机上根据镜像构建实例)。因此,人们和服务必须有一种可发现的方式来确定整个 OpenStack 云中有哪些元数据属性和值可用。
为了实现这一点,Glance(OpenStack 镜像服务)托管元数据定义服务,也称为 OpenStack 元定义目录。
使用此服务,你可以定义:
Namespace
- 包含元数据定义。
- 为命名空间中定义的所有内容指定访问控制。这些访问控制决定了谁可以定义和使用名称空间中的定义。
- 将定义与不同类型的资源关联起来。
Property
单个属性及其基本约束。每个属性只能是基本类型。例如,字符串、整数、数字、布尔值或数组。
Object
描述一组一对多属性及其基本约束。组中的每个属性只能是基本类型。例如,字符串、整数、数字、布尔值或数组。
对象可以选择在语义理解下定义必需属性,即如果您使用该对象,则应提供所有必需属性。
资源类型关联
指定资源类型与适用于它们的命名空间之间的关系。此信息可用于 驱动UI
和 CLI视图
。例如,对象、属性和标签的相同命名空间可用于镜像、快照、卷和类型。或者命名空间可能仅适用于镜像。
镜像服务已为元数据定义目录预定义命名空间。要将此目录中的文件加载到数据库中:
$ glance-manage db_load_metadefs
要从数据库卸载文件:
$ glance-manage db_unload_metadefs
要以 JSON 格式导出定义:
$ glance-manage db_export_metadefs
注意
默认情况下,文件从 Image 服务的/etc/glance/metadefs
目录加载并导出。
Image 服务与 Metadefs 服务之间没有特殊关系。如果要将 Metadefs 服务中定义的键和值应用到镜像,必须使用镜像服务 API 或客户端工具,就像使用其他 OpenStack 服务一样。
有关 OpenStack Metadefs 目录的更多信息,请参阅:
- 使用 Glance 用户指南中的 Glance元数据定义目录公共API
- 元数据定义服务API 参考