1.3. 使用 RHEL 镜像构建器 CLI 创建系统镜像


RHEL 镜像构建器是一个创建自定义系统镜像的工具。要控制 RHEL 镜像构建器并创建自定义系统镜像,您可以使用命令行界面(CLI)或 Web 控制台界面。

1.3.1. RHEL 镜像构建器命令行界面简介

您可以使用 RHEL 镜像构建器命令行界面(CLI)创建蓝图,方法是运行带有合适的选项和子命令的 composer-cli 命令。

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

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

除了创建蓝图的基本子命令外,composer-cli 命令还提供了许多子命令来检查配置的蓝图和组成的状态。

1.3.2. 以非 root 用户身份使用 RHEL 镜像构建器

要以非 root 身份运行 composer-cli 命令,该用户必须在 weldr 组中。

先决条件

  • 您已创建了一个用户

流程

  • 要在 weldrroot 组中添加用户,请运行以下命令:

    $ sudo usermod -a -G weldr user
    $ newgrp weldr

1.3.3. 使用命令行界面创建蓝图

您可以使用 RHEL 镜像构建器命令行界面(CLI)创建新蓝图。蓝图描述了最终的镜像及其自定义,如软件包和内核自定义。

先决条件

  • 您以 root 用户身份登录,或者作为 weldr 组的成员的用户身份登录

流程

  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-doccoreutils

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

    • 对于特定版本,请使用确切的版本号,如 8.7.0
    • 对于最新可用版本,请使用星号 *
    • 对于最新的次版本,请使用以下格式,如 8.*。
  3. 自定义蓝图以满足您的需要。例如,禁用 Simultaneous Multi Threading (SMT),在蓝图文件中添加以下行:

    [customizations.kernel]
    append = "nosmt=force"

    有关其他可用的定制信息,请参阅 支持的镜像自定义

    请注意,[][[]] 是以 TOML 表达的不同数据结构。

    • [customizations.kernel] 标头代表由一组键及其对应值对定义的单个表,例如: append = "nosmt=force "。
    • [[packages]] 标头代表表数组。第一个实例定义数组及其第一个表元素,例如 name = "package-name"version = "package-version",每个后续实例都会按照您定义它们的顺序创建并定义一个新的 table 元素。
  4. 将文件保存为 例如 BLUEPRINT-NAME.toml,并关闭文本编辑器。
  5. 推送蓝图:

    # composer-cli blueprints push BLUEPRINT-NAME.toml

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

    注意

    以非 root 身份运行 composer-cli 命令创建镜像,请将您的用户添加到 weldrroot 组中。

    # usermod -a -G weldr user
    $ newgrp weldr

