介绍

除非您拥有虚拟机镜像(有些人称之为“虚拟设备”),否则 OpenStack Compute 云几乎没有用处。本指南介绍了如何获取、创建和修改与 OpenStack 兼容的虚拟机镜像。

为了简洁起见,我们有时会使用术语 镜像 代替虚拟机镜像。

什么是虚拟机镜像?

虚拟机镜像是一个单独的文件,其中包含安装了可引导操作系统的虚拟磁盘。

镜像的磁盘和容器格式

虚拟机镜像有不同的格式。格式描述了构成文件的位的在存储介质上的排列方式。为了使消费者能够正确解释文件内容(而不是仅仅将其视为一堆位),需要了解该格式。

在考虑存储的虚拟机镜像时,有两种类型的格式可能发挥作用。

容器格式

存储的文件可能是一个容器,其中包含虚拟磁盘。例如,虚拟磁盘可能包含在 tar 文件中,必须先打开该文件才能检索磁盘。但是,虚拟磁盘可能不包含在文件中,而是以原样存储在镜像服务中。

磁盘格式

虚拟磁盘本身以某种格式排列其位。消费服务必须知道这种格式才能有效地使用虚拟磁盘。

镜像元数据

镜像元数据(也称为“镜像属性”)提供有关镜像服务存储的虚拟磁盘的信息。元数据存储在镜像服务与镜像数据关联的镜像记录中。镜像元数据可以帮助最终用户确定镜像的性质,并被与镜像服务交互的关联 OpenStack 组件和驱动程序使用。

为了使镜像消费者能够轻松识别镜像的容器和磁盘格式,镜像服务为这些格式保留了特定的元数据键。毫不奇怪,这些键分别命名为 container_formatdisk_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 createopenstack 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 目录的更多信息,请参阅