创建和管理镜像


Red Hat OpenStack Platform 17.0

创建和管理镜像

OpenStack Documentation Team

摘要

本指南提供创建和管理镜像的步骤,以及配置镜像服务(glance)的步骤。

第 1 章 Image 服务(glance)

管理 Red Hat OpenStack Platform (RHOSP)中的镜像和存储。

1.1. 虚拟机(VM)镜像格式

VM 镜像是包含安装可引导操作系统的虚拟磁盘的文件。以不同格式支持虚拟机镜像。Red Hat OpenStack Platform (RHOSP) 提供了以下格式:

  • RAW - Unstructured 磁盘镜像格式。
  • QEMU 模拟器支持的 QCOW2 磁盘格式。此格式包括 QCOW2v3 (有时称为 QCOW3),这需要 QEMU 1.1 或更高版本。
  • 存储在二进制文件中的磁盘上的 ISO -Sector-by-sector 副本。
  • AKI - 表示 Amazon 内核镜像。
  • ami - 表示 Amazon Machine 镜像。
  • ARI - 表示 Amazon RAMDisk 镜像。
  • VirtualBox VM 监控和 QEMU 模拟器支持的 dl- Disk 格式。
  • vhd - Common disk format by VM monitor from VMware, VirtualBox 等。
  • PLOOP - Virtuo 支持并使用的磁盘格式来运行 OS 容器。
  • OVA - 表示镜像服务(glance)中存储的内容是一个 OVA tar 归档文件。
  • DOCKER - 表示镜像服务(glance)中存储的内容是容器文件系统的 Docker tar 存档。

虽然 ISO 通常不被视为虚拟机镜像格式,因为 ISO 包含带有已安装操作系统的可引导文件系统,但您可以使用与其他虚拟机镜像文件的方式相同。

1.2. 支持的镜像服务后端

支持以下镜像服务(glance)后端场景:

  • 使用 Ceph 时,RADOS 块设备(RBD)是默认后端。
  • RBD 多存储.
  • Object Storage (swift)。镜像服务使用 Object Storage 类型和后端作为默认值。
  • Block Storage (cinder)。
  • NFS

    重要的

    虽然 NFS 是受支持的镜像服务部署选项,但提供了更强大的选项。

    NFS 不对镜像服务是原生的。当您在镜像服务中挂载 NFS 共享时,镜像服务不管理该操作。镜像服务将数据写入文件系统,但不知道后端是一个 NFS 共享。

    在这种类型的部署中,如果共享失败,镜像服务无法重试请求。这意味着,当在后端出现故障时,存储可能会进入只读模式,或者可能会继续将数据写入本地文件系统,以防出现数据丢失的风险。要从此情形中恢复,您必须确保共享被挂载并同步,然后重新启动镜像服务。因此,红帽不推荐将 NFS 作为镜像服务后端。

    但是,如果您选择将 NFS 用作镜像服务后端,则以下一些最佳实践可帮助降低风险:

    • 使用可靠的生产级 NFS 后端。
    • 确保 Controller 节点和 NFS 后端之间有强且可靠的连接:第 2 层(L2)网络连接。
    • 包括挂载的共享的监控和警报。
    • 设置底层文件系统权限。写入权限必须存在于用作存储的共享文件系统中。
    • 确保运行 glance-api 进程的用户和组在本地文件系统上没有挂载点的写入权限。这意味着进程可以检测到可能的挂载失败,并在写尝试过程中将存储置于只读模式。

1.3. 镜像签名和验证

镜像签名和验证通过启用部署者为镜像签名并保存签名和公钥证书作为镜像属性来保护镜像完整性和真实性。

注意

如果 Nova 使用 RADOS 块设备(RBD)存储虚拟机磁盘,则不支持镜像签名和验证。

如需有关镜像签名和验证的信息,请参阅使用 OpenStack Key Manager 管理 Secret 指南中的 验证镜像服务(glance)镜像

1.4. 镜像转换

在导入镜像时,通过调用任务 API 来转换镜像。

作为导入工作流的一部分,插件提供镜像转换。您可以根据部署配置激活或取消激活此插件。部署器需要为部署指定首选镜像格式。

在内部,镜像服务(glance)以特定格式接收镜像的位,并将位存储在临时位置。镜像服务会触发插件将镜像转换为目标格式,并将镜像移到最终目的地。任务完成后,镜像服务会删除临时位置。镜像服务不会保留最初上传的格式。

您只能在导入镜像时触发镜像转换。上传镜像时不会运行。

使用镜像服务命令行客户端进行镜像管理。

例如:

Copy to Clipboard Toggle word wrap
$ glance image-create-via-import \
    --disk-format qcow2 \
    --container-format bare \
    --name NAME \
    --visibility public \
    --import-method web-download \
    --uri http://server/image.qcow2

1.5. 可互操作的镜像导入

通过互操作性的镜像导入工作流,您可以以两种方式导入镜像:

  • 使用 web-download (默认)方法从 URI 导入镜像。
  • 使用 glance-direct 方法从本地文件系统导入镜像。
  • 使用 copy-image 方法将现有镜像复制到部署中的其他镜像服务(glance)后端。只有在部署中启用了多个镜像服务后端时,才使用此导入方法。

1.6. 使用镜像服务缓存提高可扩展性

使用 glance-api 缓存机制将镜像副本存储在镜像服务(glance) API 服务器上,并自动检索它们以提高可扩展性。使用镜像服务缓存时,glance-api 可以在多个主机上运行。这意味着不需要多次从后端存储检索同一镜像。镜像服务缓存不会影响任何镜像服务操作。

使用 Red Hat OpenStack Platform director (tripleo) heat 模板配置镜像服务缓存:

流程

  1. 在环境文件中,将 GlanceCacheEnabled 参数的值设置为 true,这会在 glance-api.conf heat 模板中自动将 flavor 值设置为 keystone+cachemanagement

    Copy to Clipboard Toggle word wrap
    parameter_defaults:
        GlanceCacheEnabled: true
  2. 在重新部署 overcloud 时,将环境文件包含在 openstack overcloud deploy 命令中。
  3. 可选:在重新部署 overcloud 时,将 glance_cache_pruner 替换为替代频率。以下示例显示了 5 分钟的频率:

    Copy to Clipboard Toggle word wrap
    parameter_defaults:
      ControllerExtraConfig:
        glance::cache::pruner::minute: '*/5'

    根据您的需要调整频率,以避免文件系统的完整场景。选择替代频率时包括以下元素:

    • 要在环境中缓存的文件大小。
    • 可用文件系统空间量。
    • 环境缓存镜像的频率。

1.7. 镜像预缓存

Red Hat OpenStack Platform (RHOSP) director 可以预缓存镜像作为 glance-api 服务的一部分。

使用 Image 服务(glance)命令行客户端进行镜像管理。

1.7.1. 为定期镜像预缓存配置默认间隔

Red Hat OpenStack Platform (RHOSP) director 可以预缓存镜像作为 glance-api 服务的一部分。

预缓存定期作业在每个运行 glance-api 服务的控制器节点上每 300 秒(5 分钟默认时间)运行一次。要更改默认时间,您可以在 glance-api.conf 的 Default 部分下设置 cache_prefetcher_interval 参数。

流程

  1. 根据您的要求, undercloud 的环境文件中添加新间隔:

    Copy to Clipboard Toggle word wrap
    parameter_defaults:
      ControllerExtraConfig:
        glance::config::glance_api_config:
          DEFAULT/cache_prefetcher_interval:
            value: '<300>'

    将 <300> 替换为您要作为预缓存镜像间隔的秒数。

  2. 在调整了 /home/stack/templates/ 中的环境文件中的间隔后,以 stack 用户身份登录并部署配置:

    Copy to Clipboard Toggle word wrap
    $ openstack overcloud deploy --templates \
    -e /home/stack/templates/<env_file>.yaml

    将 <env_file> 替换为包含您添加的 ExtraConfig 设置的环境文件名称。

    重要

    如果您在创建 overcloud 时传递任何额外的环境文件,请使用 -e 选项再次传递这些文件,以避免对 overcloud 进行不必要的更改。

有关 openstack overcloud deploy 命令的更多信息,请参阅 Director 安装和使用 指南中的 部署命令https://access.redhat.com/documentation/zh-cn/red_hat_openstack_platform/17.0/html-single/director_installation_and_usage/index#deployment-command

1.7.2. 使用定期作业预缓存镜像

使用定期作业来预缓存镜像。

先决条件

要使用定期作业来预缓存镜像,您必须使用直接连接到运行 glance_api 服务的节点的 glance-cache-manage 命令。不要使用代理,这会隐藏回答服务请求的节点。由于 undercloud 可能无法访问运行 glance_api 服务的网络,因此在第一个 overcloud 节点上运行命令,这默认称为 controller-0

完成以下先决条件流程,以确保从正确的主机运行命令、具有必要的凭据,也从 glance-api 容器内运行 glance-cache-manage 命令。

流程

  1. 以 stack 用户身份登录 undercloud,并识别 controller-0 的调配 IP 地址:

    Copy to Clipboard Toggle word wrap
    (undercloud) [stack@site-undercloud-0 ~]$ openstack server list -f value -c Name -c Networks | grep controller
    overcloud-controller-1 ctlplane=192.168.24.40
    overcloud-controller-2 ctlplane=192.168.24.13
    overcloud-controller-0 ctlplane=192.168.24.71
    (undercloud) [stack@site-undercloud-0 ~]$
  2. 要向 overcloud 进行身份验证,将存储在 /home/stack/overcloudrc 中的凭证复制到 controller-0

    Copy to Clipboard Toggle word wrap
    $ scp ~/overcloudrc tripleo-admin@192.168.24.71:/home/tripleo-admin/
  3. 连接到 controller-0

    Copy to Clipboard Toggle word wrap
    $ ssh tripleo-admin@192.168.24.71
  4. controller-0 上,以 tripleo-admin 用户身份,识别 glance_api 服务的 IP 地址。在以下示例中,IP 地址为 172.25.1.105:

    Copy to Clipboard Toggle word wrap
    (overcloud) [root@controller-0 ~]# grep -A 10 '^listen glance_api' /var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg
    listen glance_api
     server central-controller0-0.internalapi.redhat.local 172.25.1.105:9292 check fall 5 inter 2000 rise 2
  5. 由于 glance-cache-manage 命令仅在 glance_api 容器中可用,因此要执行的脚本来执行到该容器,其中已设置了向 overcloud 进行身份验证的环境变量。在 controller-0 上的 /home/tripleo-admin 中创建一个名为 glance_pod.sh 的脚本,其内容如下:

    Copy to Clipboard Toggle word wrap
    sudo podman exec -ti \
     -e NOVA_VERSION=$NOVA_VERSION \
     -e COMPUTE_API_VERSION=$COMPUTE_API_VERSION \
     -e OS_USERNAME=$OS_USERNAME \
     -e OS_PROJECT_NAME=$OS_PROJECT_NAME \
     -e OS_USER_DOMAIN_NAME=$OS_USER_DOMAIN_NAME \
     -e OS_PROJECT_DOMAIN_NAME=$OS_PROJECT_DOMAIN_NAME \
     -e OS_NO_CACHE=$OS_NO_CACHE \
     -e OS_CLOUDNAME=$OS_CLOUDNAME \
     -e no_proxy=$no_proxy \
     -e OS_AUTH_TYPE=$OS_AUTH_TYPE \
     -e OS_PASSWORD=$OS_PASSWORD \
     -e OS_AUTH_URL=$OS_AUTH_URL \
     -e OS_IDENTITY_API_VERSION=$OS_IDENTITY_API_VERSION \
     -e OS_COMPUTE_API_VERSION=$OS_COMPUTE_API_VERSION \
     -e OS_IMAGE_API_VERSION=$OS_IMAGE_API_VERSION \
     -e OS_VOLUME_API_VERSION=$OS_VOLUME_API_VERSION \
     -e OS_REGION_NAME=$OS_REGION_NAME \
    glance_api /bin/bash
  6. Source overcloudrc 文件,运行 glance_pod.sh 脚本,以使用必要的环境变量在 glance_api 中执行以在 overcloud Controller 节点中进行身份验证。

    Copy to Clipboard Toggle word wrap
    [tripleo-admin@controller-0 ~]$ source overcloudrc
    (overcloudrc) [tripleo-admin@central-controller-0 ~]$ bash glance_pod.sh
    ()[glance@controller-0 /]$
  7. 使用 glance image-list 等命令来验证容器是否可以针对 overcloud 运行经过身份验证的命令。

    Copy to Clipboard Toggle word wrap
    ()[glance@controller-0 /]$ glance image-list
    +--------------------------------------+----------------------------------+
    | ID                                   | Name                             |
    +--------------------------------------+----------------------------------+
    | ad2f8daf-56f3-4e10-b5dc-d28d3a81f659 | cirros-0.4.0-x86_64-disk.img       |
    +--------------------------------------+----------------------------------+
    ()[glance@controller-0 /]$

