Red Hat Training

A Red Hat training course is available for RHEL 8

创建自定义 RHEL 系统镜像

Red Hat Enterprise Linux 8

在 Red Hat Enterprise Linux 8 上使用镜像构建程序创建自定义系统镜像

Red Hat Customer Content Services

摘要

镜像构建器是创建部署就绪自定义系统镜像的工具:安装磁盘、虚拟机、云厂商镜像等。镜像构建器允许您比手动步骤更快地创建这些镜像,因为它提取了每种输出类型的具体内容。了解如何设置镜像构建器并使用它创建镜像。

使开源包含更多

红帽承诺替换我们的代码、文档和网页属性中存在问题的语言。我们从这四个术语开始: master、slave、blacklist 和 whitelist。这些更改将在即将发行的几个发行本中逐渐实施。如需了解更多详细信息,请参阅 CTO Chris Wright 信息

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。请让我们了解如何改进文档。要做到这一点:

  • 关于特定内容的简单评论:

    1. 请确定您使用 Multi-page HTML 格式查看文档。另外,确定 Feedback 按钮出现在文档页的右上方。
    2. 用鼠标指针高亮显示您想评论的文本部分。
    3. 点在高亮文本上弹出的 Add Feedback
    4. 按照显示的步骤操作。
  • 要提交更复杂的反馈,请创建一个 Bugzilla ticket:

    1. 进入 Bugzilla 网站。
    2. 在 Component 中选择 Documentation
    3. Description 中输入您要提供的信息。包括文档相关部分的链接。
    4. Submit Bug

第 1 章 镜像构建器描述

1.1. Image Builder 简介

您可以使用镜像构建器(Image Builder)创建 Red Hat Enterprise Linux 的自定义系统镜像,包括准备在云平台上部署的系统镜像。镜像构建器自动处理每种输出类型的设置详情,因此比手动创建镜像方法更容易使用且更快。您可以使用 composer-cli 工具中的命令行界面或 RHEL 8 web 控制台中的图形用户界面访问 Image Builder 功能。

从 Red Hat Enterprise Linux 8.3 开始, osbuild-composer 后端替换了 lorax-composer。新服务为镜像构建提供 REST API。因此,用户可从更可靠的后端及更可预测的输出镜像中受益。

镜像构建器作为系统服务 osbuild-composer 运行。您可以通过两个接口与这个服务交互:

  • 在终端中运行命令的 CLI 工具 composer-cli。这个方法是首选的。
  • RHEL 8 web 控制台的 GUI 插件。

1.2. 镜像构建器术语

蓝图(Blueprint)

蓝图通过列出将属于系统一部分的软件包和自定义来定义自定义系统镜像。蓝图可以被编辑并被版本化。从蓝图创建系统镜像时,镜像与 RHEL 8 web 控制台 Image Builder 界面中的蓝图关联。

蓝图以纯文本形式显示,采用 Tom 的 Obvious, Minimal Language(TOML)格式。

组合(Compose)
组合(Compose)是基于特定蓝图的特定版本的系统镜像的独立构建。作为一个术语,Compose 代表系统镜像以及来自其创建、输入、元数据和进程本身的日志。
自定义(Customizations)
自定义是系统规格,它们不是软件包。这包括用户、组和 SSH 密钥。

1.3. 镜像构建器输出格式

镜像构建器可以使用下表中显示的多个输出格式创建镜像。

表 1.1. 镜像构建器输出格式

描述CLI 名称文件扩展

QEMU QCOW2 镜像

qcow2

.qcow2

TAR 归档

tar

.tar

Amazon Machine 镜像磁盘

ami

.raw

Azure 磁盘镜像

vhd

.vhd

VMware 虚拟机磁盘

vmdk

.vmdk

Openstack

openstack

.qcow2

RHEL for Edge Commit

rhel-edge-commit

.tar

RHEL for Edge Container

rhel-edge-container

.tar

RHEL for Edge Installer

rhel-edge-installer

.iso

1.4. 镜像构建器系统要求

在创建系统镜像时,底层镜像构建器的 osbuild-composer 工具会执行一些存在潜在的不安全因素的操作。因此,使用虚拟机来运行 Image Builder。

Image Builder 运行的环境(如虚拟机)必须满足下表中列出的要求。

表 1.2. 镜像构建器系统要求

参数最低要求值

系统类型

专用虚拟机

处理器

2 个内核

内存

4 GiB

磁盘空间

20 GiB

访问权限

管理员级别(root)

网络

连接至互联网

注意

不支持在 UEFI 系统中直接安装的虚拟机中创建镜像。

第 2 章 安装镜像构建器

在使用 Image Builder 之前,您必须在虚拟机上安装 Image Builder。

2.1. 在虚拟机中安装镜像构建器

要在专用虚拟机上安装镜像构建器,请按照以下步骤执行:

先决条件

  • 连接到虚拟机。
  • Image Builder 的虚拟机必须被安装、订阅并正在运行。

流程

  1. 在虚拟机上安装 Image Builder 和其他必要的软件包:

    • osbuild-composer - 随后从 RHEL 8.3 支持
    • composer-cli
    • cockpit-composer
    • bash-completion
    # yum install osbuild-composer composer-cli cockpit-composer bash-completion

    Web 控制台作为 cockpit-composer 软件包的依赖项安装。

  2. 在每次重启后启动镜像构建器:

    # systemctl enable --now osbuild-composer.socket
    # systemctl enable cockpit.socket

    osbuild-composercockpit 服务在第一次访问时自动启动。

  3. 将系统防火墙配置为允许访问 Web 控制台:

    # firewall-cmd --add-service=cockpit && firewall-cmd --add-service=cockpit --permanent
  4. 加载 shell 配置脚本,以便 composer-cli 命令的自动完成功能可在不重启的情况下立即开始工作:

    $ source  /etc/bash_completion.d/composer-cli
重要

osbuild-composer 软件包是新的后端引擎,它是 Red Hat Enterprise Linux 8.3 及之后的版本的首选默认选择。以前的后端 lorax-composer 软件包被视为已弃用,将只接受 Red Hat Enterprise Linux 8 生命周期剩余部分的修复,并将在以后的主发行版本中被忽略。建议卸载 lorax-composer,而是使用 osbuild-composer。

2.2. 恢复到 lorax-composer 镜像构建器后端

osbuild-composer 后端虽然具有更好的扩展性,但目前它还无法实现 lorax-composer 后端的所有功能。

要恢复到上一个后端,请按照以下步骤执行:

先决条件

  • 已安装 osbuild-composer 软件包

流程

  1. 删除 osbuild-composer 后端。

    # yum remove osbuild-composer
  2. /etc/yum.conf file 中,为 osbuild-composer 软件包添加排除条目。

    # cat /etc/yum.conf
    [main]
    gpgcheck=1
    installonly_limit=3
    clean_requirements_on_remove=True
    best=True
    skip_if_unavailable=False
    exclude=osbuild-composer
  3. 安装 "lorax-composer" 软件包。

    # yum install lorax-composer

第 3 章 使用 Image Builder 命令行界面创建系统镜像

镜像构建器是创建自定义系统镜像的工具。要控制镜像构建器并创建自定义系统镜像,请使用命令行界面,它目前是使用 Image Builder 的首选方法。

3.1. 镜像构建器命令行界面

镜像构建器命令行界面目前是使用镜像构建器的首选方法。它所提供的功能比 Web 控制台界面更多。要使用这个接口,请运行带有适当选项和子命令的 composer-cli 命令。

命令行界面的工作流总结如下:

  1. 将蓝图定义导出(保存)到纯文本文件
  2. 在文本编辑器中编辑这个文件
  3. 将蓝图文本文件导入(推送)到镜像构建器
  4. 运行 compose 从蓝图构建镜像
  5. 导出镜像文件以下载它

除了实现这个步骤的基本子命令外, composer-cli 命令还提供很多子命令来检查配置的蓝图和组合的状态。

要以非 root 身份运行 composer-cli 命令,用户必须位于 weldrroot 组中。

3.2. 使用命令行界面创建镜像构建器蓝图

此流程描述了如何使用命令行界面创建新镜像构建器蓝图。

流程

  1. 创建一个包含以下内容的纯文本文件:

    name = "BLUEPRINT-NAME"
    description = "LONG FORM DESCRIPTION TEXT"
    version = "0.0.1"
    modules = []
    groups = []

    用您的蓝图的名称和描述替换 BLUEPRINT-NAMELONG FORM DESCRIPTION TEXT

    根据 Semantic Versioning 方案,将 0.0.1 替换为一个版本号。

  2. 对于您要包含在蓝图中的每个软件包,在该文件中添加以下行:

    [[packages]]
    name = "package-name"
    version = "package-version"

    使用软件包名称替换 package-name,比如 httpdgdb-doc 或者 coreutils

    package-version 替换为要使用的版本。此字段支持 dnf 版本规格:

    • 对于特定版本,请使用准确的版本号,如 8.10
    • 对于最新的可用版本,请使用星号 *
    • 对于最新的次版本,请使用以下格式,如 8.*。
  3. 蓝图可以通过多种方式自定义。在本例中,通过执行以下步骤可以禁用 Simultaneous Multi Threading(SMT)。如需了解更多可用的自定义,请参阅 支持的镜像自定义

    [customizations.kernel]
    append = "nosmt=force"
  4. 将文件保存为 BLUEPRINT-NAME.toml,并关闭文本编辑器。
  5. 推送(导入)蓝图:

    # composer-cli blueprints push BLUEPRINT-NAME.toml

    BLUEPRINT-NAME 替换为您在前面步骤中使用的值。

  6. 要验证蓝图是否已被推送并已存在,列出现有的蓝图:

    # composer-cli blueprints list
  7. 检查蓝图中列出的组件和版本是否有效:

    # composer-cli blueprints depsolve BLUEPRINT-NAME
