介绍¶
除非您拥有虚拟机镜像(有些人称之为“虚拟设备”),否则 OpenStack Compute 云几乎没有用处。本指南介绍了如何获取、创建和修改与 OpenStack 兼容的虚拟机镜像。
为了简洁起见,我们有时会使用术语 镜像 代替虚拟机镜像。
什么是虚拟机镜像?
虚拟机镜像是一个单独的文件,其中包含安装了可引导操作系统的虚拟磁盘。
镜像的磁盘和容器格式¶
虚拟机镜像有不同的格式。格式描述了构成文件的位的在存储介质上的排列方式。为了使消费者能够正确解释文件内容(而不是仅仅将其视为一堆位),需要了解该格式。
在考虑存储的虚拟机镜像时,有两种类型的格式可能发挥作用。
- 容器格式
存储的文件可能是一个容器,其中包含虚拟磁盘。例如,虚拟磁盘可能包含在
tar文件中,必须先打开该文件才能检索磁盘。但是,虚拟磁盘可能不包含在文件中,而是以原样存储在镜像服务中。- 磁盘格式
虚拟磁盘本身以某种格式排列其位。消费服务必须知道这种格式才能有效地使用虚拟磁盘。
镜像元数据¶
镜像元数据(也称为“镜像属性”)提供有关镜像服务存储的虚拟磁盘的信息。元数据存储在镜像服务与镜像数据关联的镜像记录中。镜像元数据可以帮助最终用户确定镜像的性质,并被与镜像服务交互的关联 OpenStack 组件和驱动程序使用。
为了使镜像消费者能够轻松识别镜像的容器和磁盘格式,镜像服务为这些格式保留了特定的元数据键。毫不奇怪,这些键分别命名为 container_format 和 disk_format。每种格式的合法值都指定在镜像服务的镜像模式中,您可以在任何 OpenStack 安装中通过发出以下 API 调用来获取该模式
GET /v2/schemas/image
受支持的格式可能因 OpenStack 云而异。特定云接受的格式将在该云的 Images API 的 get-schema 响应中指定。
注意
镜像模式列出了容器和磁盘格式的合法标识符。要了解这些标识符指的是什么,请参阅 Glance 用户指南的 磁盘和容器格式 部分。
镜像元数据还可以确定主机的调度。如果在镜像上设置了特定的元数据(可能的元数据包括架构、hypervisor 类型和虚拟机模式),并且配置了 Compute,以便启用 ImagePropertiesFilter 调度器过滤器(默认情况下),那么调度器只会考虑满足指定属性的计算主机。
注意
Compute 的 ImagePropertiesFilter 值在 /etc/nova/nova.conf 文件的 [filter_scheduler] 部分的 enabled_filters 值中指定。
其他 Compute 调度器过滤器也可能受到镜像元数据的影响。有关有效属性键和值的完整列表,请参阅 Glance 管理指南的 有用的镜像属性 部分。
向镜像添加元数据¶
您可以使用 --property key=value 参数以及 openstack image create 或 openstack image set 命令将元数据添加到镜像服务镜像。可以指定多个属性。例如
$ 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 |
+------------------+------------------------------------------------------+
注意
从镜像创建卷的属性
在从镜像创建 Block Storage 卷时,还要考虑您配置的镜像属性。如果您更改了核心镜像属性,还应更新您的 Block Storage 配置。修改所有控制器节点上的 /etc/cinder/cinder.conf 文件中的 glance_core_properties 以匹配您在镜像服务中设置的核心属性。
元数据定义 (metadefs) 服务¶
镜像不是唯一可以关联元数据的 OpenStack 资源。许多其他资源(例如,卷)支持在资源上设置元数据。与镜像一样,元数据可以被人类消费以了解有关资源的某些信息,或者可以被其他 OpenStack 服务使用,以便它们可以有效地利用资源(例如,nova 过滤器调度器使用镜像 architecture 属性来确定从该镜像构建实例的适当主机)。因此,重要的是要有一种可发现的方式,让人员和服务能够确定整个 OpenStack 云中可用的元数据属性和值。
为了便于此,Glance(OpenStack 镜像服务)托管一个元数据定义服务,也称为OpenStack metadefs 目录。
使用此服务,您可以定义
- 命名空间
包含元数据定义。
指定定义中所有内容的访问控制。这些访问控制确定谁可以定义和使用命名空间中的定义。
将定义与不同类型的资源关联起来。
- 属性
单个属性及其基本约束。每个属性只能是基本类型。例如,字符串、整数、数字、布尔值或数组。
- 对象
描述一组一个或多个属性及其基本约束。组中的每个属性只能是基本类型。例如,字符串、整数、数字、布尔值或数组。
该对象可以选择性地定义在语义理解下,如果您使用该对象,则应提供所有必需属性的必需属性。
- 资源类型关联
指定资源类型与适用命名空间之间的关系。可以使用此信息来驱动 UI 和 CLI 视图。例如,相同的命名空间对象、属性和标签可用于镜像、快照、卷和风味。或者,命名空间可能仅适用于镜像。
镜像服务为其元数据定义目录预定义了命名空间。要将此目录中的文件加载到数据库中
$ glance-manage db_load_metadefs
要从数据库卸载文件
$ glance-manage db_unload_metadefs
要以 JSON 格式导出定义
$ glance-manage db_export_metadefs
注意
默认情况下,文件是从镜像服务的 /etc/glance/metadefs 目录加载和导出的。
镜像服务和 Metadefs 服务之间没有特殊关系。如果您想将 Metadefs 服务中定义的键和值应用于镜像,则必须使用镜像服务 API 或客户端工具,就像您对任何其他 OpenStack 服务一样。
有关 OpenStack Metadefs 目录的更多信息,请参阅