流程

  1. 以 admin 用户身份,将镜像排队到缓存:

    Copy to Clipboard Toggle word wrap
    $ glance-cache-manage --host=<host_ip> queue-image <image_id>
    • 将 <host_ip> 替换为运行 glance-api 容器的 Controller 节点的 IP 地址。
    • 将 <image_id> 替换为您要队列的镜像 ID。

      当您排队了您要预缓存的镜像时,cache_images 会同时抓取所有排队的镜像。

      注意

      由于镜像缓存对每个节点是本地的,因此如果您的 Red Hat OpenStack Platform 部署有 HA (3、5 或 7 控制器),那么在运行 glance-cache-manage 命令时必须使用-- host 选项指定主机地址。

  2. 运行以下命令,以查看镜像缓存中的镜像:

    Copy to Clipboard Toggle word wrap
    $ glance-cache-manage --host=<host_ip> list-cached

    将 <host_ip> 替换为环境中主机的 IP 地址。

相关信息

您可以对以下目的使用额外的 glance-cache-manage 命令:

  • list-cached,以列出当前缓存的所有镜像。
  • list-queued,列出当前排队以缓存的所有镜像。
  • queue-image,为镜像排队以进行缓存。
  • delete-cached-image 从缓存中清除镜像。
  • delete-all-cached-images,从缓存中删除所有镜像。
  • delete-queued-image 从缓存队列中删除镜像。
  • delete-all-queued-images,以从缓存队列中删除所有镜像。

1.8. 使用镜像服务 API 启用稀疏镜像上传

使用镜像服务(glance) API,您可以使用稀疏镜像上传来减少网络流量并节省存储空间。此功能在分布式 Compute 节点 (DCN) 环境中特别有用。使用稀疏镜像文件时,镜像服务不会写入 null 字节序列。镜像服务使用给定偏移来写入数据。存储后端将这些偏移解释为不实际消耗存储空间的 null 字节。

使用镜像服务命令行客户端进行镜像管理。

限制

  • 仅 Ceph RADOS 块设备(RBD)支持稀疏镜像上传。
  • 文件系统不支持稀疏镜像上传。
  • 在客户端和镜像服务 API 之间的传输过程中不会维护稀疏性。镜像在镜像服务 API 级别上稀疏。

先决条件

  • 您的 Red Hat OpenStack Platform (RHOSP)部署将 RBD 用于镜像服务后端。

流程

  1. stack 用户身份登录 undercloud 节点。
  2. 查找 stackrc 凭证文件:

    Copy to Clipboard Toggle word wrap
    $ source stackrc
  3. 使用以下内容创建环境文件:

    Copy to Clipboard Toggle word wrap
    parameter_defaults:
        GlanceSparseUploadEnabled: true
  4. 使用其他环境文件将新环境文件添加到堆栈中,并部署 overcloud:

    Copy to Clipboard Toggle word wrap
    $ openstack overcloud deploy \
        --templates \
        …
        -e <existing_overcloud_environment_files> \
        -e <new_environment_file>.yaml \
        ...

有关上传镜像的更多信息,请参阅 上传镜像

验证

您可以导入镜像并检查其大小以验证稀疏镜像上传。

以下流程使用 example 命令。在适当的环境中,将值替换为您环境中的值。

  1. 本地下载镜像文件:

    Copy to Clipboard Toggle word wrap
    $ wget <file_location>/<file_name>
    • <file_location > 替换为文件的位置。
    • <file_name > 替换为文件的名称。

      例如:

      Copy to Clipboard Toggle word wrap
      $ wget https://cloud.centos.org/centos/6/images/CentOS-6-x86_64-GenericCloud-1508.qcow2
  2. 检查要上传的镜像的磁盘大小和虚拟大小:

    Copy to Clipboard Toggle word wrap
    $ qemu-img info <file_name>

    例如:

    Copy to Clipboard Toggle word wrap
    $ qemu-img info CentOS-6-x86_64-GenericCloud-1508.qcow2
    
    image: CentOS-6-x86_64-GenericCloud-1508.qcow2
    file format: qcow2
    virtual size: 8 GiB (8589934592 bytes)
    disk size: 1.09 GiB
    cluster_size: 65536
    Format specific information:
    compat: 0.10
    refcount bits: 1
  3. 导入镜像:

    Copy to Clipboard Toggle word wrap
    $ glance image-create-via-import --disk-format qcow2 --container-format bare --name centos_1 --file <file_name>
  4. 记录镜像 ID。后续步骤中需要用到它。
  5. 验证镜像是否已导入并处于 active 状态:

    Copy to Clipboard Toggle word wrap
    $ glance image show <image_id>
  6. 在 Ceph Storage 节点上,验证镜像的大小是否小于步骤 1 输出中的虚拟大小:

    Copy to Clipboard Toggle word wrap
    $ sudo rbd -p images diff <image_id> | awk '{ SUM += $2 } END { print SUM/1024/1024/1024 " GB" }'
    
    1.03906 GB
  7. 可选:您可以确认 rbd_thin_provisioning 已在 Controller 节点上的镜像服务配置文件中配置:

    1. 使用 SSH 访问 Controller 节点:

      Copy to Clipboard Toggle word wrap
      $ ssh -A -t tripleo-admin@<controller_node_IP_address>
    2. 确认 rbd_thin_provisioning 等同于该 Controller 节点上的 True

      Copy to Clipboard Toggle word wrap
      $ sudo podman exec -it glance_api sh -c 'grep ^rbd_thin_provisioning /etc/glance/glance-api.conf'

1.9. 安全 metadef API

在 Red Hat OpenStack Platform (RHOSP)中,用户可以使用元数据定义(metadef) API 来定义键值对和标签元数据。目前,用户可以创建的 metadef 命名空间、对象、属性、资源或标签数量没有限制。

metadef API 可能会将信息泄漏到未授权的用户。恶意用户可以利用缺乏限制,并用无限资源填充镜像服务(glance)数据库,从而创建拒绝的服务(DoS)风格攻击。

镜像服务策略控制 metadef API。但是,metadef API 的默认策略设置允许所有用户创建或读取 metadef 信息。由于 metadef 资源不与所有者隔离,因此具有潜在敏感名称(如内部基础架构详细信息或客户名称)的元数据资源可能会向恶意用户公开该信息。

1.9.1. 配置策略来限制 metadef API

要使镜像服务(glance)更安全,请在 Red Hat OpenStack Platform (RHOSP)部署中默认将 metadef 修改 API 限制为 admin-only 访问。

流程

  1. 作为云管理员,创建单独的 heat 模板环境文件,如 lock-down-glance-metadef-api.yaml,使其包含镜像服务 metadef API 的策略覆盖:

    Copy to Clipboard Toggle word wrap
    ...
    parameter_defaults:
      GlanceApiPolicies: {
    	glance-metadef_default: { key: 'metadef_default', value: '' },
    	glance-metadef_admin: { key: 'metadef_admin', value: 'role:admin' },
    	glance-get_metadef_namespace: { key: 'get_metadef_namespace', value: 'rule:metadef_default' },
    	glance-get_metadef_namespaces: { key: 'get_metadef_namespaces', value: 'rule:metadef_default' },
    	glance-modify_metadef_namespace: { key: 'modify_metadef_namespace', value: 'rule:metadef_admin' },
    	glance-add_metadef_namespace: { key: 'add_metadef_namespace', value: 'rule:metadef_admin' },
    	glance-delete_metadef_namespace: { key: 'delete_metadef_namespace', value: 'rule:metadef_admin' },
    	glance-get_metadef_object: { key: 'get_metadef_object', value: 'rule:metadef_default' },
    	glance-get_metadef_objects: { key: 'get_metadef_objects', value: 'rule:metadef_default' },
    	glance-modify_metadef_object: { key: 'modify_metadef_object', value: 'rule:metadef_admin' },
    	glance-add_metadef_object: { key: 'add_metadef_object', value: 'rule:metadef_admin' },
    	glance-delete_metadef_object: { key: 'delete_metadef_object', value: 'rule:metadef_admin' },
    	glance-list_metadef_resource_types: { key: 'list_metadef_resource_types', value: 'rule:metadef_default' },
    	glance-get_metadef_resource_type: { key: 'get_metadef_resource_type', value: 'rule:metadef_default' },
    	glance-add_metadef_resource_type_association: { key: 'add_metadef_resource_type_association', value: 'rule:metadef_admin' },
    	glance-remove_metadef_resource_type_association: { key: 'remove_metadef_resource_type_association', value: 'rule:metadef_admin' },
    	glance-get_metadef_property: { key: 'get_metadef_property', value: 'rule:metadef_default' },
    	glance-get_metadef_properties: { key: 'get_metadef_properties', value: 'rule:metadef_default' },
    	glance-modify_metadef_property: { key: 'modify_metadef_property', value: 'rule:metadef_admin' },
    	glance-add_metadef_property: { key: 'add_metadef_property', value: 'rule:metadef_admin' },
    	glance-remove_metadef_property: { key: 'remove_metadef_property', value: 'rule:metadef_admin' },
    	glance-get_metadef_tag: { key: 'get_metadef_tag', value: 'rule:metadef_default' },
    	glance-get_metadef_tags: { key: 'get_metadef_tags', value: 'rule:metadef_default' },
    	glance-modify_metadef_tag: { key: 'modify_metadef_tag', value: 'rule:metadef_admin' },
    	glance-add_metadef_tag: { key: 'add_metadef_tag', value: 'rule:metadef_admin' },
    	glance-add_metadef_tags: { key: 'add_metadef_tags', value: 'rule:metadef_admin' },
    	glance-delete_metadef_tag: { key: 'delete_metadef_tag', value: 'rule:metadef_admin' },
    	glance-delete_metadef_tags: { key: 'delete_metadef_tags', value: 'rule:metadef_admin' }
      }
    
    …
  2. 在部署 overcloud 时,在部署命令中包含策略覆盖的环境文件,使用 -e 选项:

    Copy to Clipboard Toggle word wrap
    $ openstack overcloud deploy -e lock-down-glance-metadef-api.yaml

1.9.2. 启用 metadef API

如果您之前限制的元数据定义(metadef) API 或想要重新放置新默认值,您可以覆盖 metadef 修改策略,以允许用户更新其相应资源。