注意

您可以使用 composer-cli 命令作为非 root 创建镜像。要做到这一点,请将您的用户添加到 weldrroot 组中。要将用户添加到 weldr 组中,请执行以下步骤:

# usermod -a -G weldr user
$ newgrp weldr

3.3. 使用命令行界面编辑镜像构建器蓝图

此流程描述了如何在命令行界面中编辑现有镜像构建器蓝图。

流程

  1. 将蓝图保存(导出)到本地文本文件:

    # composer-cli blueprints save BLUEPRINT-NAME
  2. 使用您选择的文本编辑器编辑 BLUEPRINT -NAME.toml 文件并进行修改。
  3. 在完成编辑前,请确定该文件是一个有效的蓝图:

    1. 删除这一行(如果存在):

      packages = []
    2. 增加版本号。请记住, Image Builder 蓝图版本必须使用 Semantic Versioning 方案。另请注意,如果您不更改版本,则会自动增加版本的 补丁组件
    3. 检查内容是否是有效的 TOML 规格。如需更多信息 ,请参阅 TOML 文档

      注意

      TOML 文档是一个社区产品,它不被红帽支持。您可以使用该工具报告任何问题: https://github.com/toml-lang/toml/issues

  4. 保存文件并关闭编辑器。
  5. 将蓝图推送到镜像构建器:

    # composer-cli blueprints push BLUEPRINT-NAME.toml

    请注意,您必须提供文件名,包括 .toml 扩展名,而在其他命令中可以只使用蓝图的名称。

  6. 要验证上传到镜像构建器的内容是否与您的编辑匹配,请列出蓝图的内容:

    # composer-cli blueprints show BLUEPRINT-NAME
  7. 检查蓝图中列出的组件和版本是否有效:

    # composer-cli blueprints depsolve BLUEPRINT-NAME

3.4. 在命令行界面中使用镜像构建器创建系统镜像

此流程演示了如何使用 Image Builder 命令行界面构建自定义镜像。

先决条件

  • 您已为镜像准备了蓝图。

流程

  1. 启动 compose:

    # composer-cli compose start BLUEPRINT-NAME IMAGE-TYPE

    BLUEPRINT-NAME 替换为蓝图的名称,将 IMAGE-TYPE 替换为镜像类型。有关可能的值,请查看 composer-cli compose types 命令的输出。

    compose 进程在后台启动,并显示 Compose 的 UUID。

  2. 等待 compose 完成。请注意,这可能需要几分钟时间。

    检查 Compose 的状态:

    # composer-cli compose status

    完成的 compose 显示状态值 FINISHED。根据 UUID 识别列表中的内容。

  3. 完成 compose 后,下载生成的镜像文件:

    # composer-cli compose image UUID

    使用前面步骤中显示的 UUID 值替换 UUID。

    您还可以使用 composer-cli compose logs UUID 命令或使用 composer-cli compose metadata UUID 命令下载日志。

3.5. 基本镜像构建器命令行命令

Image Builder 命令行界面提供以下子命令。

蓝图操作

列出所有可用的蓝图
# composer-cli blueprints list
显示 TOML 格式的蓝图内容
# composer-cli blueprints show BLUEPRINT-NAME
将 TOML 格式的蓝图内容保存到文件中 BLUEPRINT-NAME.toml
# composer-cli blueprints save BLUEPRINT-NAME
删除蓝图
# composer-cli blueprints delete BLUEPRINT-NAME
将 TOML 格式的蓝图文件推送到镜像构建器中
# composer-cli blueprints push BLUEPRINT-NAME

从蓝图制作镜像

启动一个目录
# composer-cli compose start BLUEPRINT COMPOSE-TYPE

使用要构建的蓝图名称替换 BLUEPRINT, 使用输出镜像类型替换 COMPOSE-TYPE

列出所有 compose
# composer-cli compose list
列出所有 compose 及其状态
# composer-cli compose status
取消正在运行的 compose
# composer-cli compose cancel COMPOSE-UUID
删除完成的 compose
# composer-cli compose delete COMPOSE-UUID
显示有关 compose 的详细信息
# composer-cli compose info COMPOSE-UUID
下载 compose 的镜像文件
# composer-cli compose image COMPOSE-UUID

其它资源

  • composer-cli(1)手册页提供了可用子命令和选项的完整列表:

    $ man composer-cli
  • composer-cli 命令提供子命令和选项的帮助:

    # composer-cli help

3.6. 镜像构建器蓝图格式

镜像构建器蓝图在 Tom 的 Obvious, Minimal Language(TOML)格式中作为纯文本提供给用户。

典型的蓝图文件元素包括:

蓝图元数据
name = "BLUEPRINT-NAME"
description = "LONG FORM DESCRIPTION TEXT"
version = "VERSION"

用您的蓝图的名称和描述替换 BLUEPRINT-NAMELONG FORM DESCRIPTION TEXT

根据 Semantic Versioning 方案,将 VERSION 替换为版本号。

这部分只针对整个蓝图文件显示一次。

条目 modules 描述了要安装到镜像中的软件包名称和与 glob 相匹配的版本。

条目 group 描述了要安装到镜像中的一组软件包。group 将其软件包分类如下:

  • Mandatory(必需)
  • Default(默认)
  • Optional(可选)

    蓝图会安装必需的软件包。没有选择可选软件包的机制。

镜像中包含的组
[[groups]]
name = "group-name"

使用组群名称替换 group-name,比如 anaconda-toolswidgetwheel 或者users

镜像中包含的软件包
[[packages]]
name = "package-name"
version = "package-version"

使用软件包名称替换 package-name,比如 httpdgdb-doc 或者 coreutils

package-version 替换为要使用的版本。此字段支持 dnf 版本规格:

  • 对于特定版本,请使用准确的版本号,如 8.10
  • 对于最新的可用版本,请使用星号 *
  • 对于最新的次版本,请使用以下格式,如 8.*。

为每个要包括的软件包重复这个块。

3.7. 支持的镜像自定义

当前,蓝图中支持多个镜像自定义。要使用这些选项,必须首先在蓝图中配置它们,并导入(推送)到 Image Builder。

注意

目前在附带的 cockpit-composer GUI 中不支持这些自定义。

