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
命令。
命令行界面的工作流总结如下:
- 将蓝图定义导出(保存)到纯文本文件
- 在文本编辑器中编辑这个文件
- 将蓝图文本文件导入(推送)到镜像构建器
- 运行 compose 从蓝图构建镜像
- 导出镜像文件以下载它
除了实现这个步骤的基本子命令外, composer-cli
命令还提供很多子命令来检查配置的蓝图和组合的状态。
要以非 root 身份运行 composer-cli
命令,用户必须位于 weldr
或 root
组中。
3.2. 使用命令行界面创建镜像构建器蓝图
此流程描述了如何使用命令行界面创建新镜像构建器蓝图。
流程
创建一个包含以下内容的纯文本文件:
name = "BLUEPRINT-NAME" description = "LONG FORM DESCRIPTION TEXT" version = "0.0.1" modules = [] groups = []
用您的蓝图的名称和描述替换 BLUEPRINT-NAME 和 LONG FORM DESCRIPTION TEXT。
根据 Semantic Versioning 方案,将 0.0.1 替换为一个版本号。
对于您要包含在蓝图中的每个软件包,在该文件中添加以下行:
[[packages]] name = "package-name" version = "package-version"
使用软件包名称替换 package-name,比如 httpd、gdb-doc 或者 coreutils。
将 package-version 替换为要使用的版本。此字段支持
dnf
版本规格:- 对于特定版本,请使用准确的版本号,如 8.10。
- 对于最新的可用版本,请使用星号 *。
- 对于最新的次版本,请使用以下格式,如 8.*。
蓝图可以通过多种方式自定义。在本例中,通过执行以下步骤可以禁用 Simultaneous Multi Threading(SMT)。如需了解更多可用的自定义,请参阅 支持的镜像自定义。
[customizations.kernel] append = "nosmt=force"
- 将文件保存为 BLUEPRINT-NAME.toml,并关闭文本编辑器。
推送(导入)蓝图:
# composer-cli blueprints push BLUEPRINT-NAME.toml
将 BLUEPRINT-NAME 替换为您在前面步骤中使用的值。
要验证蓝图是否已被推送并已存在,列出现有的蓝图:
# composer-cli blueprints list
检查蓝图中列出的组件和版本是否有效:
# composer-cli blueprints depsolve BLUEPRINT-NAME
您可以使用 composer-cli
命令作为非 root 创建镜像。要做到这一点,请将您的用户添加到 weldr
或 root
组中。要将用户添加到 weldr
组中,请执行以下步骤:
# usermod -a -G weldr user
$ newgrp weldr
3.3. 使用命令行界面编辑镜像构建器蓝图
此流程描述了如何在命令行界面中编辑现有镜像构建器蓝图。
流程
将蓝图保存(导出)到本地文本文件:
# composer-cli blueprints save BLUEPRINT-NAME
- 使用您选择的文本编辑器编辑 BLUEPRINT -NAME.toml 文件并进行修改。
在完成编辑前,请确定该文件是一个有效的蓝图:
删除这一行(如果存在):
packages = []
- 增加版本号。请记住, Image Builder 蓝图版本必须使用 Semantic Versioning 方案。另请注意,如果您不更改版本,则会自动增加版本的 补丁组件。
检查内容是否是有效的 TOML 规格。如需更多信息 ,请参阅 TOML 文档。
注意TOML 文档是一个社区产品,它不被红帽支持。您可以使用该工具报告任何问题: https://github.com/toml-lang/toml/issues
- 保存文件并关闭编辑器。
将蓝图推送到镜像构建器:
# composer-cli blueprints push BLUEPRINT-NAME.toml
请注意,您必须提供文件名,包括
.toml
扩展名,而在其他命令中可以只使用蓝图的名称。要验证上传到镜像构建器的内容是否与您的编辑匹配,请列出蓝图的内容:
# composer-cli blueprints show BLUEPRINT-NAME
检查蓝图中列出的组件和版本是否有效:
# composer-cli blueprints depsolve BLUEPRINT-NAME
3.4. 在命令行界面中使用镜像构建器创建系统镜像
此流程演示了如何使用 Image Builder 命令行界面构建自定义镜像。
先决条件
- 您已为镜像准备了蓝图。
流程
启动 compose:
# composer-cli compose start BLUEPRINT-NAME IMAGE-TYPE
将 BLUEPRINT-NAME 替换为蓝图的名称,将 IMAGE-TYPE 替换为镜像类型。有关可能的值,请查看
composer-cli compose types
命令的输出。compose 进程在后台启动,并显示 Compose 的 UUID。
等待 compose 完成。请注意,这可能需要几分钟时间。
检查 Compose 的状态:
# composer-cli compose status
完成的 compose 显示状态值 FINISHED。根据 UUID 识别列表中的内容。
完成 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-NAME 和 LONG FORM DESCRIPTION TEXT。
根据 Semantic Versioning 方案,将 VERSION 替换为版本号。
这部分只针对整个蓝图文件显示一次。
条目 modules 描述了要安装到镜像中的软件包名称和与 glob 相匹配的版本。
条目 group 描述了要安装到镜像中的一组软件包。group 将其软件包分类如下:
- Mandatory(必需)
- Default(默认)
Optional(可选)
蓝图会安装必需的软件包。没有选择可选软件包的机制。
- 镜像中包含的组
[[groups]] name = "group-name"
使用组群名称替换 group-name,比如 anaconda-tools、widget、wheel 或者users。
- 镜像中包含的软件包
[[packages]] name = "package-name" version = "package-version"
使用软件包名称替换 package-name,比如 httpd、gdb-doc 或者 coreutils。
将 package-version 替换为要使用的版本。此字段支持
dnf
版本规格:- 对于特定版本,请使用准确的版本号,如 8.10。
- 对于最新的可用版本,请使用星号 *。
- 对于最新的次版本,请使用以下格式,如 8.*。
为每个要包括的软件包重复这个块。
3.7. 支持的镜像自定义
当前,蓝图中支持多个镜像自定义。要使用这些选项,必须首先在蓝图中配置它们,并导入(推送)到 Image Builder。
目前在附带的 cockpit-composer GUI 中不支持这些自定义。
流程
设置镜像主机名:
[customizations] hostname = "baseimage"
生成系统镜像的用户规格:
[[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 替换为实际公钥。
使用适当的值替换其他占位符。
根据需要保留任何行,只需要用户名。
为每个用户重复此块。
生成系统镜像的组规格:
[[customizations.group]] name = "GROUP-NAME" gid = NUMBER
为每个组重复此块。
设置现有用户 ssh 密钥:
[[customizations.sshkey]] user = "root" key = "PUBLIC-SSH-KEY"
注意这个选项仅适用于现有用户。要创建用户并设置 ssh 密钥,请使用 用户规格进行生成的系统镜像 自定义。
在默认值中附加内核引导选项:
[customizations.kernel] append = "KERNEL-OPTION"
定义要在镜像中使用的内核名称:
[customizations.kernel.name] name = "KERNEL-NAME"
为生成的系统镜像设置时区和 网络时间协议(NTP) 服务器:
[customizations.timezone] timezone = "TIMEZONE" ntpservers = "NTP_SERVER"
如果您没有设置时区,系统将默认使用 Universal Time, Coordinated (UTC)。设置 NTP 服务器是可选的。
为生成的系统镜像设置区域设置:
[customizations.locale] languages = ["LANGUAGE"] keyboard = "KEYBOARD"
设置语言和键盘选项是必须的。您可以添加多种语言。您添加的第一个语言是主语言,其它语言则为从属语言。
为生成的系统镜像设置防火墙:
[customizations.firewall] port = ["PORTS"]
您可以使用数字端口或者
/etc/services
文件中的名称启用列表。自定义防火墙服务:
查看可用的防火墙服务。
$ firewall-cmd --get-services
在蓝图中
customizations.firewall.service
部分指定您要自定义的防火墙服务。[customizations.firewall.services] enabled = ["SERVICES"] disabled = ["SERVICES"]
firewall.services
中列出的服务与/etc/services
文件中可用的名称不同。您可选择为计划创建的系统镜像自定义防火墙服务。
注意如果您不想自定义防火墙服务,请省略蓝图中的
[customizations.firewall]
和[customizations.firewall.services]
部分。设置在引导时要启用的服务:
[customizations.services] enabled = ["SERVICES"] disabled = ["SERVICES"]
您可以控制在引导期间要启用哪些服务。有些镜像类型已经启用或禁用了特定服务,以便镜像正常工作,此设置无法覆盖。
将 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-name
、git tag
或git 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
镜像类型启用服务 sshd
、chronyd
和 cloud-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 系统)。