重要

具有依赖于写入 metadef API 访问权限的用户的云管理员可以使所有用户都可以访问这些 API。但是,在这种配置中,可能会意外泄漏敏感资源名称,如客户名称和内部项目。管理员必须审核其系统,以识别之前创建的资源可能存在安全漏洞,即使所有用户只启用了读取访问权限。

流程

  1. 作为云管理员,登录 undercloud 并为策略覆盖创建一个文件。例如:

    Copy to Clipboard Toggle word wrap
    $ cat open-up-glance-api-metadef.yaml
  2. 配置策略覆盖文件,以允许 metadef API 对所有用户进行读写访问:

    Copy to Clipboard Toggle word wrap
    GlanceApiPolicies: {
        glance-metadef_default: { key: 'metadef_default', value: '' },
        glance-get_metadef_namespace: { key: 'get_metadef_namespace', value: 'rule:metadef_default' },
        glance-get_metadef_namespaces: { key: 'get_metadef_namespaces', value: 'rule:metadef_default' },
        glance-modify_metadef_namespace: { key: 'modify_metadef_namespace', value: 'rule:metadef_default' },
        glance-add_metadef_namespace: { key: 'add_metadef_namespace', value: 'rule:metadef_default' },
        glance-delete_metadef_namespace: { key: 'delete_metadef_namespace', value: 'rule:metadef_default' },
        glance-get_metadef_object: { key: 'get_metadef_object', value: 'rule:metadef_default' },
        glance-get_metadef_objects: { key: 'get_metadef_objects', value: 'rule:metadef_default' },
        glance-modify_metadef_object: { key: 'modify_metadef_object', value: 'rule:metadef_default' },
        glance-add_metadef_object: { key: 'add_metadef_object', value: 'rule:metadef_default' },
        glance-delete_metadef_object: { key: 'delete_metadef_object', value: 'rule:metadef_default' },
        glance-list_metadef_resource_types: { key: 'list_metadef_resource_types', value: 'rule:metadef_default' },
        glance-get_metadef_resource_type: { key: 'get_metadef_resource_type', value: 'rule:metadef_default' },
        glance-add_metadef_resource_type_association: { key: 'add_metadef_resource_type_association', value: 'rule:metadef_default' },
        glance-remove_metadef_resource_type_association: { key: 'remove_metadef_resource_type_association', value: 'rule:metadef_default' },
        glance-get_metadef_property: { key: 'get_metadef_property', value: 'rule:metadef_default' },
        glance-get_metadef_properties: { key: 'get_metadef_properties', value: 'rule:metadef_default' },
        glance-modify_metadef_property: { key: 'modify_metadef_property', value: 'rule:metadef_default' },
        glance-add_metadef_property: { key: 'add_metadef_property', value: 'rule:metadef_default' },
        glance-remove_metadef_property: { key: 'remove_metadef_property', value: 'rule:metadef_default' },
        glance-get_metadef_tag: { key: 'get_metadef_tag', value: 'rule:metadef_default' },
        glance-get_metadef_tags: { key: 'get_metadef_tags', value: 'rule:metadef_default' },
        glance-modify_metadef_tag: { key: 'modify_metadef_tag', value: 'rule:metadef_default' },
        glance-add_metadef_tag: { key: 'add_metadef_tag', value: 'rule:metadef_default' },
        glance-add_metadef_tags: { key: 'add_metadef_tags', value: 'rule:metadef_default' },
        glance-delete_metadef_tag: { key: 'delete_metadef_tag', value: 'rule:metadef_default' },
        glance-delete_metadef_tags: { key: 'delete_metadef_tags', value: 'rule:metadef_default' }
      }
    注意

    您必须将所有 metadef 策略配置为使用 rule:metadeta_default

  3. 在部署 overcloud 时,将新策略文件包含在部署命令中,并使用 -e 选项:

    Copy to Clipboard Toggle word wrap
    $ openstack overcloud deploy -e open-up-glance-api-metadef.yaml

第 2 章 管理镜像

Image 服务(glance)为磁盘和服务器镜像提供发现、注册和交付服务。它提供复制或快照服务器镜像并立即存储它的功能。您可以将存储的镜像用作模板,比安装服务器操作系统和单独配置服务,快速、一致地编写新的服务器。

2.1. 创建镜像

要创建镜像,您可以使用 Red Hat Enterprise Linux (RHEL)基于内核的虚拟机(KVM)客户机镜像,或者您可以使用 RHEL ISO 文件或 Windows ISO 文件以 QCOW2 格式手动创建 Red Hat OpenStack Platform (RHOSP)兼容镜像。

2.1.1. 在 Red Hat OpenStack Platform 中使用 KVM 客户机镜像

您可以使用以下可用的 Red Hat Enterprise Linux (RHEL)基于内核的虚拟机(KVM)客户机 QCOW2 镜像之一:

这些镜像使用 cloud-init 配置,且必须利用 EC2 兼容元数据服务来调配 SSH 密钥才能正常工作。

就绪的 Windows KVM 客户机 QCOW2 镜像不可用。

注意

对于 KVM 客户机镜像:

  • 镜像中的 root 帐户被取消激活,但 sudo 访问权限被赋予一个名为 cloud-user 的特殊用户。
  • 此映像没有设置 root 密码。

通过将 !! 放置到第二个字段中,将 root 密码锁定在 /etc/shadow 中。

对于 Red Hat OpenStack Platform (RHOSP)实例,从 RHOSP 仪表板或命令行生成 SSH 密钥对,并使用该密钥组合以 root 用户身份对实例执行 SSH 公钥身份验证。

当您启动实例时,此公钥会注入到其中。然后,您可以使用创建密钥对时下载的私钥进行身份验证。

2.1.2. 创建自定义 Red Hat Enterprise Linux 或 Windows 镜像

要创建自定义 Red Hat Enterprise Linux (RHEL)或 Windows 镜像,请确保您有以下先决条件。