流程

  1. 设置镜像主机名:

    [customizations]
    hostname = "baseimage"
  2. 生成系统镜像的用户规格:

    [[customizations.user]]
    name = "USER-NAME"
    description = "USER-DESCRIPTION"
    password = "PASSWORD-HASH"
    key = "PUBLIC-SSH-KEY"
    home = "/home/USER-NAME/"
    shell = "/usr/bin/bash"
    groups = ["users", "wheel"]
    uid = NUMBER
    gid = NUMBER
    注意

    GID 是可选的,且必须已存在于镜像中,由软件包创建,或者由蓝图 [[customizations.group]] 条目创建。

    重要

    要生成哈希,必须在您的系统中安装 python3。以下命令将安装 python3 软件包。

    # yum install python3

    PASSWORD-HASH 替换为实际密码散列。要生成哈希,请使用以下命令,例如:

    $ python3 -c 'import crypt,getpass;pw=getpass.getpass();print(crypt.crypt(pw) if (pw==getpass.getpass("Confirm: ")) else exit())'

    PUBLIC-SSH-KEY 替换为实际公钥。

    使用适当的值替换其他占位符。

    根据需要保留任何行,只需要用户名。

    为每个用户重复此块。

  3. 生成系统镜像的组规格:

    [[customizations.group]]
    name = "GROUP-NAME"
    gid = NUMBER

    为每个组重复此块。

  4. 设置现有用户 ssh 密钥:

    [[customizations.sshkey]]
    user = "root"
    key = "PUBLIC-SSH-KEY"
    注意

    这个选项仅适用于现有用户。要创建用户并设置 ssh 密钥,请使用 用户规格进行生成的系统镜像 自定义。

  5. 在默认值中附加内核引导选项:

    [customizations.kernel]
    append = "KERNEL-OPTION"
  6. 定义要在镜像中使用的内核名称:

    [customizations.kernel.name]
    name = "KERNEL-NAME"
  7. 为生成的系统镜像设置时区和 网络时间协议(NTP) 服务器:

    [customizations.timezone]
    timezone = "TIMEZONE"
    ntpservers = "NTP_SERVER"

    如果您没有设置时区,系统将默认使用 Universal Time, Coordinated (UTC)。设置 NTP 服务器是可选的。

  8. 为生成的系统镜像设置区域设置:

    [customizations.locale]
    languages = ["LANGUAGE"]
    keyboard = "KEYBOARD"

    设置语言和键盘选项是必须的。您可以添加多种语言。您添加的第一个语言是主语言,其它语言则为从属语言。

  9. 为生成的系统镜像设置防火墙:

    [customizations.firewall]
    port = ["PORTS"]

    您可以使用数字端口或者 /etc/services 文件中的名称启用列表。

  10. 自定义防火墙服务:

    查看可用的防火墙服务。

    $ firewall-cmd --get-services

    在蓝图中 customizations.firewall.service 部分指定您要自定义的防火墙服务。

    [customizations.firewall.services]
    enabled = ["SERVICES"]
    disabled = ["SERVICES"]

    firewall.services 中列出的服务与 /etc/services 文件中可用的名称不同。

    您可选择为计划创建的系统镜像自定义防火墙服务。

    注意

    如果您不想自定义防火墙服务,请省略蓝图中的 [customizations.firewall][customizations.firewall.services] 部分。

  11. 设置在引导时要启用的服务:

    [customizations.services]
    enabled = ["SERVICES"]
    disabled = ["SERVICES"]

    您可以控制在引导期间要启用哪些服务。有些镜像类型已经启用或禁用了特定服务,以便镜像正常工作,此设置无法覆盖。

  12. 将 git 存储库中的文件添加到您的蓝图中:

    [[repos.git]]
    rpmname = "RPM-NAME"
    rpmversion = "RPM-VERSION"
    rpmrelease = "RPM-RELEASE"
    summary = "RPM-SUMMARY"
    repo = "REPO-URL"
    ref = "GIT-REF"
    destination = "SERVICES"

    您可以使用条目将 git 存储库中的文件添加到创建的镜像。

    例如,要创建名为 server-config-1.0-1.noarch.rpm 的 RPM 软件包,请在您的蓝图中添加以下信息:

    使用要创建的 RPM 软件包的名称替换 _RPM-NAME。这也是生成的 tar 归档中的前缀名称。

    使用 RPM 软件包的版本替换 RPM-VERSION,如 "1.0.0"。

    使用 RPM 软件包发行版本的版本替换 RPM-RELEASE,如 "1"。

    使用 RPM 软件包的概述字符串替换 RPM- SUMMARY。

    使用 get repository 的 URL 替换 REPO-URL,以便从中克隆并创建存档。

    使用要签出的 git 引用替换 GIT-REF,例如 origin/branch-namegit taggit commit hash

    在安装 RPM 软件包时,请使用安装 git 存储库目录的路径替换 SERVICES

    因此,您提供的 git 存储库是克隆的,会签出指定的 git 引用,并创建一个 RPM 软件包来将文件安装到目标路径,例如 /opt/server/。RPM 包括库详情和创建库的参考概述。RPM 软件包也包含在镜像构建元数据中。

    注意

    每次构建启动时,它会克隆存储库。如果您引用有大量历史记录的存储库,可能需要一段时间来克隆和使用大量磁盘空间。另外,克隆是临时的,在创建 RPM 软件包后会被删除。

3.8. 安装的软件包

当您使用 Image Builder 创建系统镜像时,默认情况下,系统会安装一组基本软件包。软件包的基本列表是 comps core 组的成员。默认情况下,Image Builder 使用 core yum 组。

表 3.1. 支持创建镜像类型的默认软件包

镜像类型默认软件包

ami

checkpolicy, chrony, cloud-init, cloud-utils-growpart, @Core, dhcp-client, gdisk, insights-client, kernel, langpacks-en, net-tools, NetworkManager, redhat-release, redhat-release-eula, rng-tools, rsync, selinux-policy-targeted, tar, Yum-utils

OpenStack

@Core, langpacks-en

qcow2

@core, chrony, dnf, kernel, yum, nfs-utils, dnf-utils, cloud-init, python3-jsonschema, qemu-guest-agent, cloud-utils-growpart, dracut-norescue, tar, tcpdump, rsync, dnf-plugin-spacewalk, rhn-client-tools, rhnlib, rhnsd, rhn-setup, NetworkManager, dhcp-client, cockpit-ws, cockpit-system, subscription-manager-cockpit, redhat-release, redhat-release-eula, rng-tools, insights-client

rhel-edge-commit

glibc, glibc-minimal-langpack, nss-altfiles, kernel, dracut-config-generic, dracut-network, basesystem, bash, platform-python,shadow-utils, chrony, setup, shadow-utils, sudo, systemd, coreutils, util-linux, curl, vim-minimal, rpm, rpm-ostree, polkit, lvm2, cryptsetup, pinentry, e2fsprogs, dosfstools, keyutils, gnupg2, attr, xz, gzip, firewalld, iptables, NetworkManager, NetworkManager-wishutil, wpa_supplic, dns procps-ng, rootfiles, openssh-server, passwd, policycoreutils-python-utils, selinux-policy-targeted, selinux-policy-targeted, setools-console, less、tar、rsync、fwupd、bash-completion、tmux、ima-evm-utils, audit, rng-tools, podman, container-selinux, skope-curle2, cris

tar

policycoreutils, selinux-policy-targeted

vhd

@Core, langpacks-en

vmdk

@core, chrony, firewalld, kernel, langpacks-en, open-vm-tools, selinux-policy-targeted

注意

当您在蓝图中添加附加组件时,您必须确定您添加的组件中的软件包不会与其他软件包组件冲突,否则系统无法解决依赖项。因此,您无法创建自定义镜像。

其它资源

3.9. 已启用的服务

当您配置自定义镜像时,启用的服务是您正在运行的 RHEL8 发行版本的默认服务,另外,还会为特定镜像类型启用的服务。osbuild-composer

例如, .ami 镜像类型启用服务 sshdchronydcloud-init,且在没有这些服务时,自定义镜像不会引导。

表 3.2. 启用服务来支持镜像类型创建

镜像类型已启用的服务

ami

没有默认服务

OpenStack

sshd、cloud-init、cloud-init-local、cloud-config、cloud-final

qcow2

没有默认服务

rhel-edge-commit

没有默认服务

tar

没有默认服务

vhd

sshd, chronyd, waagent, cloud-init, cloud-init-local, cloud-config, cloud-final

vmdk

sshd、chronyd、vmtoolsd

注:您可以自定义在系统引导过程中要启用的服务。但是,对于默认启用服务的镜像类型,自定义不会覆盖此功能。

3.10. 使用镜像构建器进行磁盘和分区配置

镜像构建器不允许对磁盘进行分区。带有分区磁盘的输出类型将有一个分区,以及引导系统镜像所需的特定于平台的分区。例如: qcow2 镜像类型有一个根分区,可能是一个镜像引导所需的特定平台的引导分区(如 PReP for PPC64 系统)。

第 4 章 使用 Image Builder Web 控制台界面创建系统镜像

镜像构建器是创建自定义系统镜像的工具。要控制 Image Builder 并创建自定义系统镜像,您可以使用 Web 控制台界面。请注意, 命令行界面 目前为首选,因为它提供了更多的功能。

4.1. 在 RHEL 8 web 控制台中访问镜像构建器 GUI

RHEL 8 web 控制台的 cockpit-composer 插件可让用户管理 Image Builder 蓝图,并使用图形界面组成镜像。请注意,控制镜像构建器的首选方法是使用命令行界面。

先决条件

  • 您必须有对该系统的根权限。

流程

  1. 在安装 Image Builder 的 web 浏览器中打开 https://localhost:9090/

    有关如何远程访问镜像构建器的更多信息,请参阅使用 RHEL 8 web 控制台文档管理系统

  2. 使用系统中有足够权限的用户帐户登录到 web 控制台。
  3. 要显示 Image Builder 控制,请点击 Image Builder 图标,该图标位于窗口的上角。

    Image Builder 视图会打开,它会列出现有的蓝图。

4.2. 在 web 控制台界面中创建 Image Builder 蓝图

要描述自定义系统镜像,首先创建一个蓝图。

先决条件

  • 在浏览器中打开了 RHEL 8 web 控制台的 Image Builder 界面。

流程

  1. 点击右上角的 Create Blueprint

    此时会出现一个蓝图名称和描述字段。

  2. 填写蓝图名称及其描述,然后点击 Create

    屏幕更改为蓝图编辑模式。

  3. 添加您要包含在系统镜像中的组件:

    1. 在左侧,在 Available Components 字段中输入组件名称或者部分组件名称,然后按 Enter 键。

      搜索添加到文本条目字段的过滤器列表中,下面的组件列表将减少到与搜索匹配的组件列表。

      如果组件列表太长,请以相同的方式添加进一步的搜索术语。

    2. 组件列表会进行分页。要移动到其他结果页面,请使用组件列表之上的箭头和条目字段。
    3. 点击要用来显示其详情的组件名称。右窗格会填充组件的详情,如版本和依赖项。
    4. 选择在 Component Options 框要使用的版本,使用 Version Release 下拉菜单。
    5. 点击左上角的 Add
    6. 如果您错误地添加了一个组件,点右窗格中条目右侧的 按钮删除它,并在菜单中选择 Remove
    注意

    如果您不想为一些组件选择一个版本,您可以点击组件列表右侧的 + 按钮来跳过组件详情屏幕和版本选择。

  4. 要保存蓝图,请点击右上角的 Commit。概述更改的对话框。点 Commit

    右侧的一个小弹出会告诉您保存的进程,然后告知结果。

  5. 要退出编辑屏幕,请点击左上角的 Back to Blueprints

    Image Builder 视图会打开,它会列出现有的蓝图。

