第 2 章 管理镜像

镜像服务(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 存储库已启用:

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

    $ sudo dnf module install -y virt
  • libguestfs-tools 软件包安装有一组用于访问和修改虚拟机镜像的工具:

    $ 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 评估中心 下载评估镜像。
  • 文本编辑器,如果要更改 kickstart 文件(仅限 RHEL)。
重要

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

$ 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 开始安装:

    [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 命令来查看控制台:

      [root@host]# virt-viewer <rhel9>
  2. 配置实例:

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

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

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

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

    # dnf -y update
  8. 安装 cloud-init 软件包:

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

    - resolv-conf

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

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

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

    GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8"
  12. 运行 grub2-mkconfig 命令:

    # grub2-mkconfig -o /boot/grub2/grub.cfg

    输出如下:

    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. 取消注册实例,以便生成的镜像不包含此实例的订阅详情:

    # subscription-manager repos --disable=*
    # subscription-manager unregister
    # dnf clean all
  14. 关闭实例:

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

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

    [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 开始安装:

    [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 命令来查看控制台:

      [root@host]# virt-viewer <rhel86-cloud-image>
  2. 配置实例:

    1. 在初始安装程序引导菜单中,选择 Install or upgrade an existing system,并按照安装提示进行操作。接受默认值。

      磁盘安装程序提供在安装前测试安装介质的选项。选择 OK 以运行测试或 跳过 以在没有测试的情况下继续。

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

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

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

    # dnf -y update
  8. 安装 cloud-init 软件包:

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

    - resolv-conf

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

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

    # 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 元数据服务时出现问题:

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

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

    # subscription-manager repos --disable=*
    # subscription-manager unregister
    # dnf clean all
  14. 关闭实例:

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

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

    [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 开始安装:

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

      • <name > mvapich- iwlthe Windows 实例具有的名称。
      • <size& gt; mvapich-wagondisk 大小(以 GB 为单位)。
      • <path > mvapich- iwlthe 到 Windows 安装 ISO 文件的路径。
      • <RAM > mvapich-busybox 请求的 RAM 量(以 MB 为单位)。

        注意

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

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

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

      提示

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

      [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 工具通过生成操作系统 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 安全引导创建新镜像:

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

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

    $ openstack image set \
     --property hw_firmware_type=uefi \
     --property os_secure_boot=required \
     uefi_secure_boot_image