验证

  • 列出现有的蓝图以验证蓝图是否已推送并已存在:

    # composer-cli blueprints list
  • 显示您刚刚添加的蓝图配置:

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

    # composer-cli blueprints depsolve BLUEPRINT-NAME

    如果 RHEL 镜像构建器无法解决自定义存储库中软件包的依赖项,请清除 osbuild-composer 缓存:

    $ sudo rm -rf /var/cache/osbuild-composer/*
    $ sudo systemctl restart osbuild-composer

1.3.4. 使用命令行界面编辑蓝图

您可以在命令行(CLI)界面中编辑现有蓝图,例如,来添加新软件包或定义新组,并创建自定义镜像。为此,请按照以下步骤操作:

先决条件

  • 您已创建了一个蓝图

流程

  1. 列出现有的蓝图:

    # composer-cli blueprints list
  2. 将蓝图保存到一个本地文本文件中:

    # composer-cli blueprints save BLUEPRINT-NAME
  3. 使用文本编辑器编辑 BLUEPRINT-NAME.toml 文件并进行更改。
  4. 在完成编辑前,请验证该文件是否是一个有效的蓝图:

    1. 如果存在,从蓝图中删除以下行:

      packages = []
    2. 增加版本号,例如,从 0.0.1 增加到 0.1.0。请记住,RHEL 镜像构建器蓝图版本必须使用 Semantic Versioning 方案。请注意,如果您没有更改版本,补丁版本组件会自动增加。
  5. 保存文件并关闭文本编辑器。
  6. 将蓝图推送回 RHEL 镜像构建器:

    # composer-cli blueprints push BLUEPRINT-NAME.toml
    注意

    要将蓝图导回到 RHEL 镜像构建器,请提供包括 .toml 扩展名的文件名,而在其他命令中则只使用蓝图名称。

验证

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

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

    # composer-cli blueprints depsolve BLUEPRINT-NAME

1.3.5. 在命令行界面中使用 RHEL 镜像构建器创建一个系统镜像

您可以使用 RHEL 镜像构建器命令行界面构建一个自定义 RHEL 镜像。为此,您必须指定蓝图和镜像类型。可选,您还可以指定一个发行版。如果没有指定发行版,它将使用与主机系统一样的发行版和版本。架构也与主机上的架构一样。

先决条件

流程

  1. 可选:列出您可以创建的镜像格式:

    # composer-cli compose types
  2. 启动 compose:

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

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

    compose 进程在后台启动,并显示 composer Universally Unique Identifier (UUID)。

  3. 镜像创建最多可能需要十分钟才能完成。

    检查 Compose 的状态:

    # composer-cli compose status

    完成的 compose 显示 FINISHED 状态值。要识别列表中您的 compose,请使用其 UUID。

  4. 完成 compose 过程后,下载生成的镜像文件:

    # composer-cli compose image UUID

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

验证

创建镜像后,您可以使用以下命令检查镜像创建进度:

  • 下载镜像的元数据以获取 compose 的元数据的 .tar 文件:

    $ sudo composer-cli compose metadata UUID
  • 下载镜像的日志:

    $ sudo composer-cli compose logs UUID

    该命令会创建一个 .tar 文件,其中包含创建镜像的日志。如果日志为空,您可以检查日志。

  • 检查日志:

    $ journalctl | grep osbuild
  • 检查镜像的清单:

    $ sudo cat /var/lib/osbuild-composer/jobs/job_UUID.json

    您可以在日志中找到 job_UUID.json。

其它资源

1.3.6. 基本 RHEL 镜像构建器命令行命令

RHEL 镜像构建器命令行界面提供以下子命令。

蓝图操作

列出所有可用的蓝图
# 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 格式的蓝图文件推送(导入)到 RHEL 镜像构建器
# composer-cli blueprints push <BLUEPRINT-NAME>

从蓝图制作镜像

列出可用的镜像类型
# composer-cli compose types
启动一个目录
# composer-cli compose start <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 help

其它资源

  • 您系统上的 composer-cli(1)手册页

1.3.7. RHEL 镜像构建器蓝图格式

RHEL 镜像构建器蓝图以 TOML 格式的纯文本向用户显示。

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

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

BLUEPRINT-NAMELONG FORM DESCRIPTION TEXT 字段是您的蓝图的名称和描述。

VERSION 是根据 Semantic Versioning 方案的版本号,只对整个蓝图文件显示一次。

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

group 条目描述要安装到镜像中的一组软件包。组使用以下软件包类别:

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

    group-name 是组的名称,例如 anaconda-tools, widget, wheelusers。蓝图安装必需的和默认的软件包。没有选择可选软件包的机制。

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

package-name 是软件包的名称,如 httpdgdb-doccoreutils

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

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

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

注意

RHEL 镜像构建器工具中的软件包和模块之间没有区别。两者都被视为 RPM 软件包依赖项。

1.3.8. 支持的镜像自定义

您可以通过向蓝图中添加自定义来自定义镜像,例如:

  • 添加一个额外的 RPM 软件包
  • 启用一个服务
  • 自定义一个内核命令行参数.

在其他参数之间。您可以在蓝图中使用多个镜像自定义。通过使用自定义,您可以将软件包和组添加到在默认软件包中不可用的镜像中。要使用这些选项,请在蓝图中配置自定义,并将其导入(推送)到 RHEL 镜像构建器。

1.3.8.1. 选择一个发行版

您可以使用 distro 字段选择制作镜像时要使用的发行版,或者解决蓝图中的依赖项。如果 distro 留空,它将使用主机发行版。如果没有指定发行版,蓝图将使用主机分发。如果您升级主机操作系统,则没有发行版集合的蓝图使用新的操作系统版本构建镜像。您无法构建一个与 RHEL 镜像构建器主机不同的操作系统镜像。

  • 使用 RHEL 发行版自定义蓝图,以始终构建指定的 RHEL 镜像:

    name = "blueprint_name"
    description = "blueprint_version"
    version = "0.1"
    distro = "different_minor_version"

    例如:

    name = "tmux"
    description = "tmux image with openssh"
    version = "1.2.16"
    distro = "rhel-9.5"

将 "different_minor_version" 替换为构建不同的次版本,例如,如果要构建 RHEL 8.10 镜像,请使用 distro = "rhel-810"。在 RHEL 8.10 镜像中,您可以构建次版本,如 RHEL 8.9 及更早的版本。

1.3.8.2. 选择一个软件包组

使用软件包组自定义蓝图。groups 列表描述了您要安装到镜像中的软件包组。软件包组在存储库元数据中定义。每个组都有一个描述性名称,主要用于在用户界面中显示,以及一个 ID,通常在 Kickstart 文件中使用。在这种情况下,您必须使用 ID 来列出组。组有三种不同的方法来对软件包进行分类:mandatory、default 和 optional。蓝图中只安装了 mandatory 和 default 软件包。无法选择 optional 软件包。

name 属性是必需的字符串,必须与存储库中的软件包组 id 完全匹配。

注意

目前,osbuild-composer 中的软件包和模块之间没有区别。两者都被视为 RPM 软件包依赖项。

  • 自定义带有软件包的蓝图:

    [[groups]]
    name = "group_name"

    使用组名称替换 group_name。例如:anaconda-tools

    [[groups]]
    name = "anaconda-tools"

1.3.8.3. 嵌入容器中

您可以自定义蓝图来嵌入最新的 RHEL 容器中。容器列表包含具有源的对象,以及可选的 tls-verify 属性。

容器列表条目描述了要嵌入到镜像中的容器镜像。

  • source - 必需的字段。它是对 registry 中的容器镜像的引用。这个示例使用 registry.access.redhat.com 注册中心。您可以指定标签版本。默认标签版本为 latest。
  • name - 本地注册中心中容器的名称。
  • tls-verify - 布尔值字段。tls-verify 布尔值字段控制传输层安全性。默认值为 true。

嵌入的容器不会自动启动。要启动它,请使用文件自定义创建 systemd 单元文件或 四元组

  • 要从 registry.access.redhat.com/ubi9/ubi:latest 和来自主机的容器嵌入容器,请在蓝图中添加以下自定义:

    [[containers]]
    source = "registry.access.redhat.com/ubi9/ubi:latest"
    name =  "local-name"
    tls-verify = true
    
    [[containers]]
    source = "localhost/test:latest"
    local-storage = true

您可以使用 containers-auth.json 文件访问受保护的容器资源。请参阅 容器注册中心凭证

1.3.8.4. 设置镜像主机名

customizations.hostname 是一个可选字符串,您可以用来配置最终镜像主机名。此自定义是可选的,如果您未设置它,则蓝图使用默认主机名。

  • 自定义蓝图以配置主机名:

    [customizations]
    hostname = "baseimage"

1.3.8.5. 指定其他用户

将用户添加到镜像中,并可选择设置其 SSH 密钥。本节的所有字段都是可选的,但 name 除外。

流程

  • 自定义蓝图来将用户添加到镜像中:

    [[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
    [[customizations.user]]
    name = "admin"
    description = "Administrator account"
    password = "$6$CHO2$3rN8eviE2t50lmVyBYihTgVRHcaecmeCk31L..."
    key = "PUBLIC SSH KEY"
    home = "/srv/widget/"
    shell = "/usr/bin/bash"
    groups = ["widget", "users", "wheel"]
    uid = 1200
    gid = 1200
    expiredate = 12345

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

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

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

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

    输入 name 值,并省略您不需要的任何行。

    为每个要包含的用户重复这个块。

1.3.8.6. 指定附加组

为生成的系统镜像指定一个组。namegid 属性都是必需的。

  • 自定义带有组的蓝图:

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

    为每个组重复此块。例如:

    [[customizations.group]]
    name = "widget"
    gid = 1130

1.3.8.7. 为现有用户设置 SSH 密钥

您可以使用 customizations.sshkey 为最终镜像中的现有用户设置 SSH 密钥。userkey 属性是必需的。

  • 通过为现有用户设置 SSH 密钥来自定义蓝图:

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

    例如:

    [[customizations.sshkey]]
    user = "root"
    key = "SSH key for root"
    注意

    您只能为现有用户配置 customizations.sshkey 自定义。要创建用户并设置 SSH 密钥,请参阅 指定其他用户 自定义。

1.3.8.8. 附加一个内核参数

您可以向引导装载程序内核命令行中附加参数。默认情况下,RHEL 镜像构建器将默认内核构建到镜像中。但是,您可以通过在蓝图中配置它来自定义内核。

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

    [customizations.kernel]
    append = "KERNEL-OPTION"

    例如:

    [customizations.kernel]
    name = "kernel-debug"
    append = "nosmt=force"

1.3.8.9. 使用实时内核构建 RHEL 镜像

要使用实时内核(kernel-rt)构建 RHEL 镜像,您需要覆盖存储库,以便您可以构建镜像,其中 kernel-rt 被正确地选为默认内核。使用 /usr/share/osbuild-composer/repositories/ 目录中的 .json。然后,您可以部署您构建到系统的镜像,并使用实时内核功能。

注意

实时内核在经过认证可运行 Red Hat Enterprise Linux 的 AMD64 和 Intel 64 服务器平台上运行。

先决条件

流程

  1. 创建以下目录:

    # mkdir /etc/osbuild-composer/repositories/
  2. /usr/share/osbuild-composer/repositories/rhel-8.版本.json 文件中的内容复制到新目录中:

    # cp /usr/share/osbuild-composer/repositories/rhel-8.version.json /etc/osbuild-composer/repositories
  3. 编辑 /etc/osbuild-composer/repositories/rhel-8.版本.json 文件,使其包含 RT 内核存储库:

    # grep -C 6 kernel-rt /etc/osbuild-composer/repositories/rhel-8.version.json
          "baseurl": "https://cdn.redhat.com/content/dist/rhel8/8.version/x86_64/appstream/os",
          "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nm………..=\n=UZd/\n-----END PGP PUBLIC KEY BLOCK-----\n",
          "rhsm": true,
          "check_gpg": true
        },
        {
          "name": "kernel-rt",
          "baseurl": "https://cdn.redhat.com/content/dist/rhel8/8.version/x86_64/rt/os",
          "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBEr………fg==\n=UZd/\n-----END PGP PUBLIC KEY BLOCK-----\n",
          "rhsm": true,
          "check_gpg": true
        },
  4. 重启服务:

    # systemctl restart osbuild-composer
  5. 确认 kernel-rt 已包含在 .json 文件中:

    # composer-cli sources list
    # composer-cli sources info kernel-rt

    您将看到之前配置的 URL。

  6. 创建一个蓝图。在蓝图中,添加 "[customizations.kernel]" 自定义。以下是在蓝图中包含 "[customizations.kernel]" 的示例:

    name = "rt-kernel-image"
    description = ""
    version = "2.0.0"
    modules = []
    groups = []
    distro = "rhel-8_version_"
    [[customizations.user]]
    name = "admin"
    password = "admin"
    groups = ["users", "wheel"]
    [customizations.kernel]
    name = "kernel-rt"
    append = ""
  7. 将蓝图推送到服务器:

    # composer-cli blueprints push rt-kernel-image.toml
  8. 从您创建的蓝图构建镜像。以下示例构建一个(.qcow2)镜像:

    # composer-cli compose start rt-kernel-image qcow2
  9. 将您构建的镜像部署到您要使用实时内核功能的系统。

验证

  • 从镜像引导虚拟机后,验证镜像是否是使用正确选择的 kernel-rt 作为默认内核而构建的。

    $ cat /proc/cmdline
    BOOT_IMAGE=(hd0,got3)/vmlinuz-5.14.0-362.24.1..el8_version_.x86_64+rt...

1.3.8.10. 设置时区和 NTP

您可以自定义蓝图来配置时区和 网络时间协议 (NTP)。timezonentpservers 属性是可选字符串。如果您没有自定义时区,系统将使用 Universal Time, Coordinated (UTC)。如果您没有设置 NTP 服务器,系统将使用默认发行版。

  • 自定义带有您想要的 timezonentpservers 的蓝图:

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

    例如:

    [customizations.timezone]
    timezone = "US/Eastern"
    ntpservers = ["0.north-america.pool.ntp.org", "1.north-america.pool.ntp.org"]
    注意

    有些镜像类型,如 Google Cloud,已经建立了 NTP 服务器。您无法覆盖它,因为镜像需要 NTP 服务器来在所选环境中引导。但是,您可以在蓝图中自定义时区。

1.3.8.11. 自定义区域设置

您可以为生成的系统镜像自定义区域设置。languagekeyboard 属性是必需的。您可以添加许多其他语言。您添加的第一个语言是主语言,其他语言是次要语言。

流程

  • 设置区域设置:

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

    例如:

    [customizations.locale]
    languages = ["en_US.UTF-8"]
    keyboard = "us"
  • 要列出语言支持的值,请运行以下命令:

    $ localectl list-locales
  • 要列出键盘支持的值,请运行以下命令:

    $ localectl list-keymaps

1.3.8.12. 自定义防火墙

为生成的系统镜像设置防火墙。默认情况下,防火墙阻止进入的连接,但明确启用其端口的服务除外,如 sshd

如果您不想使用 [customizations.firewall][customizations.firewall.services],可以删除属性,或者将它们设置为空列表 []。如果您只想使用默认的防火墙设置,您可以从蓝图中省略自定义。

注意

Google 和 OpenStack 模板为其环境明确禁用防火墙。您无法通过设置蓝图来覆盖此行为。

流程

  • 使用以下设置自定义蓝图,以打开其他端口和服务:

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

    其中 ports 是包含要打开的端口或一系列端口和协议的可选字符串列表。您可以使用以下格式配置端口:port:protocol 格式。您可以使用 portA-portB:protocol 格式配置端口范围。例如:

    [customizations.firewall]
    ports = ["22:tcp", "80:tcp", "imap:tcp", "53:tcp", "53:udp", "30000-32767:tcp", "30000-32767:udp"]

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

  • customizations.firewall.service 部分中指定要启用或禁用哪个防火墙服务:

    [customizations.firewall.services]
    enabled = ["SERVICES"]
    disabled = ["SERVICES"]
  • 您可以检查可用的防火墙服务:

    $ firewall-cmd --get-services

    例如:

    [customizations.firewall.services]
    enabled = ["ftp", "ntp", "dhcp"]
    disabled = ["telnet"]
    注意

    firewall.services 中列出的服务与 /etc/services 文件中提供的 service-names 不同。

1.3.8.13. 启用或禁用服务

您可以控制在引导期间要启用哪些服务。有些镜像类型已经启用或禁用了服务,以确保镜像正常工作,您无法覆盖此设置。蓝图中的 [customizations.services] 设置不会替代这些服务,但可以将服务添加到已在镜像模板中存在的服务列表中。

  • 自定义在引导时要启用哪些服务:

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

    例如:

    [customizations.services]
    enabled = ["sshd", "cockpit.socket", "httpd"]
    disabled = ["postfix", "telnetd"]

1.3.8.14. 指定分区模式

使用 partitioning_mode 变量选择如何对您要构建的磁盘镜像进行分区。您可以使用以下支持的模式自定义镜像:

  • auto-lvm :它使用原始分区模式,除非有一个或多个文件系统自定义。在这种情况下,它使用 LVM 分区模式。
  • LVM :它总是使用 LVM 分区模式,即使没有额外的挂载点。
  • raw :它使用原始分区,即使有一个或多个挂载点。
  • 您可以使用以下自定义,使用 partitioning_mode 变量自定义蓝图:

    [customizations]
    partitioning_mode = "lvm"

1.3.8.15. 指定自定义文件系统配置

您可以在蓝图中指定自定义文件系统配置,因此创建带有特定磁盘布局的镜像,而不是默认的布局配置。通过使用蓝图中的非默认布局配置,您可以:

  • 安全基准合规性
  • 防止磁盘不足错误
  • 提高的性能
  • 与现有设置的一致性
注意

OSTree 系统不支持文件系统自定义,因为 OSTree 镜像有自己的挂载规则,如只读。不支持以下镜像类型:

  • image-installer
  • edge-installer
  • edge-simplified-installer

另外,以下镜像类型不支持文件系统自定义,因为这些镜像类型不会创建分区的操作系统镜像:

  • edge-commit
  • edge-container
  • tar
  • container

但是,以下镜像类型支持文件系统自定义:

  • simplified-installer
  • edge-raw-image
  • edge-ami
  • edge-vsphere

对于 OSTree 系统的一些额外的例外,您可以在文件系统的 /root 级别中选择任意目录名称,例如: ' /local',' /mypartition', /$PARTITION。在逻辑卷中,这些更改在 LVM 分区系统之上进行。支持以下目录: /var、' /var/log' 和 /var/lib/containers。以下是根级别的例外:

  • "/home": {Deny: true},
  • "/mnt": {Deny: true},
  • "/opt": {Deny: true},
  • "/ostree": {Deny: true},
  • "/root": {Deny: true},
  • "/SRV": {Deny: true},
  • "/var/home": {Deny: true},
  • "/var/mnt": {Deny: true},
  • "/var/opt": {Deny: true},
  • "/var/roothome": {Deny: true},
  • "/var/srv": {Deny: true},
  • "/var/usrlocal": {Deny: true},

对于 RHEL 8.10 和 9.5 的发行版本发行版本,蓝图支持以下 挂载点 及其子目录:

  • / - root 挂载点
  • /var
  • /home
  • /opt
  • /srv
  • /usr
  • /app
  • /data
  • /tmp

在 RHEL 9.5 和 8.10 发行版本中,您可以指定任意自定义挂载点,除了为操作系统保留的特定路径。

您不能在以下挂载点及其子目录中指定任意自定义挂载点:

  • /bin
  • /boot/efi
  • /dev
  • /etc
  • /lib
  • /lib64
  • /lost+found
  • /proc
  • /run
  • /sbin
  • /sys
  • /sysroot
  • /var/lock
  • /var/run

您可以在蓝图中自定义 /usr 自定义挂载点的文件系统,但不允许其子目录。

注意

从 RHEL 8.5 发行版开始,才支持使用 CLI 自定义挂载点。在之前的发行版本中,您只能将 root 分区指定为挂载点,并将 size 参数指定为镜像大小的别名。从 RHEL 8.6 开始,对于 osbuild-composer-46.1-1.el8 RPM 及更新的版本,物理分区不再可用,文件系统自定义会创建逻辑卷。

如果您在自定义镜像中有多个分区,您可以在 LVM 上创建带有自定义文件系统分区的镜像,并在运行时调整这些分区大小。要做到这一点,您可以在蓝图中指定自定义文件系统配置,因此请使用所需的磁盘布局创建镜像。默认文件系统布局保持不变 - 如果您使用没有文件系统自定义的普通镜像,cloud-init 会调整 root 分区的大小。

蓝图自动将文件系统自定义转换为 LVM 分区。

您可以使用自定义文件蓝图自定义来创建新文件或替换现有文件。您指定的文件的父目录必须存在,否则镜像构建会失败。通过在 [[customizations.directories]] 自定义中指定它来确保父目录存在。

警告

如果您将文件自定义与其他蓝图自定义相结合,这可能会影响其他自定义的功能,或者可能会覆盖当前的文件自定义。

1.3.8.15.1. 在蓝图中指定自定义文件

使用 [[customizations.files]] 蓝图自定义,您可以:

  • 创建新文本文件。
  • 修改现有文件。警告:这可能会覆盖现有内容。
  • 为您要创建的文件设置用户和组所有权。
  • 以八进制格式设置模式权限。

您无法创建或替换以下文件:

  • /etc/fstab
  • /etc/shadow
  • /etc/passwd
  • /etc/group

您可以使用 [[customizations.files]][[customizations.directories]] 蓝图自定义在镜像中创建自定义文件和目录。您只能在 /etc 目录中使用这些自定义。

注意

这些蓝图自定义被所有镜像类型支持,但部署 OSTree 提交的镜像类型除外,如 edge-raw-imageedge-installeredge-simplified-installer

警告

如果您将 customizations.directories 与设置了 modeusergroup 的镜像中已存在的目录路径一起使用,则镜像构建无法防止更改现有目录的所有权或权限。

1.3.8.15.2. 在蓝图中指定自定义目录

使用 [[customizations.directory]] 蓝图自定义,您可以:

  • 创建新目录。
  • 为您要创建的目录设置用户和组所有权。
  • 以八进制格式设置目录模式权限。
  • 确保根据需要创建父目录。

使用 [[customizations.files]] 蓝图自定义,您可以:

  • 创建新文本文件。
  • 修改现有文件。警告:这可能会覆盖现有内容。
  • 为您要创建的文件设置用户和组所有权。
  • 以八进制格式设置模式权限。
注意

您无法创建或替换以下文件:

  • /etc/fstab
  • /etc/shadow
  • /etc/passwd
  • /etc/group

以下自定义可用:

  • 在蓝图中自定义文件系统配置:

    [[customizations.filesystem]]
    mountpoint = "MOUNTPOINT"
    minsize = MINIMUM-PARTITION-SIZE

    MINIMUM-PARTITION-SIZE 值没有默认大小格式。蓝图自定义支持以下值和单位:kB 到 TB 以及 KiB 到 TiB。例如,您可以以字节为单位定义挂载点大小:

    [[customizations.filesystem]]
    mountpoint = "/var"
    minsize = 1073741824
  • 使用单位定义挂载点大小。例如:

    [[customizations.filesystem]]
    mountpoint = "/opt"
    minsize = "20 GiB"
    [[customizations.filesystem]]
    mountpoint = "/boot"
    minsize = "1 GiB"
  • 通过设置 minsize 来定义最小分区。例如:

    [[customizations.filesystem]]
    mountpoint = "/var"
    minsize = 2147483648
  • 使用 [[customizations.directories]],在 /etc 目录下为镜像创建自定义目录:

    [[customizations.directories]]
    path = "/etc/directory_name"
    mode = "octal_access_permission"
    user = "user_string_or_integer"
    group = "group_string_or_integer"
    ensure_parents = boolean

    蓝图条目如下所述:

    • path - 必需 - 输入您要创建的目录的路径。它必须是 /etc 目录下的绝对路径。
    • mode - 可选 - 以八进制格式设置目录的访问权限。如果没有指定权限,则默认为 0755。前面的零是可选的。
    • user - 可选 - 将用户设置为目录的所有者。如果没有指定用户,则默认为 root。您可以将用户指定为字符串或整数。
    • group - 可选 - 将组设置为目录的所有者。如果没有指定组,则默认为 root。您可以将组指定为字符串或整数。
    • ensure_parents - 可选 - 指定是否要根据需要创建父目录。如果没有指定值,则默认为 false
  • 使用 [[customizations.directories]],在 /etc 目录下为镜像创建自定义文件:

    [[customizations.files]]
    path = "/etc/directory_name"
    mode = "octal_access_permission"
    user = "user_string_or_integer"
    group = "group_string_or_integer"
    data = "Hello world!"

    蓝图条目如下所述:

    • path - 必需 - 输入您要创建的文件的路径。它必须是 /etc 目录下的绝对路径。
    • mode 可选 - 以八进制格式设置对文件的访问权限。如果没有指定权限,则默认为 0644。前面的零是可选的。
    • user - 可选 - 将用户设置为文件所有者。如果没有指定用户,则默认为 root。您可以将用户指定为字符串或整数。
    • group - 可选 - 将组设置为文件所有者。如果没有指定组,则默认为 root。您可以将组指定为字符串或整数。
    • data - 可选 - 指定纯文本文件的内容。如果没有指定内容,它会创建一个空文件。

1.3.9. RHEL 镜像构建器安装的软件包

当使用 RHEL 镜像构建器创建系统镜像时,系统会安装一组基本软件包组。

注意

当您在蓝图中添加其他组件时,请确保添加的组件中的软件包不会与任何其他软件包组件冲突。否则,系统无法解决依赖项并创建自定义镜像失败。您可以通过运行以下命令检查软件包之间没有冲突:

# composer-cli blueprints depsolve BLUEPRINT-NAME

默认情况下,RHEL 镜像构建器使用 Core 组作为软件包的基本列表。

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

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

tar

policycoreutils, selinux-policy-targeted

vhd

@core, langpacks-en

vmdk

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

edge-commit

redhat-release , glibc,glibc-minimal-langpack,nss-altfiles,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, lvm 2, cryptsetup, pinentry, e2 fsprogs , dosfstools, keyutils ,gnupg 2, attr, xz, gzip, firewalld, iptables, NetworkManager, NetworkManager- wifi, NetworkManager-w wan , NetworkManager-wwan, wpa _supplicant, traceroute, hostname,iproute , iputils, openssh -clients ,procps-ng, rootfiles ,openssh-server , passwd ,policycoreutils,policycoreutils-python-utils,selinux-policy-targeted , setools -console, less, tar,rsync, usbguard , usbguard, bash-completion, tmux , tmux ,ima-evm-utils,audit,podman,containernetworking-plugins,container-selinux,skopeo , criu 4netns , fuse-overlayfs ,clevis,clevis-dracut,clevis-luks,greenboot,greenboot-default-health-checks,fdo-client,fdo-owner-cli,sos,

edge-container

dnf, dosfstools, e2fsprogs, glibc, lorax-templates-generic, lorax-templates-rhel, lvm2, policycoreutils, python36, python3-iniparse, qemu-img, selinux-policy-targeted, systemd, tar, xfsprogs, xz

edge-installer

aajohan-comfortaa-fonts, abattis-cantarell-fonts, alsa-firmware, alsa-tools-firmware, anaconda, anaconda-install-env-deps, anaconda-widgets, audit, bind-utils, bitmap-fangsongti-fonts, bzip2, cryptsetup, dbus-x11, dejavu-sans-fonts, dejavu-sans-mono-fonts, device-mapper-persistent-data, dnf, dump, ethtool, fcoe-utils, ftp, gdb-gdbserver, gdisk, gfs2-utils, glibc-all-langpacks, google-noto-sans-cjk-ttc-fonts, gsettings-desktop-schemas, hdparm, hexedit, initscripts, ipmitool, iwl3945-firmware, iwl4965-firmware, iwl6000g2a-firmware, iwl6000g2b-firmware, jomolhari-fonts, kacst-farsi-fonts, kacst-qurn-fonts, kbd, kbd-misc, kdump-anaconda-addon, khmeros-base-fonts, libblockdev-lvm-dbus, libertas-sd8686-firmware, libertas-sd8787-firmware, libertas-usb8388-firmware, libertas-usb8388-olpc-firmware, libibverbs, libreport-plugin-bugzilla, libreport-plugin-reportuploader, libreport-rhel-anaconda-bugzilla, librsvg2, linux-firmware, lklug-fonts, lldpad, lohit-assamese-fonts, lohit-bengali-fonts, lohit-devanagari-fonts, lohit-gujarati-fonts, lohit-gurmukhi-fonts, lohit-kannada-fonts, lohit-odia-fonts, lohit-tamil-fonts, lohit-telugu-fonts, lsof, madan-fonts, metacity, mtr, mt-st, net-tools, nmap-ncat, nm-connection-editor, nss-tools, openssh-server, oscap-anaconda-addon, pciutils, perl-interpreter, pigz, python3-pyatspi, rdma-core, redhat-release-eula, rpm-ostree, rsync, rsyslog, sg3_utils, sil-abyssinica-fonts, sil-padauk-fonts, sil-scheherazade-fonts, smartmontools, smc-meera-fonts, spice-vdagent, strace, system-storage-manager, thai-scalable-waree-fonts, tigervnc-server-minimal, tigervnc-server-module, udisks2, udisks2-iscsi, usbutils, vim-minimal, volume_key, wget, xfsdump, xorg-x11-drivers,xorg-x11-fonts-misc,xorg-x11-server-utils,xorg-x11-server-Xorg, xorg-x11-xauth

edge-simplified-installer

attr, basesystem, binutils, bsdtar, clevis-dracut, clevis-luks, cloud-utils-growpart, coreos-installer, coreos-installer-dracut, coreutils, device-mapper-multipath, dnsmasq, dosfstools, dracut-live, e2fsprogs, fcoe-utils, fdo-init, gzip, ima-evm-utils, iproute, iptables, iputils, iscsi-initiator-utils, keyutils, lldpad, lvm2, passwd, policycoreutils, policycoreutils-python-utils, procps-ng, rootfiles, setools-console, sudo, traceroute, util-linux

image-installer

aajohan-comfortaa-fonts,abattis-cantarell-fonts,alsa-firmware,alsa-tools-firmware,anaconda,anaconda-dracut,anaconda-install-env-deps,anaconda-widgets,audit,bind-utils,bitmap-fangsongti-fonts,bzip 2, cryptsetup, curl , curl, dbus-x 11, dejavu-sans- fonts, dejavu-sans-mono- fonts, device-mapper-persistent- data, dmidecode, dnf, dracut-config- generic, dracut- network ,efiboot mgr, ethtool , ethtool, fcoe -utils, ftp ,gdb-gdbserver , gdisk ,glibc-all-langpacks,gnome-kiosk,google-noto-sans-cjk-ttc-fonts,grub2-tools,grub2-tools-extra,grub2-tools-minimal , grubby ,gsettings-desktop-schemas ,hdparm,hexedit,hostname,initscripts,ipmitool , iwl 1000-firmware ,iwl100-firmware,iwl105-firmware,iwl135-firmware,iwl2000-firmware,iwl2030-firmware,iwl3160-firmware,iwl5000-firmware,iwl5150-firmware,iwl6000g2a-firmware,iwl6000g2b-firmware,iwl6050-firmware,iwl7260-firmware,jomolhari-fonts,kacst-farsi-fonts,kacst-qurn-fonts,kbd,kbd-misc,kdump-anaconda-addon ,kernel, khmer os-base -fonts , less ,libblockdev-lvm-dbus,libibverbs,libreport-plugin-bugzilla,libreport-plugin-reportuploader,librsvg2,linux-firmware,lklug-fonts ,lldpad, lo hit-assamese-fonts ,lohit-bengali-fonts,lohit-devanagari-fonts,lohit-gujarati-fonts,lohit-gurmukhi-fonts,lohit-kannada-fonts,lohit-odia-fonts,lohit-tamil-fonts,lohit-telugu-fonts,lsof , madan-fonts, mtr,mt -st , net -tools, nfs -utils, nmap-ncat,nm-connection -editor, nss -tools, openssh -clients, openssh-server,oscap -anaconda- addon, ostree,pciutils,perl -interpreter, pigz, plymouth,prefixdevname , python3-pyatspi , rdma- core, redhat- release-eula,rng-tools,rpcbind,rpm -ostree, rsync , rsyslog, selinux- policy-targeted , sg3_utils , sil-abyssinica- fonts, sil-padauk-fonts, sil- scheherazade-fonts , smartmontools, smc- meera- fonts, spice-vdagent,strace , systemd , tar , thai-scalable-waree -fonts, tigervnc- server-minimal, tigervnc-server- module, udisks2, udisks 2-iscsi, usbutils,vim -minimal, volume_key, wget , xfsdump,xfsprogs, xorg-x11-drivers,xorg-x11-fonts- misc , xorg-x11-server -utils, xorg-x11- server-Xorg, xorg-x11-xauth , xz ,

edge-raw-image

dnf, dosfstools, e2fsprogs, glibc, lorax-templates-generic, lorax-templates-rhel, lvm2, policycoreutils, python36, python3-iniparse, qemu-img, selinux-policy-targeted, systemd, tar, xfsprogs, xz

gce

@core, langpacks-en, acpid, dhcp-client, dnf-automatic, net-tools, python3, rng-tools, tar, vim

1.3.10. 在自定义镜像中启用服务

当使用镜像构建器配置自定义镜像时,镜像使用的默认服务由以下内容决定:

  • 使用 osbuild-composer 工具的 RHEL 发行版本
  • 镜像类型

例如,ami 镜像类型默认启用 sshdchronydcloud-init 服务。如果没有启用这些服务,则自定义镜像不会引导。

表 1.4. 启用服务来支持镜像类型创建
镜像类型默认启用的服务

ami

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

openstack

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

qcow2

cloud-init

rhel-edge-commit

默认没有启用任何额外服务

tar

默认没有启用任何额外服务

vhd

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

vmdk

sshd、chronyd、vmtoolsd、cloud-init

备注:您可以自定义在系统引导期间要启用的服务。但是,自定义不会覆盖上述镜像类型默认启用的服务。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.