4.3. 在 web 控制台界面中编辑 Image Builder 蓝图

要更改自定义系统镜像的规格,请编辑对应的蓝图。

先决条件

  • 在浏览器中打开了 RHEL 8 web 控制台的 Image Builder 界面。
  • 一个蓝图已存在。

流程

  1. 通过在左上角的搜索框中输入名称或部分来找到您要编辑的蓝图,然后按 Enter 键。

    搜索添加到文本条目字段的过滤器列表中,下面的蓝图列表与搜索匹配。

    如果蓝图列表太长,请以相同的方式添加进一步的搜索术语。

  2. 在蓝图的右侧,按属于蓝图的 Edit Blueprint 按钮。

    蓝图编辑屏幕会显示。

  3. 点击右窗格条目右侧点击其条目右侧的 按钮来删除不需要的组件,并在菜单中选择 Remove
  4. 更改现有组件的版本:

    1. 在 Blueprint Components 搜索字段中,在标题 Blueprint Components 下输入组件名称或其中的一部分,然后按 Enter

      搜索添加到文本条目字段的过滤器列表中,下面的组件列表将减少到与搜索匹配的组件列表。

      如果组件列表太长,请以相同的方式添加进一步的搜索术语。

    2. 点击组件条目右侧的 按钮,并在菜单中选择 View

      在右窗格中打开组件详情屏幕。

    3. Version Release 下拉菜单中选择所需版本,然后点击右上角 Apply Change。

      更改会被保存,右窗格返回列出蓝图组件。

  5. 添加新组件:

    1. 在左侧,在 Available Components 标题下输入组件名称或其部分到字段中,然后按 Enter 键。

      搜索添加到文本条目字段的过滤器列表中,下面的组件列表将减少到与搜索匹配的组件列表。

      如果组件列表太长,请以相同的方式添加进一步的搜索术语。

    2. 组件列表会进行分页。要移动到其他结果页面,请使用组件列表之上的箭头和条目字段。
    3. 点击要用来显示其详情的组件名称。右窗格会填充组件的详情,如版本和依赖项。
    4. 选择您要在 Component Options 框中使用的版本,使用 Version Release 下拉菜单。
    5. 点击右上角的 Add
    6. 如果您错误地添加了一个组件,点右窗格中条目右侧的 按钮删除它,并在菜单中选择 Remove

      注意

      如果您不想为一些组件选择一个版本,您可以点击组件列表右侧的 + 按钮来跳过组件详情屏幕和版本选择。

  6. 提交带有您的更改的蓝图的新版本:

    1. 点击右上角的 Commit 按钮。

      此时会出现一个带有您更改小结的弹出窗口。

    2. Commit 检查您的更改并进行确认。

      右侧的一个小弹出会告诉您保存的进程和结果。创建了新版本的蓝图。

    3. 在左上角,点击 Back to Blueprints 退出编辑屏幕。

      Image Builder 视图会打开,它会列出现有的蓝图。

4.4. 将用户和组添加到 web 控制台界面的 Image Builder 蓝图中

目前无法将自定义配置(如用户和组)添加到 web 控制台界面的蓝图中。要临时解决这个问题,请使用 web 控制台中的 Terminal 标签页来使用命令行界面(CLI)工作流。

先决条件

  • 蓝图必须存在。
  • 必须安装 CLI 文本编辑器,如 vimnanoemacs。要安装它们:

    # yum install editor-name

流程

  1. 找到蓝图名称:在 RHEL 8 web 控制台中左侧打开Image Builder标签页,以查看蓝图的名称。
  2. 导航到 web 控制台中的 CLI:打开左侧的系统管理标签页,然后从左侧的列表中选择最后一个项 Terminal
  3. 输入超级用户(root)模式:

    $ sudo bash

    当被提示时提供您的凭证。请注意,终端不会重复使用登录到 web 控制台时输入的凭证。

    具有 root 权限的新 shell 从您的主目录中启动。

  4. 将蓝图导出到一个文件中:

    # composer-cli blueprints save BLUEPRINT-NAME
  5. 使用您选择的 CLI 文本编辑器编辑 BLUEPRINT-NAME.toml 文件,并添加用户和组。

    重要

    RHEL 8 web 控制台没有内置的功能来编辑系统中的文本文件,因此此步骤需要使用 CLI 文本编辑器。

    1. 要添加每个用户,请将此块添加到该文件中:

      [[customizations.user]]
      name = "USER-NAME"
      description = "USER-DESCRIPTION"
      password = "PASSWORD-HASH"
      key = "ssh-rsa (...) key-name"
      home = "/home/USER-NAME/"
      shell = "/usr/bin/bash"
      groups = ["users", "wheel"]
      uid = NUMBER
      gid = NUMBER

      PASSWORD-HASH 替换为实际密码散列。要生成散列,请使用如下命令:

      $ python3 -c 'import crypt,getpass;pw=getpass.getpass();print(crypt.crypt(pw) if (pw==getpass.getpass("Confirm: ")) else exit())'

      ssh-rsa (…) key-name 替换为实际公钥。

      使用适当的值替换其他占位符。

      根据需要保留任何行,只需要用户名。

    2. 要添加每个用户组,请将此块添加到该文件中:

      [[customizations.group]]
      name = "GROUP-NAME"
      gid = NUMBER
    3. 增加版本号。
    4. 保存文件并关闭编辑器。
  6. 将蓝图重新导入到镜像构建器中:

    # composer-cli blueprints push BLUEPRINT-NAME.toml

    请注意,您必须提供文件名,包括 .toml 扩展名,而在其他命令中可以只使用蓝图的名称。

  7. 要验证上传到镜像构建器的内容是否与您的编辑匹配,请列出蓝图的内容:

    # composer-cli blueprints show BLUEPRINT-NAME

    检查版本是否与您在文件中放入的内容匹配,以及是否存在您的自定义。

    重要

    RHEL 8 web 控制台的 Image Builder 插件不会显示任何可用来验证是否应用了更改的信息,除非您同时还编辑了蓝图中包含的软件包。

  8. 退出特权 shell:

    # exit
  9. 在左侧打开 Image Builder(镜像构建器)标签页,并刷新页面、所有浏览器和打开该页面的所有标签页。

    这可防止在载入页面中缓存的状态意外恢复您的更改。

4.5. 在 web 控制台界面中使用 Image Builder 创建系统镜像

以下步骤描述了创建系统镜像。

先决条件

  • 在浏览器中打开了 RHEL 8 web 控制台的 Image Builder 界面。
  • 一个蓝图已存在。

流程

  1. 通过在左上角的搜索框中输入镜像的名称或部分来找到您要构建镜像的蓝图,然后按 Enter 键。

    搜索添加到文本条目字段的过滤器列表中,下面的蓝图列表与搜索匹配。

    如果蓝图列表太长,请以相同的方式添加进一步的搜索术语。

  2. 在蓝图的右侧,按属于蓝图的 Create Image 按钮。

    此时会出现弹出窗口。

  3. 选择镜像类型并按 Create

    右上角有一个小弹出通知您已将镜像创建添加到队列中。

  4. 点蓝图的名称。

    此时会打开一个包含详细蓝图的屏幕。

  5. 点击 Images 选项卡切换到它。正在创建的镜像被列出为状态为 In Progress

    注意

    镜像创建需要较长的时间(以分钟为单位)。在创建镜像时没有显示进度。

    要取消创建镜像,按右侧的 Stop 按钮。

  6. 成功创建镜像后,Stop 按钮会被一个 Download 按钮替代。点击这个按钮将镜像下载到您的系统。

4.6. 在蓝图中添加源

Image Builder 中定义的源提供您可以添加到蓝图中的内容。这些源具有全局性,因此可用于所有蓝图。系统源是本地设置且无法从 Image Builder 中删除的软件仓库。您可以添加额外的自定义源,从而可以访问系统中可用系统源以外的其他内容。

以下步骤描述了如何在本地系统中添加源。

先决条件

  • 在浏览器中打开了 RHEL 8 web 控制台的 Image Builder 界面。

流程

  1. 点击右上角的 Manage Sources 按钮。

    image builder manage source

    此时会出现一个带有可用源、名称和描述的弹出窗口。

    image builder available sources

  2. 在弹出窗口的右侧点击 Add Source 按钮。
  3. 添加所需的 源名称源路径Source TypeSecurity 字段是可选的。

    image builder sources options

  4. 点击 添加源 按钮。该页面显示可用源窗口,并列出您添加的源。

因此,新的系统源可用,并可使用或编辑。

