Menu Close

Red Hat Training

A Red Hat training course is available for RHEL 8

第 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 系统)。