先决条件

  • 创建镜像的 Linux 主机。这可以是您可以在其中安装和运行 Linux 软件包的任何机器,但 undercloud 或 overcloud 除外。
  • advanced-virt 存储库已启用:

    Copy to Clipboard Toggle word wrap
    $ sudo subscription-manager repos --enable=advanced-virt-for-rhel-8-x86_64-rpms
  • 安装 virt-manager 应用程序以拥有创建客户机操作系统所需的所有软件包:

    Copy to Clipboard Toggle word wrap
    $ sudo dnf module install -y virt
  • 已安装 libguestfs-tools 软件包,以便具有访问和修改虚拟机镜像的一组工具:

    Copy to Clipboard Toggle word wrap
    $ sudo dnf install -y libguestfs-tools-c
  • RHEL 9 或 8 ISO 文件或者 Windows ISO 文件。有关 RHEL ISO 文件的更多信息,请参阅 RHEL 9.0 Binary DVDRHEL 8.6 Binary DVD。如果您没有 Windows ISO 文件,请参阅 Microsoft Evaluation Center 以下载评估镜像。
  • 文本编辑器(如果您想更改 kickstart 文件(仅限 RHEL)。
重要

如果在 undercloud 上安装 libguestfs-tools 软件包,请禁用 iscsid.socket,以避免与 undercloud 上的 tripleo_iscsid 服务的端口冲突:

Copy to Clipboard Toggle word wrap
$ sudo systemctl disable --now iscsid.socket

2.1.3. 创建 Red Hat Enterprise Linux 9 镜像

使用 Red Hat Enterprise Linux (RHEL) 9 ISO 文件,以 QCOW2 格式手动创建 Red Hat OpenStack Platform (RHOSP)兼容镜像。

注意

您必须在主机上使用 [root@host] ""运行所有命令。

流程

  1. 使用 virt-install 开始安装:

    Copy to Clipboard Toggle word wrap
    [root@host]# virt-install \
      --virt-type kvm \
      --name <rhel9> \
      --ram <2048> \
      --cdrom </var/lib/libvirt/images/rhel-9.0-x86_64-dvd.iso> \
      --disk <rhel9.qcow2>,format=qcow2,size=<10> \
      --network=bridge:virbr0 \
      --graphics vnc,listen=127.0.0.1 \
      --noautoconsole \
      --os-variant=<rhel9.0>
    • 将尖括号 &lt ;& gt; 中的值替换为 RHEL 9 镜像的正确值。

      这个命令启动一个实例并启动安装过程。

      注意

      如果实例没有自动启动,请运行 virt-viewer 命令来查看控制台:

      Copy to Clipboard Toggle word wrap
      [root@host]# virt-viewer <rhel9>
  2. 配置实例:

    1. 在初始安装程序引导菜单中,选择 Install Red Hat Enterprise Linux 9
    2. 选择相应的 LanguageKeyboard 选项。
    3. 当系统提示输入安装所使用的设备类型时,请选择" 自动探测到的安装介质 "。
    4. 当系统提示安装目的地类型时,请选择 Local Standard Disks。对于其他存储选项,请选择 Automatically configure partitioning
    5. 选择 基本服务器 安装,它将安装 SSH 服务器。
    6. 对于网络和主机名,选择 eth0 作为网络,然后选择设备的主机名。默认主机名是 localhost.localdomain
    7. Root Password 字段中输入密码,并在 Confirm 字段中再次输入相同的密码。

      结果
      安装过程将完成,并显示 Complete! 屏幕。
  3. 安装完成后,重启实例并以 root 用户身份登录。
  4. 更新 /etc/sysconfig/network-scripts/ifcfg-eth0 文件,使其只包含以下值:

    Copy to Clipboard Toggle word wrap
    TYPE=Ethernet
    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    NM_CONTROLLED=no
  5. 重启机器。
  6. 使用 Content Delivery Network 注册机器。

    Copy to Clipboard Toggle word wrap
    # sudo subscription-manager register
    # sudo subscription-manager attach --pool=Valid-Pool-Number-123456
    # sudo subscription-manager repos --enable=rhel-9-server-rpms
  7. 更新系统:

    Copy to Clipboard Toggle word wrap
    # dnf -y update
  8. 安装 cloud-init 软件包:

    Copy to Clipboard Toggle word wrap
    # dnf install -y cloud-utils-growpart cloud-init
  9. 编辑 /etc/cloud/cloud.cfg 配置文件并在 cloud_init_modules 下添加以下内容:

    Copy to Clipboard Toggle word wrap
    - resolv-conf

    resolv-conf 选项在第一次启动时自动配置 resolv.conf 文件。此文件包含与实例相关的信息,如 名称服务器 和其他选项。

  10. /etc/sysconfig/network 中添加以下行,以避免访问 EC2 元数据服务时出现问题:

    Copy to Clipboard Toggle word wrap
    NOZEROCONF=yes
  11. 要确保控制台信息会在仪表板的 Log 标签页和 nova console-log 输出中显示,请在 /etc/default/grub 文件中添加以下引导选项:

    Copy to Clipboard Toggle word wrap
    GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8"
  12. 运行 grub2-mkconfig 命令:

    Copy to Clipboard Toggle word wrap
    # grub2-mkconfig -o /boot/grub2/grub.cfg

    输出如下:

    Copy to Clipboard Toggle word wrap
    Generating grub configuration file ...
    Found linux image: /boot/vmlinuz-3.10.0-229.9.2.el9.x86_64
    Found initrd image: /boot/initramfs-3.10.0-229.9.2.el9.x86_64.img
    Found linux image: /boot/vmlinuz-3.10.0-121.el9.x86_64
    Found initrd image: /boot/initramfs-3.10.0-121.el9.x86_64.img
    Found linux image: /boot/vmlinuz-0-rescue-b82a3044fb384a3f9aeacf883474428b
    Found initrd image: /boot/initramfs-0-rescue-b82a3044fb384a3f9aeacf883474428b.img
    done
  13. 取消注册实例,以便生成的镜像不包含此实例的订阅详情:

    Copy to Clipboard Toggle word wrap
    # subscription-manager repos --disable=*
    # subscription-manager unregister
    # dnf clean all
  14. 关闭实例:

    Copy to Clipboard Toggle word wrap
    # poweroff
  15. 使用 virt-sysprep 命令重置和清理镜像,以便它可用于在没有问题的情况下创建实例:

    Copy to Clipboard Toggle word wrap
    [root@host]# virt-sysprep -d <rhel9>
  16. 通过将磁盘镜像中的任何可用空间转换为主机中的可用空间来减小镜像大小:

    Copy to Clipboard Toggle word wrap
    [root@host]# virt-sparsify \
      --compress <rhel9.qcow2> <rhel9-cloud.qcow2>

    这个命令会在运行命令的位置创建一个新的 < rhel9-cloud.qcow 2> 文件。

    注意

    您必须根据应用到实例的类别中的磁盘空间,手动调整实例的分区大小。

& lt;rhel9-cloud.qcow 2> 镜像文件已准备好上传到镜像服务。有关将此镜像上传到 RHOSP 部署的更多信息,请参阅 上传镜像

2.1.4. 创建 Red Hat Enterprise Linux 8 镜像

使用 Red Hat Enterprise Linux (RHEL) 8 ISO 文件,以 QCOW2 格式手动创建 Red Hat OpenStack Platform (RHOSP)兼容镜像。

注意

您必须在主机上使用 [root@host] ""运行所有命令。

流程

  1. 使用 virt-install 开始安装:

    Copy to Clipboard Toggle word wrap
    [root@host]# virt-install \
      --virt-type kvm \
      --name <rhel86-cloud-image> \
      --ram <2048> \
      --vcpus <2> \
      --disk <rhel86.qcow2>,format=qcow2,size=<10> \
      --location <rhel-8.6-x86_64-boot.iso> \
      --network=bridge:virbr0 \
      --graphics vnc,listen=127.0.0.1 \
      --noautoconsole \
      --os-variant <rhel8.6>
    • 将尖括号 &lt ;& gt; 中的值替换为 RHEL 8 镜像的正确值。

      这个命令启动一个实例并启动安装过程。

      注意

      如果实例没有自动启动,请运行 virt-viewer 命令来查看控制台:

      Copy to Clipboard Toggle word wrap
      [root@host]# virt-viewer <rhel86-cloud-image>
  2. 配置实例:

    1. 在初始安装程序引导菜单中,选择" 安装或升级现有系统 "并按照安装提示进行操作。接受默认值。

      磁盘安装程序提供在安装前测试安装介质的选项。选择 OK 以运行 test 或 Skip 以继续测试。

    2. 选择相应的 LanguageKeyboard 选项。
    3. 当提示输入安装所使用的设备类型时,请选择 基本存储设备
    4. 为您的设备选择一个主机名。默认主机名是 localhost.localdomain
    5. 设置 时区和 root 密码。
    6. 根据磁盘上的空格,从需要安装类型的选项中选择 您需要的安装类型? 窗口。
    7. 选择 基本服务器 安装,它将安装 SSH 服务器。
    8. 安装过程完成并显示 Congratulations,则代表您的 Red Hat Enterprise Linux 安装已完成
  3. 重新启动实例,然后以 root 用户身份登录。
  4. 更新 /etc/sysconfig/network-scripts/ifcfg-eth0 文件,使其只包含以下值:

    Copy to Clipboard Toggle word wrap
    TYPE=Ethernet
    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    NM_CONTROLLED=no
  5. 重启机器。
  6. 使用 Content Delivery Network 注册机器:

    Copy to Clipboard Toggle word wrap
    # sudo subscription-manager register
    # sudo subscription-manager attach --pool=Valid-Pool-Number-123456
    # sudo subscription-manager repos --enable=rhel-8-server-rpms
  7. 更新系统:

    Copy to Clipboard Toggle word wrap
    # dnf -y update
  8. 安装 cloud-init 软件包:

    Copy to Clipboard Toggle word wrap
    # dnf install -y cloud-utils-growpart cloud-init
  9. 编辑 /etc/cloud/cloud.cfg 配置文件,并在 cloud_init_modules 下添加以下内容。

    Copy to Clipboard Toggle word wrap
    - resolv-conf

    resolv-conf 选项在第一次启动时自动配置 resolv.conf 文件。此文件包含与实例相关的信息,如 名称服务器 和其他选项。

  10. 要防止网络问题,请创建 /etc/udev/rules.d/75-persistent-net-generator.rules

    Copy to Clipboard Toggle word wrap
    # echo "#" > /etc/udev/rules.d/75-persistent-net-generator.rules

    这可防止 /etc/udev/rules.d/70-persistent-net.rules 文件被创建。如果创建了 /etc/udev/rules.d/70-persistent-net.rules 文件,当您从快照引导时,网络可能无法正常工作,因为网络接口是作为 eth1 而不是 eth0 创建的,并且没有分配 IP 地址。

  11. /etc/sysconfig/network 中添加以下行,以避免访问 EC2 元数据服务时出现问题:

    Copy to Clipboard Toggle word wrap
    NOZEROCONF=yes
  12. 要确保控制台信息会在仪表板的 Log 标签页和 nova console-log 输出中显示,请在 /etc/grub.conf 文件中添加以下引导选项:

    Copy to Clipboard Toggle word wrap
    console=tty0 console=ttyS0,115200n8
  13. 取消注册虚拟机,以便生成的镜像不包含此实例的相同订阅详情:

    Copy to Clipboard Toggle word wrap
    # subscription-manager repos --disable=*
    # subscription-manager unregister
    # dnf clean all
  14. 关闭实例:

    Copy to Clipboard Toggle word wrap
    # poweroff
  15. 使用 virt-sysprep 命令重置和清理镜像,以便它可用于在没有问题的情况下创建实例:

    Copy to Clipboard Toggle word wrap
    [root@host]# virt-sysprep -d <rhel86-cloud-image>
  16. 使用 virt-sparsify 命令减少镜像大小。这个命令将磁盘镜像中的任何可用空间重新转换为主机中的可用空间:

    Copy to Clipboard Toggle word wrap
    [root@host]# virt-sparsify \
      --compress <rhel86.qcow2> <rhel86-cloud.qcow2>

    这个命令会在运行命令的位置创建一个新的 < rhel86-cloud.qcow 2> 文件。

    注意

    您必须根据应用到实例的类别中的磁盘空间,手动调整实例的分区大小。

& lt;rhel86-cloud.qcow 2> 镜像文件已准备好上传到镜像服务。有关将此镜像上传到 RHOSP 部署的更多信息,请参阅 上传镜像

2.1.5. 创建 Windows 镜像

使用 Windows ISO 文件,以 QCOW2 格式手动创建兼容 Red Hat OpenStack Platform (RHOSP)兼容镜像。

注意

您必须在主机上使用 [root@host] ""运行所有命令。

流程

  1. 使用 virt-install 开始安装:

    Copy to Clipboard Toggle word wrap
    [root@host]# virt-install \
        --name=<name> \
        --disk size=<size> \
        --cdrom=<path> \
        --os-type=windows \
        --network=bridge:virbr0 \
        --graphics spice \
        --ram=<ram>
    • 替换 virt-install 参数的值:

      • <name > rhacm-5-4 Windows 实例具有的名称。
      • <size& gt; HEKETI-wagondisk 大小(以 GB 为单位)。
      • <path > swig- swig the path to the Windows install ISO file.
      • <RAM > HEKETI-5-4the 请求 RAM 量(以 MB 为单位)。

        注意

        the -os-type=windows 参数确保为 Windows 客户机正确配置了时钟,并启用其 Hyper-V enlightenment 功能。在将镜像上传到镜像服务(glance)之前,还必须在镜像元数据中设置 os_type=windows

  2. virt-install 命令将客户机镜像保存为 /var/lib/libvirt/images/<name& gt; .qcow2。如果要将客户机镜像保留在其他位置,请更改 the- disk 选项的参数

    Copy to Clipboard Toggle word wrap
    --disk path=<filename>,size=<size>
    • <filename > 替换为存储实例镜像的文件名称,以及可选的路径。例如,path=win8.qcow2,size=8 在当前工作目录中创建一个名为 win8.qcow2 的 8 GB 文件。

      提示

      如果客户机没有自动启动,请运行 virt-viewer 命令来查看控制台:

      Copy to Clipboard Toggle word wrap
      [root@host]# virt-viewer <name>

      有关如何安装 Windows 的更多信息,请参阅相关的 Microsoft 文档。

  3. 要允许新安装的 Windows 系统使用虚拟化硬件,您可能需要安装 VirtIO 驱动程序。为此,请将镜像作为 CD-ROM 驱动器附加到 Windows 实例来安装镜像。要安装 virtio-win 软件包,您必须将 VirtIO ISO 镜像添加到实例中,并安装 VirtIO 驱动程序。如需更多信息,请参阅 配置和管理虚拟化 中的 为 Windows 虚拟机安装 KVM 半虚拟驱动程序
  4. 要完成配置,请在 Windows 系统上下载并执行 Cloudbase-Init。在安装 Cloudbase-Init 结束时,选择 Run SysprepShutdown 复选框。Sysprep 工具通过生成 OS ID (供某些 Microsoft 服务使用)使客户机是唯一的。

    重要

    红帽不提供 Cloudbase-Init 的技术支持。如果您遇到问题,请参阅 Cloudbase Solutions 联系

当 Windows 系统关闭时,&lt ;name>.qcow2 镜像文件已准备好上传到镜像服务。有关将此镜像上传到 RHOSP 部署的更多信息,请参阅 上传镜像

2.1.5.1. 元数据属性

Compute 服务(nova)已弃用对使用 libosinfo 数据设置默认设备模型的支持。反之,使用以下镜像元数据属性为实例配置最佳虚拟硬件:

  • os_distro
  • os_version
  • hw_cdrom_bus
  • hw_disk_bus
  • hw_scsi_model
  • hw_vif_model
  • hw_video_model
  • hypervisor_type

有关这些元数据属性的更多信息,请参阅 镜像配置参数

2.1.6. 为 UEFI 安全引导创建镜像

当 overcloud 包含 UEFI 安全引导 Compute 节点时,您可以创建一个安全引导实例镜像,供云用户用来启动安全引导实例。

流程

  1. 为 UEFI 安全引导创建新镜像:

    Copy to Clipboard Toggle word wrap
    $ openstack image create --file <base_image_file> uefi_secure_boot_image
    • <base_image_file > 替换为支持 UEFI 和 GUID 分区表(GPT)标准的镜像文件,并包括 EFI 系统分区。
  2. 如果默认机器类型不是 q35,则机器类型设置为 q35

    Copy to Clipboard Toggle word wrap
    $ openstack image set --property hw_machine_type=q35 uefi_secure_boot_image
  3. 指定实例必须调度到 UEFI 安全引导主机上:

    Copy to Clipboard Toggle word wrap
    $ openstack image set \
     --property hw_firmware_type=uefi \
     --property os_secure_boot=required \
     uefi_secure_boot_image

2.2. 上传镜像

将镜像上传到 Red Hat OpenStack Platform (RHOSP)镜像服务(glance)。

流程

  • 使用 glance image-create 命令和 property 选项上传镜像。

    例如:

    Copy to Clipboard Toggle word wrap
    $ glance image-create --name <NAME> \
        --is-public true --disk-format qcow2 \
        --container-format bare \
        --file <IMAGE_FILE> \
        --property <IMAGE_METADATA>

2.3. 更新镜像

更新镜像。

流程

  • 使用 glance image-update 命令和 property 选项来更新镜像。

    例如:

    Copy to Clipboard Toggle word wrap
    $ glance image-update IMG-UUID \
        --property architecture=x86_64

2.4. 导入镜像

您可以使用以下两种方法之一将镜像导入到镜像服务(glance):

  • 使用 web-download 从 URI 导入镜像。
  • 使用 glance-direct 从本地文件系统导入镜像。

web-download 方法被默认启用。云管理员配置导入方法。您可以运行 glance import-info 命令来列出可用的导入选项。

2.4.1. 从远程 URI 导入镜像

您可以使用 web-download 方法从远程 URI 复制镜像。

  1. 创建镜像并指定要导入的镜像的 URI:

    Copy to Clipboard Toggle word wrap
    $ glance image-create-via-import \
        --container-format <CONTAINER FORMAT> \
        --disk-format <DISK-FORMAT> \
        --name <NAME> \
        --import-method web-download \
        --uri <URI>
    • <CONTAINER FORMAT > 替换为您为镜像设置的容器格式(None, ami, ari, aki, bare, ovf, ova, docker)。
    • <DISK-FORMAT > 替换为您为镜像设置的磁盘格式(None, ami, ari, aki, vhd, vhdx, vmdk, raw, qcow2, vdi, iso, ploop)。
    • <NAME > 替换为您的镜像的描述性名称。
    • <URI > 替换为您的镜像的 URI。
  2. 您可以使用 glance image-show <IMAGE_ID&gt; 命令检查镜像的可用性。

    • <IMAGE_ID > 替换为您在镜像创建过程中提供的 ID。

镜像服务 Web 下载 方法使用两阶段过程来执行导入:

  1. Web 下载 方法创建镜像记录。
  2. Web 下载 方法从指定的 URI 检索镜像。

URI 取决于可选的 denylist 和 allowlist 过滤。

Image Property Injection 插件可能会将元数据属性注入镜像。这些注入的属性决定了镜像实例在哪些计算节点上启动。

2.4.2. 从本地卷导入镜像

glance-direct 方法创建镜像记录,它会生成镜像 ID。镜像从本地卷上传到镜像服务后,它将存储在暂存区域中,并在通过任何配置的检查后激活。在高可用性(HA)配置中使用时,glance-direct 方法需要一个共享的暂存区域。

注意

如果不存在常见的暂存区域,使用 glance-direct 方法的镜像上传在 HA 环境中可能会失败。在 HA 主动环境中,API 调用分布到镜像服务控制器。下载 API 调用可以发送到与 API 调用不同的控制器,以上传镜像。

glance-direct 方法使用三个不同的调用来导入镜像:

  • glance image-create
  • glance image-stage
  • glance image-import

您可以使用 glance image-create-via-import 命令在一个命令中执行所有三个调用:

Copy to Clipboard Toggle word wrap
$ glance image-create-via-import \
    --container-format <CONTAINER FORMAT> \
    --disk-format <DISK-FORMAT> \
    --name <NAME> \
    --file </PATH/TO/IMAGE>
  • 将 & lt;CONTAINER FORMAT&gt; , <DISK-FORMAT & gt; , <NAME > , 和 </PATH/TO/IMAGE > 替换为您的镜像的相关值。

镜像从暂存区域移到后端位置后,会列出镜像。但是,可能需要过些时间,镜像才会变为活动状态。

您可以使用 glance image-show <IMAGE_ID&gt; 命令检查镜像的可用性。

  • <IMAGE_ID 替换为您在镜像创建过程中提供的 ID。

2.5. 删除镜像

流程

  • 使用 glance image-delete 命令删除一个或多个镜像:

    Copy to Clipboard Toggle word wrap
    $ glance image-delete <IMAGE_ID> [<IMAGE_ID> ...]
    • 将 <IMAGE_ID> 替换为您要删除的镜像的 ID。

      注意

      glance image-delete 命令永久删除镜像以及镜像的所有副本,以及镜像实例和元数据。

2.6. 隐藏或取消隐藏镜像

您可以从提供给用户的正常列表中隐藏公共镜像。例如,您可以隐藏过时的 CentOS 7 镜像,仅显示最新版本来简化用户体验。用户可以发现和使用隐藏的镜像。

隐藏镜像:

Copy to Clipboard Toggle word wrap
glance image-update <image_id> --hidden 'true'

要创建隐藏镜像,请将-- hidden 参数添加到 glance image-create 命令中。

取消删除镜像:

Copy to Clipboard Toggle word wrap
glance image-update <image_id> --hidden 'false'
显示隐藏的镜像

列出隐藏的镜像:

Copy to Clipboard Toggle word wrap
glance image-list --hidden 'true'

2.7. 启用镜像转换

您可以通过启用 GlanceImageImportPlugins 参数,将 QCOW2 镜像上传到镜像服务(glance)。然后,您可以将 QCOW2 镜像转换为 RAW 格式。

注意

当使用 Red Hat Ceph Storage RADOS Block Device (RBD)来存储镜像并引导 Nova 实例时,镜像转换会自动启用。

要启用镜像转换,请创建一个包含以下参数值的环境文件。在 openstack overcloud deploy 命令中包含带有 a -e 选项的新环境文件:

Copy to Clipboard Toggle word wrap
parameter_defaults:
  GlanceImageImportPlugins:'image_conversion'

使用镜像服务命令行客户端进行镜像管理。

2.7.1. 将镜像转换为 RAW 格式

Red Hat Ceph Storage 可以存储,但不支持使用 QCOW2 镜像来托管虚拟机(VM)磁盘。

当您上传 QCOW2 镜像并从其中创建虚拟机时,计算节点会下载镜像,将镜像转换为 RAW,并将它重新上传到 Ceph,然后使用它。这个过程会影响创建虚拟机所需的时间,特别是在并行虚拟机创建过程中。

例如,当您同时创建多个虚拟机时,将转换的镜像上传到 Ceph 集群可能会影响已在运行的工作负载。上传过程可能会耗尽 IOPS 工作负载并妨碍存储响应。

要在 Ceph 中更有效地引导虚拟机(临时后端或从卷引导),glance 镜像格式必须是 RAW。

流程

  1. 将镜像转换为 RAW 可能会生成大于原始 QCOW2 镜像文件的镜像。在转换前运行以下命令以确定最终 RAW 镜像大小:

    Copy to Clipboard Toggle word wrap
    qemu-img info <image>.qcow2
  2. 将镜像从 QCOW2 转换为 RAW 格式:

    Copy to Clipboard Toggle word wrap
    qemu-img convert -p -f qcow2 -O raw <original qcow2 image>.qcow2 <new raw image>.raw
2.7.1.1. 在 Image 服务(glance)中配置磁盘格式

您可以使用 GlanceDiskFormats 参数,将 Image 服务(glance)配置为启用或禁用磁盘格式。

流程

  1. stack 用户身份登录 undercloud 主机。
  2. 提供 undercloud 凭证文件:

    Copy to Clipboard Toggle word wrap
    $ source ~/stackrc
  3. 在环境文件中包含 GlanceDiskFormats 参数,如 glance_disk_formats.yaml

    Copy to Clipboard Toggle word wrap
    parameter_defaults:
      GlanceDiskFormats:
        - <disk_format>
    • 例如,使用以下配置来仅启用 RAW 和 ISO 磁盘格式:

      Copy to Clipboard Toggle word wrap
      parameter_defaults:
        GlanceDiskFormats:
        - raw
        - iso
    • 使用以下示例配置拒绝 QCOW2 磁盘镜像:

      Copy to Clipboard Toggle word wrap
      parameter_defaults:
        GlanceDiskFormats:
        - raw
        - iso
        - aki
        - ari
        - ami
  4. openstack overcloud deploy 命令中包含包含新配置的环境文件,以及与您的环境相关的任何其他环境文件:

    Copy to Clipboard Toggle word wrap
    $ openstack overcloud deploy --templates \
      -e <overcloud_environment_files> \
      -e <new_environment_file> \
      …
    • <overcloud_environment_files > 替换为属于部署的环境文件列表。
    • <new_environment_file > 替换为包含新配置的环境文件。

有关 RHOSP 中可用磁盘格式的更多信息,请参阅 镜像配置参数

2.7.2. 以 RAW 格式存储镜像

启用 GlanceImageImportPlugins 参数后,运行以下命令以 RAW 格式存储之前创建的镜像:

Copy to Clipboard Toggle word wrap
$ glance image-create-via-import \
    --disk-format qcow2 \
    --container-format bare \
    --name NAME \
    --visibility public \
    --import-method web-download \
    --uri http://server/image.qcow2
  • 对于 名称,将 NAME 替换为映像的名称;这是将出现在 glance image-list 中的名称。
  • 对于- uri,将 http://server/image.qcow2 替换为 QCOW2 镜像的位置和文件名。
注意

这个命令会创建镜像记录,并使用 web-download 方法导入它。glance-api 在导入过程中从 -uri 位置下载镜像。如果 web-download 不可用,则 glanceclient 无法自动下载镜像数据。运行 glance import-info 命令,以列出可用的镜像导入方法。

第 3 章 镜像导入和共享暂存

OpenStack Image 服务(glance)的默认设置由安装 Red Hat OpenStack Platform (RHOSP)时使用的 heat 模板决定。Image 服务 heat 模板为 deployment/glance/glance-api-container-puppet.yaml

您可以使用以下方法导入镜像:

  • web-download :使用 web-download 方法从 URL 导入镜像。
  • glance-direct :使用 glance-direct 方法从本地卷中导入镜像。

3.1. 创建并部署 glance-settings.yaml 文件

使用自定义环境文件来配置导入参数。这些参数覆盖核心 heat 模板集合中存在的默认值。示例环境内容包含可互操作性镜像导入的参数。

Copy to Clipboard Toggle word wrap
parameter_defaults:
  # Configure NFS backend
  GlanceBackend: file
  GlanceNfsEnabled: true
  GlanceNfsShare: 192.168.122.1:/export/glance

  # Enable glance-direct import method
  GlanceEnabledImportMethods: glance-direct,web-download

  # Configure NFS staging area (required for glance-direct import method)
  GlanceStagingNfsShare: 192.168.122.1:/export/glance-staging

GlanceBackendGlanceNfsEnabledGlanceNfsShare 参数在 Overcloud 参数 指南中定义。

使用两个新参数进行互操作性镜像导入,以定义导入方法和共享的 NFS 暂存区域。

GlanceEnabledImportMethods
定义可用的导入方法、web-download (默认)和 glance-direct。只有在您要启用 web-download 以外的其他方法时,才需要此参数。
GlanceStagingNfsShare
配置 glance-direct 导入方法使用的 NFS 暂存区域。此空间可以在高可用性集群配置中的节点之间共享。如果要使用此参数,还必须将 GlanceNfsEnabled 参数设置为 true

流程

  1. 创建一个新文件,如 glance-settings.yaml。使用示例中的语法来填充此文件。
  2. openstack overcloud deploy 命令中包含 glance-settings.yaml 文件,以及与部署相关的任何其他环境文件:

    Copy to Clipboard Toggle word wrap
    $ openstack overcloud deploy --templates -e glance-settings.yaml

有关使用环境文件的更多信息,请参阅 Director 安装和使用 指南。

3.2. 控制镜像 web-import 源

您可以通过在可选的 glance-image-import.conf 文件中添加 URI blocklists 和 allowlists 来限制 web-import 镜像下载的来源。

您可以在三个级别允许或阻止镜像源 URI:

  • scheme (allowed_schemes, disallowed_schemes)
  • Host (allowed_hosts, disallowed_hosts)
  • port (allowed_ports, disallowed_ports)

如果您在任何级别上同时指定了 allowlist 和 blocklist,则允许列表会被遵守,并忽略 blocklist。

Image 服务(glance)应用以下决策逻辑来验证镜像源 URI:

  1. 检查方案。

    1. 缺少方案:拒绝
    2. 如果存在允许列表,且允许列表:reject 中不存在方案。否则,跳过 C 并继续 2。
    3. 如果存在 blocklist,且方案存在于 blocklist: reject 中。
  2. 选中主机名。

    1. 缺少主机名:拒绝
    2. 如果存在允许列表,并且允许列表:reject 的主机名不存在。否则,跳过 C 并继续到 3。
    3. 如果存在 blocklist,并且主机名存在于 blocklist: reject 中。
  3. 如果 URI 中有一个端口,则会检查端口。

    1. 如果有允许列表,并且允许列表: reject 中不存在该端口。否则,跳过 B 并继续 4。
    2. 如果存在 blocklist,并且 blocklist: reject 中的端口存在。
  4. URI 被接受为有效。

如果允许某个方案,可以通过将其添加到允许列表中,或不将其添加到 blocklist 中,任何使用该方案的默认端口的 URI 都会被允许包括在 URI 中。如果在 URI 中包含端口,则根据默认的决策逻辑来验证 URI。

3.3. 镜像导入示例

例如,FTP 的默认端口为 21。因为 ftp 是一个允许列表的方案,所以允许这个 URL :ftp://example.org/some/resource。但是,因为 21 不在端口允许列表中,指向同一资源的 URL 将被拒绝 :ftp://example.org:21/some/resource。

Copy to Clipboard Toggle word wrap
allowed_schemes = [http,https,ftp]
disallowed_schemes = []
allowed_hosts = []
disallowed_hosts = []
allowed_ports = [80,443]
disallowed_ports = []

3.4. 默认镜像导入块列表和允许列表设置

glance-image-import.conf 文件是一个可选文件,包含以下默认选项:

  • allowed_schemes - [http, https]
  • disallowed_schemes - empty list
  • allowed_hosts - 空列表
  • disallowed_hosts - 空列表
  • allowed_ports - [80, 443]
  • disallowed_ports - empty list

如果您使用默认值,最终用户只能使用 httphttps 方案访问 URI。用户可以指定的唯一端口为 80443。用户不必指定端口,但如果是端口,则必须为 80443。

您可以在镜像服务源代码树的 etc/ 子目录中找到 glance-image-import.conf 文件。确保您正在查找 Red Hat OpenStack Platform 发行版本的正确分支。

3.5. 在镜像导入时注入元数据,以控制虚拟机启动的位置

最终用户可以将镜像上传到镜像服务,并使用这些镜像来启动虚拟机。这些用户提供的(非 admin)镜像必须在特定的计算节点上启动。将实例分配给计算节点由镜像元数据属性控制。

Image Property Injection 插件在导入过程中将元数据属性注入镜像。通过编辑 glance-image-import.conf 文件的 [image_import_opts] 和 [inject_metadata_properties] 部分来指定属性。

要启用 Image Property Injection 插件,请将以下行添加到 [image_import_opts] 部分:

Copy to Clipboard Toggle word wrap
[image_import_opts]
image_import_plugins = [inject_image_metadata]

要将元数据注入限制为某一组用户提供的镜像,请设置 ignore_user_roles 参数。例如,使用以下配置将 property1 的值和 property2 的两个值注入任何非 admin 用户下载的镜像中。

Copy to Clipboard Toggle word wrap
[DEFAULT]
[image_conversion]
[image_import_opts]
image_import_plugins = [inject_image_metadata]
[import_filtering_opts]
[inject_metadata_properties]
ignore_user_roles = admin
inject = PROPERTY1:value,PROPERTY2:value;another value

参数 ignore_user_roles 是插件忽略的 Identity 服务(keystone)角色的逗号分隔列表。这意味着,如果进行镜像导入调用的用户具有任何这些角色,则该插件不会将任何属性注入镜像中。

参数 注入 是一个以逗号分隔的属性和值列表,这些值注入到所导入镜像的镜像记录中。每个属性和值都必须用冒号 (':') 括起并分隔。

您可以在镜像服务源代码树的 etc/ 子目录中找到 glance-image-import.conf 文件。确保您正在查找 Red Hat OpenStack Platform 发行版本的正确分支。

第 4 章 具有多个存储的镜像服务

Red Hat OpenStack Platform (RHOSP)镜像服务(glance)支持使用带有分布式边缘架构的多个存储,以便您可以在每个边缘站点都有镜像池。

4.1. 多个存储上的镜像副本

当您将多个存储与分布式边缘架构搭配使用时,您可以在每个边缘站点中有一个镜像池。您可以在中央站点(也称为 hub 站点)和边缘站点之间复制镜像。

镜像元数据包含每个副本的位置。例如,两个边缘站点中存在的镜像作为单一 UUID 公开,具有三个位置:中央站点加上两个边缘站点。这意味着,您可以有在很多存储上共享单个 UUID 的镜像数据副本。有关位置的更多信息 ,请参阅了解镜像的位置

在每个边缘站点使用 RADOS 块设备(RBD)镜像池,您可以使用 Ceph RBD 写时复制(COW)和快照层技术快速引导虚拟机(VM)。这意味着,您可以从卷引导虚拟机并有实时迁移。有关使用 Ceph RBD 分层的更多信息,请参阅块设备指南中的 Ceph 块设备层

当您在边缘站点启动实例时,所需的镜像会自动复制到本地镜像服务(glance)存储中。但是,您可以使用 glance 多存储在实例启动期间节省时间,从中央镜像存储先复制镜像到边缘站点。

4.2. 存储边缘架构要求

请参阅以下要求,将镜像与边缘站点搭配使用:

  • 每个镜像的副本必须存在于中央位置的 Image 服务(glance)中。
  • 您必须将镜像从边缘站点复制到中央位置,然后才能将其复制到其他边缘站点。
  • 在使用 Red Hat Ceph Storage 部署分布式 Compute 节点(DCN)架构时,您必须使用原始镜像。
  • RADOS 块设备(RBD)必须是镜像、计算和块存储服务的存储驱动程序。
  • 对于每个站点,您必须为 NovaComputeAvailabilityZoneCinderStorageAvailabilityZone 参数分配相同的值。

4.3. 将镜像导入到多个存储

使用可互操作的镜像导入工作流,将镜像数据导入到多个 Ceph Storage 集群中。您可以将镜像导入到本地文件系统上或通过 Web 服务器提供的镜像服务(glance)中。

如果您从 web 服务器导入镜像,可以一次性将镜像导入到多个存储中。如果镜像在 web 服务器上不可用,您可以将本地文件系统中的镜像导入到中央存储中,然后将其复制到其他存储中。如需更多信息,请参阅 将现有镜像复制到多个存储

使用镜像服务命令行客户端进行镜像管理。

重要

始终将镜像副本存储在中央站点上,即使没有实例在中央位置。有关将镜像导入到镜像服务的更多信息,请参阅 分布式计算节点和存储部署指南

4.3.1. 管理镜像导入失败

您可以使用-- allow-failure 参数管理镜像 导入操作的故障:

  • 如果 --allow-failure 参数的值变为 true,则镜像状态会在第一次存储成功导入数据后变为 active。这是默认设置。您可以使用 os_glance_failed_import 镜像属性查看无法导入镜像数据的存储列表。
  • 如果将 --allow-failure 参数的值设置为 false,则镜像状态只有在所有指定的存储成功导入数据后才会变为 active。导入镜像数据的任何存储失败会导致镜像状态 失败。镜像不会导入到任何指定的存储中。

4.3.2. 将镜像数据导入到多个存储中

由于 -allow-failure 参数的默认设置是 true,因此如果某些存储无法导入镜像数据,则不需要在命令中包含该参数。

注意

此流程不需要所有存储成功导入镜像数据。

流程

  • 将镜像数据导入到多个指定的存储:

    Copy to Clipboard Toggle word wrap
    $ glance image-create-via-import \
    --container-format bare \
    --name IMAGE-NAME \
    --import-method web-download \
    --uri URI \
    --stores STORE1,STORE2,STORE3
    • IMAGE-NAME 替换为您要导入的镜像的名称。
    • 使用镜像的 URI 替换 URI。
    • STORE1、 STORE2STORE3 替换为您要导入镜像数据的存储的名称。
    • 或者,将--- stores 替换为 --all-stores true,以将镜像上传到所有存储。
注意

glance image-create-via-import 命令自动将 QCOW2 镜像转换为 RAW 格式,仅适用于 web-download 方法。glance-direct 方法可用,但仅适用于配置了共享文件系统的部署。

4.3.3. 在没有失败的情况下将镜像数据导入到多个存储中

此流程要求所有存储成功导入镜像数据。

流程

  1. 将镜像数据导入到多个指定的存储:

    Copy to Clipboard Toggle word wrap
    $ glance image-create-via-import \
    --container-format bare \
    --name IMAGE-NAME \
    --import-method web-download \
    --uri URI \
    --stores STORE1,STORE2
    • IMAGE-NAME 替换为您要导入的镜像的名称。
    • 使用镜像的 URI 替换 URI。
    • STORE1、 STORE2STORE3 替换为您要复制镜像数据的存储名称。
    • 或者,将--- stores 替换为 --all-stores true,以将镜像上传到所有存储。

      注意

      --allow-failure 参数设置为 false 时,镜像服务不忽略导入镜像数据的存储。您可以使用镜像属性 os_glance_failed_import 查看失败存储的列表。如需更多信息,请参阅 检查镜像导入操作的进度

  2. 验证镜像数据是否已添加到特定存储中:

    Copy to Clipboard Toggle word wrap
    $ glance image-show IMAGE-ID | grep stores

    IMAGE-ID 替换为原始现有镜像的 ID。

    输出显示以逗号分隔的存储列表。

4.3.4. 将镜像数据导入到单个存储

您可以将镜像数据导入到单个存储中。

流程

  1. 将镜像数据导入到单个存储中:

    Copy to Clipboard Toggle word wrap
    $ glance image-create-via-import \
    --container-format bare \
    --name IMAGE-NAME \
    --import-method web-download \
    --uri URI \
    --store STORE
    • IMAGE-NAME 替换为您要导入的镜像的名称。
    • 使用镜像的 URI 替换 URI。
    • STORE 替换为您要复制镜像数据的存储的名称。

      注意

      如果您没有在命令中包含-- stores , ---all-stores, 或-- store 选项,则镜像服务会在中央存储中创建镜像。

  2. 验证镜像数据是否已添加到特定存储中:

    Copy to Clipboard Toggle word wrap
    $ glance image-show IMAGE-ID | grep stores

    IMAGE-ID 替换为原始现有镜像的 ID。

    输出显示以逗号分隔的存储列表。

4.3.5. 检查镜像导入操作的进度

可互操作的镜像导入工作流会按顺序将镜像数据导入到存储中。镜像的大小、存储数量以及中央站点和边缘站点之间的网络速度会影响镜像导入操作完成所需的时间。

您可以通过查看两个镜像属性来跟踪镜像导入的过程,该属性出现在镜像导入操作期间发送的通知中:

  • os_glance_importing_to_stores 属性列出了没有导入镜像数据的存储。在导入开始时,所有请求的存储都显示在列表中。每次存储成功导入镜像数据时,镜像服务都会从列表中删除存储。
  • os_glance_failed_import 属性列出了无法导入镜像数据的存储。此列表在镜像导入操作的开头为空。
注意

在以下流程中,环境有三个 Ceph Storage 集群: 中央存储 和边缘存储 dcn0dcn1

流程

  1. 验证镜像数据是否已添加到特定存储中:

    Copy to Clipboard Toggle word wrap
    $ glance image-show IMAGE-ID

    IMAGE-ID 替换为原始现有镜像的 ID。

    输出显示以逗号分隔的存储列表,类似以下示例片断:

    Copy to Clipboard Toggle word wrap
    | os_glance_failed_import       |
    | os_glance_importing_to_stores | central,dcn0,dcn1
    | status                        | importing
  2. 监控镜像导入操作的状态。当您使用 watch 命令之前,命令输出每两秒刷新一次。

    Copy to Clipboard Toggle word wrap
    $ watch glance image-show IMAGE-ID

    IMAGE-ID 替换为原始现有镜像的 ID。

    在镜像导入操作进行时,操作的状态会改变:

    Copy to Clipboard Toggle word wrap
    | os_glance_failed_import       |
    | os_glance_importing_to_stores | dcn0,dcn1
    | status                        | importing

    显示镜像导入失败,如下例所示:

    Copy to Clipboard Toggle word wrap
    | os_glance_failed_import       | dcn0
    | os_glance_importing_to_stores | dcn1
    | status                        | importing

    操作完成后,状态会变为 active :

    Copy to Clipboard Toggle word wrap
    | os_glance_failed_import       | dcn0
    | os_glance_importing_to_stores |
    | status                        | active

4.4. 将现有镜像复制到多个存储中

通过此功能,您可以使用 Red Hat OpenStack Image 服务(glance)镜像数据将现有镜像复制到边缘的多个 Ceph 存储存储中,通过使用可互操作性的镜像导入工作流。

注意

在将镜像复制到任何边缘站点之前,该镜像必须存在于中央站点。只有镜像所有者或管理员可以将现有镜像复制到新添加的存储中。

您可以通过将 --all-stores 设置为 true,或者指定特定存储来接收镜像数据来复制现有镜像数据。

  • --all-stores 选项的默认设置为 false。如果 --all-storesfalse,您必须指定哪个存储通过使用-- stores STORE1,STORE2 来接收镜像数据。如果镜像数据已存在于任何指定的存储中,则请求会失败。
  • 如果将 all-stores 设置为 true,且镜像数据已存在于某些存储中,则这些存储会排除在列表中。

指定存储接收镜像数据后,镜像服务会将数据从中央站点复制到暂存区域。然后,镜像服务使用互操作性的镜像导入工作流导入镜像数据。如需更多信息,请参阅 导入镜像到多个存储

使用镜像服务命令行客户端进行镜像管理。

重要

红帽建议管理员要仔细避免时间非常接近的镜像复制请求。对同一镜像进行两个严格的 copy-image 操作会导致竞争条件和意外结果。现有镜像数据会保留原样,但将数据复制到新存储会失败。

4.4.1. 将镜像复制到所有存储中

使用以下步骤将镜像数据复制到所有可用的存储中。

流程

  1. 将镜像数据复制到所有可用存储中:

    Copy to Clipboard Toggle word wrap
    $ glance image-import IMAGE-ID \
    --all-stores true \
    --import-method copy-image

    IMAGE-ID 替换为您要复制的镜像的名称。

  2. 确认镜像数据成功复制到所有可用的存储中:

    Copy to Clipboard Toggle word wrap
    $ glance image-list --include-stores

    有关如何检查镜像导入操作的状态的详情,请参阅 检查镜像导入操作的进度

4.4.2. 将镜像复制到特定存储中

使用以下步骤将镜像数据复制到特定的存储中。

流程

  1. 将镜像数据复制到特定存储中:

    Copy to Clipboard Toggle word wrap
    $ glance image-import IMAGE-ID \
    --stores STORE1,STORE2 \
    --import-method copy-image
    • IMAGE-ID 替换为您要复制的镜像的名称。
    • STORE1STORE2 替换为您要复制镜像数据的存储的名称。
  2. 确认镜像数据成功复制到指定的存储中:

    Copy to Clipboard Toggle word wrap
    $ glance image-list --include-stores

    有关如何检查镜像导入操作的状态的详情,请参阅 检查镜像导入操作的进度

4.5. 从特定存储中删除镜像

使用 Red Hat OpenStack Image 服务(glance)删除特定存储上的现有镜像副本。

使用镜像服务命令行客户端进行镜像管理。

流程

从特定存储中删除镜像:

Copy to Clipboard Toggle word wrap
$ glance stores-delete --store _STORE_ID_ _IMAGE_ID_
  • 将 _STORE_ID 替换为应删除镜像副本的存储名称。
  • IMAGE_ID 替换为您要删除的镜像的 ID。
警告

使用 glance image-delete 将在所有站点中永久删除镜像。所有镜像副本都将被删除,以及镜像实例和元数据。

4.6. 了解镜像的位置

虽然镜像可以存在于多个站点上,但给定镜像只有一个通用唯一标识符(UUID)。镜像元数据包含每个副本的位置。例如,两个边缘站点中存在的镜像作为单一 UUID 公开,具有三个位置:中央站点和两个边缘站点。

注意

使用 Image 服务(glance)命令行客户端而不是 OpenStack 命令行客户端进行镜像管理。但是,使用 openstack image show 命令列出镜像位置属性。glance image-show 命令输出不包含位置。

流程

  1. 显示镜像副本所在的站点:

    Copy to Clipboard Toggle word wrap
    $ glance image-show ID | grep "stores"
    
    | stores |  default_backend,dcn1,dcn2

    在示例中,镜像存在于中央站点、default_backend、两个边缘站点 dcn1dcn2 上。

  2. 另外,您可以使用-- include-stores 选项运行 glance image- list 命令来查看镜像存在的站点:

    Copy to Clipboard Toggle word wrap
    $ glance image-list --include-stores
    
    | ID                                   | Name    | Stores
    
    | 2bd882e7-1da0-4078-97fe-f1bb81f61b00 | cirros | default_backend,dcn1,dcn2
  3. 列出镜像位置属性以显示每个位置的详情:

    Copy to Clipboard Toggle word wrap
    $ openstack image show ID -c properties
    
    | properties |
    
    (--- cut ---)
    locations='[{'url': 'rbd://79b70c32-df46-4741-93c0-8118ae2ae284/images/2bd882e7-1da0-4078-97fe-f1bb81f61b00/snap', 'metadata': {'store': 'default_backend'}}, {'url': 'rbd://63df2767-8ddb-4e06-8186-8c155334f487/images/2bd882e7-1da0-4078-97fe-f1bb81f61b00/snap', 'metadata': {'store': 'dcn1'}}, {'url': 'rbd://1b324138-2ef9-4ef9-bd9e-aa7e6d6ead78/images/2bd882e7-1da0-4078-97fe-f1bb81f61b00/snap', 'metadata': {'store': 'dcn2'}}]',
    (--- cut --)

    image 属性显示各个镜像位置的不同 Ceph RBD URI。

    在示例中,中央镜像位置 URI 为:

    Copy to Clipboard Toggle word wrap
    rbd://79b70c32-df46-4741-93c0-8118ae2ae284/images/2bd882e7-1da0-4078-97fe-f1bb81f61b00/snap', 'metadata': {'store': 'default_backend'}}

    URI 由以下数据组成:

    • 79b70c32-df46-4741-93c0-8118ae2ae284 对应于中央 Ceph FSID。每个 Ceph 集群都有唯一的 FSID。
    • 所有站点的默认值为 镜像,它对应于存储镜像的 Ceph 池。
    • 2bd882e7-1da0-4078-97fe-f1bb81f61b00 对应于镜像 UUID。无论其位置如何,UUID 给定镜像都是一样的。
    • 元数据显示此位置映射到的 glance 存储。在本例中,它映射到 default_backend,这是中央 hub 站点。

附录 A. 镜像服务(glance)命令选项

您可以在 glance image-createglance image-update 命令中使用以下可选参数:

表 A.1. 命令选项
特定于选项描述

All

--architecture <ARCHITECTURE>

https://docs.openstack.org/glance/latest/user/common-image-properties.html#architecture中指定的操作系统架构

All

--protected [True_False]

如果为 true,则镜像将无法被删除。

All

--name <NAME>

镜像的描述性名称

All

--instance-uuid <INSTANCE_UUID>

可用于记录此镜像所关联的实例的元数据。(仅用于信息,不创建实例快照。)

All

--min-disk <MIN_DISK>

引导镜像所需的磁盘空间(以 GB 为单位)。

All

--visibility <VISIBILITY>

镜像可访问性范围。有效值: public, private, community, shared

All

--kernel-id <KERNEL_ID>

镜像服务(glance)中存储的镜像 ID,在引导 AMI 风格镜像时应用作内核。

All

--os-version <OS_VERSION>

根据经销商指定的操作系统版本

All

--disk-format <DISK_FORMAT>

磁盘格式。有效值: None, ami, ari, aki, vhd, vhdx, vmdk, raw, qcow2, vdi, iso, ploop

All

--os-distro <OS_DISTRO>

https://docs.openstack.org/glance/latest/user/common-image-properties.html#os-distro中指定的操作系统分布的通用名称

All

--owner <OWNER>

镜像的所有者

All

--ramdisk-id <RAMDISK_ID>

存储在镜像服务中的 ID,在引导 AMI 风格镜像时应用作 ramdisk。

All

--min-ram <MIN_RAM>

引导镜像所需的 RAM 量(以 MB 为单位)。

All

--Container-format <CONTAINER_FORMAT>

容器的格式。有效值: None, ami, ari, aki, bare, ovf, ova, docker

All

--property <key=value>

与镜像关联的任意属性。可以多次使用。

glance image-create

--tags <TAGS> [<TAGS> ...]

与镜像相关的字符串列表

glance image-create

--id <ID>

镜像的标识符

glance image-update

--remove-property

从镜像中删除的任意属性的密钥名称。

附录 B. 镜像配置参数

您可以将以下键与 glance image-createglance image-update 命令的 property 选项一起使用。

表 B.1. 属性键
特定于描述支持的值

All

架构

管理程序必须支持的 CPU 架构。例如,x86_64,arm, 或 ppc64。运行 uname -m 以获取机器的架构。

  • aarch - ARM 64-bit
  • alpha - DEC 64 位 RISC
  • armv7l - ARM Cortex-A7 MPCore
  • CRIS- Ethernet, Token Ring, AXis-Code Reduced instructions Set
  • i686 - Intel 6th-generation x86(P6 微架构)
  • ia 64- Itanium
  • lm32 - Lattice Micro32
  • m68k - Motorola 68000
  • Microblaze - Xilinx 32 位 FPGA (Big Endian)
  • Microblazeel - Xilinx 32 位 FPGA (Little Endian)
  • M IPS- MIPS 32 位 RISC (Big Endian)
  • mipsel - MIPS 32 位 RISC (Little Endian)
  • mips64- MIPS 64 位 RISC (Big Endian)
  • mips64el - MIPS 64-bit RISC (Little Endian)
  • openrisc - OpenCores RISC
  • parisc - HP Precision Architecture RISC
  • parisc64 - HP Precision Architecture 64-bit RISC
  • ppc - PowerPC 32-bit
  • ppc64 - PowerPC 64-bit
  • ppcemb - PowerPC (嵌入式 32 位)
  • s390- IBM Enterprise Systems Architecture/390
  • s390x - S/390 64 位
  • sh4- SuperH SH-4 (Little Endian)
  • sh4eb - SuperH SH-4 (Big Endian)
  • SPARC- Scalable Processor 架构, 32 位
  • sparc64- Scalable Processor Architecture, 64-bit
  • unicore32- Microprocessor Research and Development Center RISC Unicore32
  • X86_64- 64-bit 扩展 IA-32
  • xtensa - Tensilica Xtensa 可配置的微处理器内核
  • xtensaeb - Tensilica Xtensa 可配置的微处理器核心(Big Endian)

All

hypervisor_type

管理程序类型。

KVM,vmware

All

instance_uuid

对于快照镜像,这是用于创建此镜像的服务器的 UUID。

有效服务器 UUID

All

kernel_id

存储在镜像服务中的镜像的 ID,在引导 AMI 风格镜像时应用作内核。

有效镜像 ID

All

os_distro

小写的操作系统分布的通用名称。

  • 存档 Linux.不要使用 archlinuxorg.archlinux
  • CentOS 社区企业操作系统.不要使用 org.centosCentOS
  • Debian - Debian。不要使用 Debianorg.debian
  • Fedora - Fedora.不要使用 Fedoraorg.fedoraorg.fedoraproject
  • FreeBSD- FreeBSD。不要使用 org.freebsdfreeBSDFreeBSD
  • gentoo - Gentoo Linux。不要使用 Gentooorg.gentoo
  • mandrake - Mandrakelinux (MandrakeSoft)发行版.不要使用 mandrakelinuxMandrakeLinux
  • mandriva - Mandriva Linux.不要使用 mandrivalinux
  • mes - Mandriva Enterprise Server.不要使用 mandrivaentmandrivaES
  • msdos - Microsoft Disc Operating System.不要使用 ms-dos
  • netbsd - NetBSD.不要使用 NetBSDorg.netbsd
  • Netware- Novell NetWare.不要使用 novellNetWare
  • openbsd - OpenBSD。不要使用 OpenBSDorg.openbsd
  • OpenSolaris - OpenSolaris.不要使用 Open swig org.open migration
  • OpenSuse - openSUSE.不要使用 suseSuSEorg.opensuse
  • rhel - Red Hat Enterprise Linux.不要使用 redhat、RedHatcom.redhat
  • SLED- SUSE Linux Enterprise Desktop.不要使用 com.suse
  • Ubuntu - Ubuntu.不要使用 Ubuntucom.ubuntuorg.ubuntu规范
  • Windows - Microsoft Windows。不要使用 com.microsoft.server

All

os_version

根据经销商指定的操作系统版本。

版本号(例如:"11.10")

All

ramdisk_id

存储在镜像服务中的镜像的 ID,在引导 AMI 风格镜像时应用作 ramdisk。

有效镜像 ID

All

vm_mode

虚拟机模式。这代表了用于虚拟机的主机/guest ABI (应用程序二进制接口)。

Hvm-完全虚拟化.这是 QEMU 和 KVM 使用的模式。

libvirt API 驱动程序

hw_cdrom_bus

指定要将 CD-ROM 设备附加到的磁盘控制器类型。

SCSI,virtio,ide, 或 usb.如果指定了 iscsi,您必须将 hw_scsi_model 参数设置为 virtio-scsi

libvirt API 驱动程序

hw_disk_bus

指定要附加磁盘设备的磁盘控制器类型。

SCSI,virtio,ide, 或 usb.请注意,如果使用 iscsi,则 hw_scsi_model 需要设置为 virtio-scsi

libvirt API 驱动程序

hw_firmware_type

指定用于引导实例的固件类型。

设置为以下有效值之一:

  • BIOS
  • uefi

libvirt API 驱动程序

hw_machine_type

启用使用指定的机器类型引导 ARM 系统。如果使用 ARM 镜像并且未明确指定其机器类型,则 Compute 将使用 virt 机器类型作为 ARMv7 和 AArch64 的默认。

可以使用 virsh capabilities 命令查看有效的类型。机器类型显示在机器标签中。

libvirt API 驱动程序

hw_numa_nodes

向实例公开的 NUMA 节点数量(不会覆盖类别定义)。

整数.

libvirt API 驱动程序

hw_numa_cpus.0

vCPU N-M 到 NUMA 节点 0 的映射(不会覆盖类别定义)。

以逗号分隔的整数列表。

libvirt API 驱动程序

hw_numa_cpus.1

vCPU N-M 到 NUMA 节点 1 的映射(不要覆盖类别定义)。

以逗号分隔的整数列表。

libvirt API 驱动程序

hw_numa_mem.0

将 N MB RAM 映射到 NUMA 节点 0 (不会覆盖类别定义)。

整数

libvirt API 驱动程序

hw_numa_mem.1

将 N MB RAM 映射到 NUMA 节点 1 (不要覆盖类别定义)。

整数

libvirt API 驱动程序

hw_pci_numa_affinity_policy

指定 PCI 透传设备和 SR-IOV 接口的 NUMA 关联性策略。

设置为以下有效值之一:

  • 必需 :计算服务创建一个实例,该实例仅当实例的其中一个 NUMA 节点与 PCI 设备关联时才会请求 PCI 设备。这个选项提供最佳性能。
  • preferred :计算服务会尝试根据 NUMA 关联性选择 PCI 设备。如果无法关联性,则计算服务将实例调度到没有与 PCI 设备关联性的 NUMA 节点上。
  • 传统 :(默认)计算服务在以下情况下创建请求 PCI 设备的实例:

    • PCI 设备与至少一个 NUMA 节点的关联。
    • PCI 设备不提供有关其 NUMA 关联性的信息。

libvirt API 驱动程序

hw_qemu_guest_agent

客户机代理支持。如果设置为 yes,如果也安装了 qemu-ga,则可以自动静止(frozen)和快照。

是 / no

libvirt API 驱动程序

hw_rng_model

向使用此镜像启动的实例添加一个随机数生成器(RNG)设备。

实例类别默认启用 RNG 设备。要禁用 RNG 设备,云管理员必须在类别上将 hw_rng:allowed 设置为 False

默认熵源是 /dev/random。要指定硬件 RNG 设备,请在 Compute 环境文件中将 rng_dev_path 设置为 /dev/hwrng

VirtIO,或其他支持的设备。

libvirt API 驱动程序

hw_scsi_model

启用 VirtIO SCSI (virtio-scsi)来为计算实例提供块设备访问;默认情况下,实例使用 VirtIO 块(virtio-blk)。VirtIO SCSI 是一个半虚拟化 SCSI 控制器设备,它提高了可扩展性和性能,并支持高级 SCSI 硬件。

virtio-scsi

libvirt API 驱动程序

hw_video_model

在虚拟机实例中使用的显示设备的视频设备驱动程序。

设置为以下值之一,以指定要使用的支持的驱动程序:

  • VirtIO -(默认)虚拟机显示设备 的建议 驱动程序,由大多数架构支持。VirtIO GPU 驱动程序包含在 RHEL-7 及更新的版本中,Linux 内核版本 4.4 及更新的版本。如果实例内核具有 VirtIO GPU 驱动程序,则实例可以使用所有 VirtIO GPU 功能。如果实例内核没有 VirtIO GPU 驱动程序,则 VirtIO GPU 设备可以安全地回退到 VGA 兼容性模式,后者为实例提供正常工作的显示。
  • QXL - 不再维护的 Spice 或 noVNC 环境已弃用的驱动程序。
  • Cirrus - Legacy 驱动程序,只支持向后兼容。不要将 用于新实例。
  • VGA - 将此驱动程序用于 IBM Power 环境。
  • Gop - 不支持 QEMU/KVM 环境。
  • Xen - 不支持 KVM 环境。
  • vmvga - 旧的驱动程序,不使用。
  • none - 使用这个值在单独配置驱动程序的虚拟 GPU (vGPU)实例中禁用模拟图形或视频。

libvirt API 驱动程序

hw_video_ram

视频镜像的最大 RAM。仅在类别的 extra_specs 中设置 hw_video:ram_max_mb 值并且该值高于 hw_video_ram 中设置的值时使用。

以 MB 为单位的整数( 例如64)

libvirt API 驱动程序

hw_watchdog_action

启用虚拟硬件 watchdog 设备,在服务器挂起时执行指定操作。watchdog 使用 i6300esb 设备(模拟 PCI Intel 6300ESB)。如果没有指定 hw_watchdog_action,则禁用 watchdog。

  • Disabled - 设备没有附加。允许用户禁用镜像的 watchdog,即使已使用镜像的类别启用了它。这个参数的默认值被禁用。
  • 重置客户机。
  • poweroff-Forcefully 关闭客户机。
  • 暂停 guest。
  • none-Only 启用 watchdog;如果服务器挂起,什么都不做。

libvirt API 驱动程序

os_command_line

libvirt 驱动程序使用的内核命令行,而不是默认值。对于 Linux 容器(LXC),该值用作初始化的参数。这个密钥只适用于 Amazon 内核、ramdisk 或机器镜像(aki、ari 或 ami)。

 

libvirt API 驱动程序

os_secure_boot

使用 创建使用 UEFI 安全引导保护的实例。

设置为以下有效值之一:

  • 必需 :为使用此镜像启动的实例启用安全引导。只有 Compute 服务找到可以支持安全引导的主机时,才会启动该实例。如果没有找到主机,计算服务会返回 "No valid host" 错误。
  • 禁用 :为使用此镜像启动的实例禁用安全引导。默认禁用此选项。
  • 可选 :仅在计算服务决定主机可以支持安全引导时,为使用此镜像启动的实例启用安全引导。

libvirt API 驱动程序和 VMware API 驱动程序

hw_vif_model

指定要使用的虚拟网络接口设备的型号。

有效选项取决于配置的虚拟机监控程序。

  • KVM 和 QEMU:e1000、ne2k_pci、pcnet、rtl8139 和 virtio.
  • VMware:e1000、e1000e、VirtualE1000、VirtualE1000e、VirtualPCNet32, VirtualSriovEthernetCard 和 VirtualVmxnet。
  • Xen: e1000, netfront, ne2k_pci, pcnet, and rtl8139.

VMware API 驱动程序

vmware_adaptertype

管理程序使用的虚拟 SCSI 或 IDE 控制器。

lsiLogic,busLogic, 或 ide

VMware API 驱动程序

vmware_ostype

VMware GuestID,用于描述在镜像中安装的操作系统。这个值在创建虚拟机时传递给虚拟机监控程序。如果没有指定,则密钥默认为 otherGuest

如需更多信息,请参阅使用 VMware vSphere 的镜像

VMware API 驱动程序

vmware_image_version

当前未使用。

1

xenapi 驱动程序

auto_disk_config

如果为 true,则在实例引导前,磁盘上的根分区会自动调整大小。只有使用带有 XenAPI 驱动程序的基于 Xen 的 hypervisor 时,计算服务才会考虑该值。只有映像上只有一个分区,并且仅当分区采用 ext3ext4 格式时,计算服务才会尝试调整大小。

true / false

libvirt API 驱动程序和 XenAPI 驱动程序

os_type

在镜像上安装的操作系统。XenAPI 驱动程序包含根据镜像的 os_type 参数的值来采取不同操作的逻辑。例如,对于 os_type=windows 镜像,它会创建一个基于 FAT32 的交换分区而不是 Linux swap 分区,并将注入的主机名限制为小于 16 个字符。

linuxwindows

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat, Inc.