4.7. 为蓝图创建用户帐户

Image Builder 创建的镜像会将 root 帐户锁定,且不包括其他帐户。这样配置的目的是,避免意外地在没有密码的情况下构建和部署镜像。通过镜像构建器,您可以创建一个带有蓝图密码的用户帐户,以便登录到从蓝图创建的镜像。

先决条件

  • 在浏览器中打开了 RHEL 8 web 控制台的 Image Builder 界面。
  • 您有一个现有的蓝图。

流程

  1. 通过在左上角的搜索框中输入用户名称或部分用户来找到您要创建用户帐户的蓝图,然后按 Enter 键。

    搜索添加到文本条目字段的过滤器列表中,下面的蓝图列表将减少到与搜索匹配的蓝图。

  2. 点击蓝图名称显示蓝图详情。

    镜像构建器创建用户帐户
  3. 创建用户帐户

    这将打开一个窗口,其中包含创建用户帐户的字段。

    镜像构建器创建用户帐户 2
  4. 填写详情。请注意,当您插入名称时,用户名字段会自动完成,建议使用的用户名。
  5. 插入所有所需详情后,请点 Create
  6. 创建的用户帐户会出现显示您插入的所有信息。

    镜像构建器用户帐户已创建
  7. 要为蓝图创建更多用户帐户,请重复这个过程。

4.8. 使用 SSH 密钥创建用户帐户

Image Builder 创建的镜像会将 root 帐户锁定,且不包括其他帐户。这个配置的目的是,确保镜像的安全,不使用默认密码。镜像构建器允许您使用蓝图的 SSH 密钥创建用户帐户,以便与从蓝图创建的镜像进行身份验证。要做到这一点,首先创建一个蓝图。然后,您将创建一个带有密码和 SSH 密钥的用户帐户。以下示例演示了如何创建配置了 SSH 密钥的服务器管理员用户。

先决条件

  • 您已创建了在这个过程后会与创建的用户配对的 SSH 密钥。
  • 在浏览器中打开了 RHEL 8 web 控制台的 Image Builder 界面。
  • 您有一个现有的蓝图

流程

  1. 通过在左上角的搜索框中输入用户名称或部分用户来找到您要创建用户帐户的蓝图,然后按 Enter 键。

    搜索添加到文本条目字段的过滤器列表中,下面的蓝图列表将减少到与搜索匹配的蓝图。

  2. 点击蓝图名称显示蓝图详情。

    镜像构建器创建用户帐户
  3. 创建用户帐户

    这将打开一个窗口,其中包含创建用户帐户的字段

    镜像构建器创建用户帐户 2
  4. 填写详情。请注意,当您插入名称时,用户名字段会自动完成,建议使用的用户名。

    如果要向您要创建的用户帐户提供管理员权限,请检查 Role 字段

    粘贴 SSH 公钥文件的内容。

  5. 插入所有所需详情后,请点 Create
  6. 新用户帐户将出现在用户列表中,显示您插入的所有信息。

    镜像构建器用户帐户已创建
  7. 如果要为蓝图创建更多用户帐户,请重复这个过程。

其它资源

第 5 章 使用镜像构建器准备和部署 KVM 客户机镜像

用户可以手动从 ISO 创建镜像,或使用 Image Builder 创建了目的构建镜像。此流程描述了使用镜像构建器创建目的构建镜像的步骤。这仅限于对 Red Hat Virtualization(RHV)的 rhel-guest-image 支持。

创建自定义的 KVM 客户机镜像涉及以下高级别:

  1. 使用镜像构建器创建 KVM 客户机镜像 .qcow2 镜像。
  2. 从 KVM 客户机镜像创建虚拟机。

5.1. 使用镜像构建器创建自定义 KVM 客户机镜像

这描述了使用镜像构建器创建 .qcow2 KVM 客户机镜像的步骤。

先决条件

  • 您必须有对该系统的 root 或 wheel 组用户访问权限。
  • 已安装 cockpit-composer 软件包。
  • 在 RHEL 系统中,您已打开了 Cockpit UI 的 Image Builder 仪表板。

流程

  1. 点击 Create blueprint 创建蓝图。请参阅 web 控制台界面中的创建镜像构建器蓝图
  2. 选择您要作为您要创建的 KVM 客户机镜像一部分的组件和软件包。
  3. Commit 提交您对蓝图所做的更改。在右侧的一个小弹出可让您了解保存的过程,然后是您提交更改的结果。
  4. 点击左侧标题上的蓝图名称链接。
  5. 选择标签 镜像
  6. Create Image 创建自定义镜像。此时会打开弹出窗口。
  7. Type 下拉菜单中选择 'QEMU Image(.qcow2)' 镜像。
  8. 设置在实例化时镜像的大小,点 Create
  9. 窗口右上方的一个小弹出通知您已将镜像创建添加到队列中。镜像创建过程完成后,您可以看到 Image 构建的完整状态

验证步骤

  1. 点击 breadcrumbs 图标并选择 Download 选项。镜像构建器会在默认下载位置下载 KVM 客户机镜像 .qcow2 文件。

其它资源

5.2. 从 KVM 客户机镜像创建虚拟机

要快速在主机上创建带有较小内存的虚拟机,您可以使用 KVM 客户机镜像。此流程使用 Image Builder 生成的 KVM 客户机镜像作为 .qcow2 镜像格式来创建虚拟机(VM)。使用 Image Builder 创建的 KVM 客户机镜像已经安装并启用 cloud-init

先决条件

  • 已使用镜像构建器创建 .qcow2 镜像。请参阅 web 控制台界面中的创建镜像构建器蓝图。
  • qemu-kvm 软件包安装在您的系统中。您可以检查系统中可用的 /dev/kvm 文件夹。
  • 您已在您的系统中安装了 libvirt
  • 您已在您的系统中安装了 virt-install
  • genisoimage 工具安装在您的系统中。

流程

  1. 将使用 Image Builder 创建的 KVM 客户机镜像移到 /var/lib/libvirt/images 目录中,并将镜像名称重命名为 rhel-8.4-x86_64-kvm.qcow2
  2. 创建目录,如 cloudinitiso 并进入这个新创建的目录:

    $ mkdir cloudinitiso
    $ cd cloudinitiso
  3. 创建一个名为 meta-data 的文件。在这个文件中添加以下信息:

    instance-id: citest
    local-hostname: citest-1
  4. 创建名为 user-data 的文件。在该文件中添加以下信息:

    #cloud-config
    password: cilogon
    chpasswd: {expire: False}
    ssh_pwauth: True
    ssh_authorized_keys:
      - ssh-rsa AAA...fhHQ== your.email@example.com

    其中,

    • ssh_authorized_keys 是您的 SSH 公钥。您可以在 ~/.ssh/id_rsa.pub 中找到您的 SSH 公钥。
  5. 使用 genisoimage 命令创建包含 user-datameta-data 文件的 ISO 镜像。

    # genisoimage -output ciiso.iso -volid cidata -joliet -rock user-data meta-data
    
    I: -input-charset not specified, using utf-8 (detected in locale settings)
    Total translation table size: 0
    Total rockridge attributes bytes: 331
    Total directory bytes: 0
    Path table size(bytes): 10
    Max brk space used 0
    183 extents written (0 MB)
  6. 使用 virt-install 命令从 KVM 客户机镜像创建新虚拟机。包含您在第 4 步中创建的 ISO 镜像作为虚拟机镜像的附件。

    # virt-install \
        --memory 4096 \
        --vcpus 4 \
        --name mytestcivm \
        --disk /var/lib/libvirt/images/rhel-8.4-x86_64-kvm.qcow2,device=disk,bus=virtio,format=qcow2 \
        --disk /home/sample/cloudinitiso/ciiso.iso,device=cdrom \
        --os-variant rhel8.4 \
        --virt-type kvm \
        --graphics none \
        --import

    其中,

    • --graphics none - 表示它是一个无头 RHEL 8.4 虚拟机。
    • --vCPUs 4 - 表示它使用 4 个虚拟 CPU。
    • --memory 4096 - 表示它使用 4096 MB RAM。
  7. VM 安装开始:

    Starting install...
    Connected to domain mytestcivm
    ...
    [  OK  ] Started Execute cloud user/final scripts.
    [  OK  ] Reached target Cloud-init target.
    
    Red Hat Enterprise Linux 8.4 Beta (Ootpa)
    Kernel 4.18.0-221.el8.x86_64 on an x86_64

验证

  1. 使用 cloud-user 作为用户名登录到创建的虚拟机。您的密码是 cilogon

第 6 章 使用镜像构建器准备并上传云镜像

镜像构建器可以创建可用于不同供应商云的自定义系统镜像。要在云中使用自定义 RHEL 系统镜像,请使用相应的输出类型通过 Image Builder 创建系统镜像,配置系统以上传镜像,并将镜像上传到您的云帐户。在 Red Hat Enterprise Linux 8.3 中,可以在 RHEL web 控制台中通过 Image Builder 应用程序推送自定义镜像。这个功能当前只适用于支持的云供应商的一部分,如 AWSAzure 云。请参阅 Pushing images to AWS Cloud AMIPushing VHD imaged to Azure cloud

6.1. 准备上传 AWS AMI 镜像

这描述了配置系统来上传 AWS AMI 镜像的步骤。

先决条件

流程

  1. 安装 Python 3 和 pip 工具:

    # yum install python3
    # yum install python3-pip
  2. 使用 pip 安装 AWS 命令行工具:

    # pip3 install awscli
  3. 运行以下命令设定您的配置集。终端提示您提供凭证、地区和输出格式:

    $ aws configure
    AWS Access Key ID [None]:
    AWS Secret Access Key [None]:
    Default region name [None]:
    Default output format [None]:
  4. 为存储桶定义名称,并使用以下命令创建存储桶:

    $ BUCKET=bucketname
    $ aws s3 mb s3://$BUCKET

    使用实际存储桶名称替换 bucketname。它必须是全局唯一的名称。因此,您的存储桶会被创建。

  5. 然后,要授予访问 S3 存储桶的权限,如果您以前还没有这样做,请在 IAM 中创建 vmimport S3 角色:

    $ printf '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "vmie.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals":{ "sts:Externalid": "vmimport" } } } ] }' > trust-policy.json
    $ printf '{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket" ], "Resource":[ "arn:aws:s3:::%s", "arn:aws:s3:::%s/*" ] }, { "Effect":"Allow", "Action":[ "ec2:ModifySnapshotAttribute", "ec2:CopySnapshot", "ec2:RegisterImage", "ec2:Describe*" ], "Resource":"*" } ] }' $BUCKET $BUCKET > role-policy.json
    $ aws iam create-role --role-name vmimport --assume-role-policy-document file://trust-policy.json
    $ aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file://role-policy.json

6.2. 将 AMI 镜像上传到 AWS

本节论述了如何将 AMI 镜像上传到 AWS。

先决条件

  • 必须设置您的系统才能上传 AWS 镜像。
  • 您必须具有 Image Builder 创建的 AWS 镜像。在创建镜像时,使用 ami 输出类型(CLI)或 Amazon Machine Image Disk(.ami)(GUI)。

流程

  1. 将镜像推送到 S3:

    $ AMI=8db1b463-91ee-4fd9-8065-938924398428-disk.ami
    $ aws s3 cp $AMI s3://$BUCKET
    Completed 24.2 MiB/4.4 GiB (2.5 MiB/s) with 1 file(s) remaining
    ...
  2. 上传到 S3 后,将镜像作为快照导入 EC2:

    $ printf '{ "Description": "my-image", "Format": "raw", "UserBucket": { "S3Bucket": "%s", "S3Key": "%s" } }' $BUCKET $AMI > containers.json
    $ aws ec2 import-snapshot --disk-container file://containers.json

    my-image 替换为镜像的名称。

    要跟踪导入的进度,请运行:

    $ aws ec2 describe-import-snapshot-tasks --filters Name=task-state,Values=active
  3. 通过在 EC2 控制台中选择快照从上传的快照创建镜像,右键点击它并选择 Create Image:

    composer aws ec2 select snapshot

  4. 在您创建的镜像中选择 Hardware-assisted virtualizationVirtualization类型

    composer aws ec2 create image

  5. 现在,您可以使用快照中的任意机制(CLI 或 AWS 控制台)运行实例。通过 SSH 使用您的私钥访问生成的 EC2 实例。以 ec2-user 身份登录。

6.3. 将镜像推送到 AWS Cloud AMI

当前提供了将您创建的输出镜像推送到 AWS Cloud AMI 的功能。这描述了使用 Image Builder 推送到 Amazon AWS Cloud 服务提供程序创建的 .ami 镜像的步骤。

先决条件

  • 您必须有 rootwheel 组用户访问该系统。
  • 在浏览器中打开了 RHEL 8 web 控制台的 Image Builder 界面。
  • 您必须在 AWS IAM account manager 中配置了一个 Access Key ID。
  • 您必须具有一个可写的 S3 存储桶

流程

  1. Create blueprint 创建蓝图。请参阅 web 控制台界面中的创建镜像构建器蓝图
  2. 选择您要作为您要创建的镜像一部分的组件和软件包。
  3. 点击 Commit 提交您对蓝图所做的更改。

    在右侧的一个小弹出可让您了解保存的过程,然后是您提交更改的结果。

  4. 点击左侧标题上的 蓝图名称 链接。
  5. 选择标签 镜像
  6. Create Image 创建自定义镜像。

    此时会打开弹出窗口。

    1. "Type" 下拉菜单中选择 '"Amazon Machine Image Disk(.ami)' 镜像。
    2. 选中" Upload to AWS" 复选框,将您的镜像上传到 AWS Cloud 并点 Next
    3. 要验证您对 AWS 的访问,在相应字段中输入您的"AWS 访问密钥 ID"和"AWS secret 访问密钥"。点 Next

      注意

      只有在创建新的 Access Key ID 时,才能查看 AWS secret 访问密钥。如果您不知道您的 Secret Key,请生成新的访问密钥 ID。

    4. 在"Image name"字段中输入镜像名称,在 "Amazon S3 bucket name" 字段中输入 Amazon 存储桶名称,并为您要将自定义镜像添加到的存储桶输入 "AWS region" 字段。点 Next
    5. 检查您提供的信息,并在满意后点击 Finish

      (可选)您可以点击 Back 来修改任何不正确的详情。

      注意

      您必须具有要发送自定义镜像的存储桶的正确 IAM 设置。我们使用 IAM 导入和导出,因此您必须在将镜像上传到存储桶前为存储桶设置一个略。如需更多信息,请参阅 IAM 用户所需的权限

  7. 在右侧的一个小弹出可让您了解保存的过程。它还告知镜像创建过程、创建此镜像的过程以及后续的上传到 AWS Cloud。

    过程完成后,您可以看到 "Image build complete" 状态。

  8. 点菜单中的 Service→EC2,然后在 AWS 控制台中选择 正确的区域。镜像必须具有"Available"状态才能指示它已被上传。
  9. 在仪表板上,选择您的镜像并点 Launch
  10. 此时会打开一个新窗口。根据启动镜像所需的资源选择实例类型。点击 Review and Launch
  11. 查看您的实例启动详情。如果需要进行任何更改,可以编辑每个部分。点 Launch
  12. 在启动实例前,您必须选择一个公钥来访问它。

    您可以使用您已拥有的密钥对,也可以创建新的密钥对。或者,您可以使用 Image Builder 将用户添加到带有预先设置公钥的镜像中。如需了解更多详细信息,请参阅使用 SSH 密钥创建用户帐户

    按照后续步骤在 EC2 中创建一个新的密钥对,并将其附加到新实例。

    1. 在下拉菜单中选择 "Create a new key pair"
    2. 输入新密钥对名称。它生成一个新的密钥对。
    3. 点击 "下载密钥对" 在您的本地系统中保存新密钥对。
  13. 然后,您可以点击 Launch Instance 来启动实例。

    您可以检查实例的状态,它会显示为 "Initialize"

  14. 实例状态变为" running"后, 连接按钮将 变为可用。
  15. 连接。此时会出现一个弹出窗口并给出如何使用 SSH 连接的说明。

    1. 选择 "A standalone SSH client" 的首选连接方法并打开终端。
    2. 在您保存私钥的位置中,请确保您的密钥可以被公开查看,以便 SSH 正常工作。要做到这一点,请运行以下命令:

      $ chmod 400 <your-instance-name.pem>_
    3. 使用其公共 DNS 连接到您的实例:

      $ ssh -i "<_your-instance-name.pem_"> ec2-user@<_your-instance-IP-address_>
    4. 输入 "yes" 来确认您要继续连接。

      因此,您可以使用 SSH 连接到您的实例。

验证步骤

  1. 在使用 SSH 连接到您的实例时,检查是否可以执行任何操作。

6.4. 准备上传 Azure VHD 镜像

这描述了将 VHD 镜像上传到 Azure 的步骤。

先决条件

  • 您必须具有可用的 Azure 资源组和存储帐户。

流程

  1. 安装 python2:

    # yum install python2
    注意

    必须安装python2 软件包,因为 AZ CLI 依赖于 python 2.7

  2. 导入 Microsoft 存储库密钥:

    # rpm --import https://packages.microsoft.com/keys/microsoft.asc
  3. 创建本地 azure-cli 存储库信息:

    # sh -c 'echo -e "[azure-cli]\nname=Azure CLI\nbaseurl=https://packages.microsoft.com/yumrepos/azure-cli\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/azure-cli.repo'
  4. 安装 Azure CLI:

    # yumdownloader azure-cli
    # rpm -ivh --nodeps azure-cli-2.0.64-1.el7.x86_64.rpm
    注意

    下载的 Azure CLI 软件包版本可能会根据当前下载的版本而有所不同。

  5. 运行 Azure CLI:

    $ az login

    终端会显示信息,'Note, we have launched a browser for you to login.要使用老的设备代码,请使用 "az login --use-device-code"' 并打开一个您可以登录的浏览器。

    注意

    如果您正在运行远程(SSH)会话,则该链接不会在浏览器中打开。在这种情况下,您可以使用提供的链接来登录并重新创建远程会话。要登录,请使用网页浏览器打开页面 https://microsoft.com/devicelogin 并输入代码 XXXXXXXXX 进行验证。

  6. 列出 Azure 中存储帐户的密钥:

    $ GROUP=resource-group-name
    $ ACCOUNT=storage-account-name
    $ az storage account keys list --resource-group $GROUP --account-name $ACCOUNT

    resource-group-name 替换为 Azure 资源组的名称, storage-account-name 替换为 Azure 存储帐户的名称。

    注意

    您可以使用以下命令列出可用资源:

    $ az resource list
  7. 在上一命令输出中记录值 key1,并将其分配给环境变量:

    $ KEY1=value
  8. 创建存储容器:

    $ CONTAINER=storage-account-name
    $ az storage container create --account-name $ACCOUNT \
    --account-key $KEY1 --name $CONTAINER

    storage-account-name 替换为存储帐户的名称。

其它资源

6.5. 将 VHD 镜像上传到 Azure

这描述了将 VHD 镜像上传到 Azure 的步骤。

先决条件

  • 必须设置您的系统才能上传 Azure VHD 镜像。
  • 您必须具有 Image Builder 创建的 Azure VHD 镜像。在创建镜像时,使用 vhd 输出类型(CLI)或 Azure Disk Image (.vhd)(GUI)。

流程

  1. 将镜像推送到 Azure 并从中创建实例:

    $ VHD=25ccb8dd-3872-477f-9e3d-c2970cd4bbaf-disk.vhd
    $ az storage blob upload --account-name $ACCOUNT --container-name $CONTAINER --file $VHD --name $VHD --type page
    ...
  2. 上传到 Azure BLOB 后,从中创建一个 Azure 镜像:

    $ az image create --resource-group $GROUP --name $VHD --os-type linux --location eastus --source https://$ACCOUNT.blob.core.windows.net/$CONTAINER/$VHD
     - Running ...
  3. 使用 Azure 门户或类似以下的命令创建实例:

    $ az vm create --resource-group $GROUP --location eastus --name $VHD --image $VHD --admin-username azure-user --generate-ssh-keys
     - Running ...
  4. 通过 SSH 使用您的私钥访问生成的实例。以 azure-user 身份登录。

6.6. 将 VMDK 镜像上传到 vSphere

镜像构建器可以生成适合上传到 VMware ESXi 或 vSphere 系统的镜像。这描述了将 VMDK 镜像上传到 VMware vSphere 的步骤。

注意

因为 VMWare 部署通常没有将 cloud-init 配置为向虚拟机注入用户凭证,所以必须在蓝图上执行该任务。

先决条件

  • 您必须具有由 Image Builder 创建的 VMDK 镜像。在创建镜像时,使用 vmdk 输出类型(CLI)或 VMware Virtual Machine Disk (.vmdk)(GUI)。

流程

  1. 通过 HTTP 将镜像上传到 vSphere。点击 vCenter 中的 Upload Files

    composer vmware upload image

  2. 当您创建虚拟机时,在 Device Configuration 中,删除默认值 New Hard Disk 并使用下拉菜单选择 Existing Hard Disk 磁盘镜像:

    composer vmware existing disk

  3. 请确定您创建的磁盘使用 IDE 设备作为 Virtual Device Node。默认值 SCSI 会导致无法启动的虚拟机。

    composer vmware existing ide

6.7. 将 VMWare 镜像推送到 vSphere

您可以构建 VMWare 镜像并直接将其推送到 vSphere 实例,以避免下载镜像文件并手动推送。这描述了将使用 Image Builder 直接创建的 .vmdk 镜像推送到 vSphere 实例服务供应商的步骤。

先决条件

  • 您有对系统的 root 或者 wheel 组用户的访问权限。
  • 在浏览器中打开了 RHEL 8 web 控制台的 Image Builder 界面。
  • 您有一个 vSphere 帐户

流程

  1. Create blueprint

    请参阅 web 控制台界面中的创建镜像构建器蓝图

  2. 选择您要作为您要创建的镜像一部分的组件和软件包。
  3. Commit 提交您对蓝图所做的更改。

    在右上方弹出会告诉您保存的过程,然后是您提交的更改的结果。

  4. 点击左侧标题上的 蓝图名称 链接。
  5. 选择 Customizations 选项卡为蓝图创建用户帐户。

    请参阅为 蓝图创建用户帐户

  6. 选择 Images 选项卡。
  7. Create Image 创建自定义镜像。

    镜像类型窗口将打开。

  8. 镜像类型 窗口中:

    1. 在下拉菜单中选择 Type: VMWare VSphere(.vmdk)。
    2. 选中 Upload to VMware 复选框以将您的镜像上传到 vSphere。
    3. 可选:设置您要实例化的镜像的大小。最小默认大小为 2GB。
    4. Next
  9. Authentication的 Upload to VMWare 窗口中输入以下详情:

    1. username: vSphere 帐户的用户名。
    2. password: vSphere 帐户的密码。
  10. Destination的 Upload to VMWare 窗口中输入以下详情:

    1. 镜像名称:要上传的镜像的名称。
    2. host:要上传镜像的 VMWare vSphere 的 URL。
    3. Cluster:上传镜像的集群名称。
    4. 数据中心:要上传镜像的数据中心的名称。
    5. data store:要上传镜像的 Data 存储的名称。
    6. Next
  11. Review 窗口中,查看创建镜像的详情。满意后,点击 完成

    您可以点击 Back 来修改任何不正确的详情。

    镜像构建器将 RHEL 8.4 vSphere 镜像的 compose 添加到队列中,并创建并上传镜像到您指定的 vSphere 实例上的 Cluster。

    注意

    镜像构建和上传进程需要几分钟时间完成。

    过程完成后,您可以看到 Image 构建的完整状态

验证

成功完成镜像状态上传后,您可以从您上传的镜像创建一个虚拟机(VM),并登录到它。按照以下步骤操作:

  1. 访问 VMWare vSphere 客户端。
  2. 在您指定的 vSphere 实例的 Cluster 中搜索镜像。
  3. 您可以从您上传的镜像创建新虚拟机。为此:

    1. 选择您上传的镜像。
    2. 点击所选镜像上的右按钮。
    3. 点 New Virtual Machine。

      这会打开 New Virtual Machine 窗口。

      New Virtual Machine 窗口中提供以下详情:

      1. 选择创建类型:您可以选择创建一个 New Virtual Machine。
      2. 选择一个名称和文件夹:例如虚拟机名称: vSphere Virtual Machine 和您在 vSphere 客户端中选择的位置。
      3. 选择一个计算机资源: 为此操作选择目标计算机资源。
      4. 选择 storage:例如,选择 NFS-Node1
      5. 选择兼容性:镜像应只为 BIOS。
      6. 选择一个客户机操作系统:例如,选择 Linux 和 _Red Hat Fedora(64 位)。
      7. 自定义硬件:当您创建虚拟机时,右上角的 设备配置 按钮上,删除默认的 New Hard Disk 并使用下拉菜单选择现有 Hard Disk 磁盘镜像:
      8. Reployable to complete:查看详情并点击 Finish 创建镜像。
    4. 导航到 VMs 选项卡。

      1. 在列表中选择您创建的虚拟机。
      2. 点击面板中的 开始 按钮。此时会出现一个新窗口,显示虚拟机镜像载入。
      3. 使用您为蓝图创建的凭证登录。
      4. 您可以验证添加到蓝图中的软件包是否已安装。例如:

        $ rpm -qa | grep firefox

其它资源

6.8. 将 VHD 镜像推送到 Azure 云

您可以将您创建的输出镜像推送到 Azure Blob 存储。本节论述了将使用 Image Builder 创建的 .vhd 镜像推送到 Azure Cloud 服务供应商的步骤。

先决条件

  • 您必须有对该系统的根权限。
  • 在浏览器中打开了 RHEL 8 web 控制台的 Image Builder 界面。
  • 您必须创建一个存储帐户
  • 您必须准备可写入 Blob Storage

流程

  1. Create blueprint 创建蓝图。请参阅 web 控制台界面中的创建镜像构建器蓝图
  2. 选择您要作为您要创建的镜像一部分的组件和软件包。
  3. Commit 提交您对蓝图所做的更改。

    在右上方的一个小弹出可让您了解保存的过程,然后是您提交更改的结果。

  4. 点击左侧标题上的 蓝图名称 链接。
  5. 选择标签 镜像
  6. Create Image 创建自定义镜像。

    此时会打开弹出窗口。

    1. "Type" 下拉菜单中选择 Azure Disk Image (.vhd) 镜像。
    2. 选中" Upload to Azure" 复选框,将您的镜像上传到 Azure Cloud 并点 Next
    3. 要验证您对 Azure 的访问,在相应字段中输入您的 "Storage account" 和"Storage access key"。点 Next

      您可以在 Settings→Access Key 菜单列表中找到您的 存储帐户详情

    4. 输入要上传 的镜像文件"Image name ",以及您要将镜像推送到的镜像文件 Blob "Storage 容器"。点 Next
    5. 检查您提供的信息,并在满意后点击 Finish

      (可选)您可以点击 Back 来修改任何不正确的详情。

  7. 当镜像创建过程以消息开头时,右上方会显示一个小弹出: "Image 创建被添加到队列"。

    镜像过程创建完成后,点击您从中创建镜像的蓝图。您可以看到您 Images 标签页中创建的镜像的"Image build complete "状态。

  8. 要访问您推送到 Azure Cloud 的镜像,请访问 Azure Portal
  9. 在搜索栏中输入 Images 并选择 Services 下的第一个条目。您会被重定向到 Image 仪表板
  10. +Add。您会被重定向到 Create an Image dashboard。

    插入以下详情:

    1. name:为新镜像选择一个名称。
    2. 资源组:选择一个 资源组
    3. 位置:选择与分配给您的存储帐户的区域匹配的 位置。否则您将无法选择 blob。
    4. OS Type:将 OS 类型设置为 Linux
    5. VM Generation:保留在 Gen 1 中设置的 VM 生成。
    6. Storage Blob:点击 Storage blob 输入 右侧的 Browse。使用对话框查找您之前上传的镜像。

      剩余项使用默认设置。

  11. Create 来创建镜像。创建镜像后,您可以在右上角看到消息"Successfully created image"
  12. Refresh 查看新镜像并打开新创建的镜像。
  13. + Create VM。您会被重定向到 Create a virtual machine 仪表板
  14. Basic 标签页中,在 Project Details 下,您的 *SubscriptionResource Group 已经预先设置。

    如果要创建新资源组

    1. Create new

      弹出提示您创建 Resource Group Name 容器。

    2. 插入一个名称并点击 确定

      如果要保留已经预先设置的 资源组

  15. 实例详情 下插入:

    1. 虚拟机名称
    2. Region
    3. image:您创建的镜像默认是预选的。
    4. 大小:选择一个更适合您的需要的虚拟机大小。

      剩余项使用默认设置。

  16. Administrator 帐户 下,输入以下详情:

    1. username: 帐户管理员的名称。
    2. SSH 公钥源: 从下拉菜单中选择 生成新密钥对

      您可以使用您已拥有的密钥对,也可以创建新的密钥对。或者,您可以使用 Image Builder 将用户添加到带有预先设置公钥的镜像中。如需了解更多详细信息,请参阅使用 SSH 密钥创建用户帐户

    3. 密钥对名称:为密钥对插入一个名称。
  17. Inbound 端口规则 下,选择:

    1. 公共入站端口: 允许所选端口
    2. 选择入站端口:使用默认设置 SSH(22)
  18. Review + Create。您会被重定向到 Review + create 选项卡,并收到验证通过后的确认。
  19. 检查详情并点击 Create

    另外,您可以点击 Previous 修复选择的前面的选项。

  20. 弹出 生成新的密钥对 窗口。点 Download private key and create resources

    将密钥文件保存为 "yourKey.pem"。

  21. 部署完成后,点 Go to resource
  22. 您会被重定向到带有虚拟机详情的新窗口。选择页面右上方的公共 IP 地址并将其复制到您的剪贴板中。

现在,要创建与虚拟机的 SSH 连接以连接到虚拟机。

  1. 打开终端。
  2. 在提示符后打开到您的虚拟机的 SSH 连接。将 IP 地址替换为来自虚拟机的 IP 地址,并使用下载密钥文件的路径替换到 .pem 的路径。

    # ssh -i ./Downloads/yourKey.pem azureuser@10.111.12.123
  3. 需要确认是否要继续连接。键入 yes 来继续。

您推送到 Azure Storage Blob 的输出镜像现已准备好,可以用于置备。

6.9. 将 QCOW2 镜像上传到 OpenStack

镜像构建器可以生成适合上传 OpenStack 云部署的镜像,并启动实例。这描述了将 QCOW2 镜像上传到 OpenStack 的步骤。

先决条件

  • 您必须具有由 Image Builder 创建的 OpenStack 特定镜像。在创建镜像时,使用 openstack 输出类型(CLI)或 OpenStack Image (.qcow2)(GUI)。

    警告

    镜像构建器还提供通用 QCOW2 镜像类型输出格式,可以是 qcow2QEMU QCOW2 Image(.qcow2)。不使用 OpenStack 镜像类型错误,这些镜像类型也采用 QCOW2 格式,但包含特定于 OpenStack 的进一步更改。

流程

  1. 将镜像上传到 OpenStack 并从中启动实例。使用 Images 界面完成此操作:

    composer openstack upload image

  2. 使用该镜像启动实例:

    composer openstack start instance

  3. 您可以使用快照中的任何机制(CLI 或 OpenStack Web UI)运行实例。通过 SSH 使用您的私钥访问生成的实例。以 cloud-user 身份登录。

6.10. 准备将镜像上传到 Alibaba

本节论述了验证您可以在 Alibaba Cloud 上部署的自定义镜像的步骤。镜像需要一个特定的配置才能成功引导,因为 Alibaba Cloud 在使用前需要自定义镜像满足某些要求。因此,建议您使用 Alibaba 的 image_check 工具

注意

自定义镜像验证是一个可选的任务。镜像构建器生成符合 Alibaba 要求的镜像。

先决条件

  • 您必须具有由 Image Builder 创建的 Alibaba 镜像。

流程

  1. 连接到包含您要通过 Alibaba image_check 工具检查的镜像的系统。
  2. 下载 image_check 工具

    $ curl -O http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/73848/cn_zh/1557459863884/image_check
  3. 更改镜像合规工具的文件权限:

    # chmod +x image_check
  4. 运行命令启动镜像合规工具检查:

    # ./image_check

    该工具会验证系统配置并生成屏幕中显示的报告。image_check 工具会在运行镜像合规工具的同一目录中保存此报告。

  5. 如果任何检测项失败,请按照说明进行更正。如需更多信息,请参阅链接: 检测项部分。

其它资源

6.11. 将镜像上传到 Alibaba

本节论述了如何将 Alibaba 镜像上传到对象存储服务(OSS)。

先决条件

  • 设置您的系统以上传 Alibaba 镜像。
  • 您必须具有由 Image Builder 创建的 Alibaba 镜像。在创建镜像时,使用 RHEL 7 或 RHEL 8 中的 Alibaba 的 ami 输出类型。
  • 您有一个存储桶。请参阅创建存储桶
  • 您有一个活跃的 Alibaba 帐户
  • 已激活了 OSS

流程

  1. 登录到 OSS 控制台
  2. 在左侧 Bucket 菜单中,选择您要将镜像上传到的存储桶。
  3. 在右上菜单中点击 Files 标签页。
  4. Upload。此时会在右侧打开窗口对话框。选择以下信息:

    • Upload To:选择将文件上传到 Current 目录或一个指定的目录。
    • 文件 ACL:选择上传的文件的权限类型。
  5. Upload
  6. 选择您要上传的镜像。
  7. Open

自定义镜像被上传到 OSS 控制台。

6.12. 将镜像导入到 Alibaba

本节论述了如何将 Alibaba 镜像导入到 Elastic Cloud Console(ECS)。

先决条件

  • 已将镜像上传到对象存储服务(OSS)。

流程

  1. 登录到 ECS 控制台。

    1. 在左侧菜单中点击 Images
    2. 在右上方点击 Import Image。此时会打开一个窗口对话框。
    3. 确认您已设置了镜像所在的正确区域。输入以下信息:

      1. OSS 对象地址:请参阅如何获取 OSS 对象地址
      2. 镜像名称
      3. 操作系统:
      4. 系统磁盘大小:
      5. 系统架构:
      6. 平台:红帽
    4. 另外,还可提供以下详情:

      1. Image Format: qcow2 或 ami,具体取决于上传的镜像格式。
      2. Image Description
      3. Add Images of Data Disks

        在左侧菜单中选择所需存储桶后,可在 OSS 管理控制台中确定该地址,选择 Files 部分,然后点击适当镜像右侧的 Details 链接。此时会在屏幕右侧出现一个窗口,显示图像详情。OSS 对象地址位于 URL 框中。

  2. 确定

    注意

    导入过程的时间可能因镜像大小而异。

因此,自定义镜像被导入到 ECS 控制台。您可以从自定义镜像创建实例。

6.13. 使用 Alibaba 创建自定义镜像实例

您可以使用 Alibaba ECS 控制台创建自定义镜像的实例。

先决条件

  • 您已激活了 OSS 并上传您的自定义镜像。
  • 您已成功将镜像导入到 ECS 控制台。

流程

  1. 登录到 ECS 控制台。
  2. 在左侧菜单中选择 Instances
  3. 在右上角,点 Create Instance。您会被重新定向到新窗口。
  4. 填写所有需要的信息。如需了解更多详细信息,请参阅使用向导创建实例
  5. Create Instance 并确认顺序。

    注意

    根据您的订阅,您可能会看到 Create Order 选项而不是 Create Instace

因此,您有一个活跃的实例可用于部署。

法律通告

Copyright © 2021 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.