搜索

4.8. 支持的镜像自定义

download PDF

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

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

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

4.8.1. 选择一个发行版

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

流程

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

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

替换 "different_minor_version" 以构建不同的次版本,例如,如果要构建 RHEL 9.4 镜像,请使用 distro = "rhel-94"。在 RHEL 9.3 镜像中,您可以构建次版本,如 RHEL 9.3、RHEL 8.9 和更早的版本。

4.8.2. 选择一个软件包组

使用软件包和模块自定义蓝图。name 属性是一个必需的字符串。version 属性是一个可选字符串,如果未提供,则使用存储库中的最新版本。

注意

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

流程

  • 使用软件包自定义您的蓝图:

    [[packages]]
    name = "package_group_name"

    将 "package_group_name" 替换为组的名称。例如,"tmux"。

    [[packages]]
    name = "tmux"
    version = "2.9a"

4.8.3. 设置镜像主机名

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

流程

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

    [customizations]
    hostname = "baseimage"

4.8.4. 指定其他用户

将用户添加到镜像,并可选择设置其 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

    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 值,并省略您不需要的任何行。

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

4.8.5. 指定附加组

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

流程

  • 使用组自定义蓝图:

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

    为每个组重复此块。

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

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

流程

  • 通过为现有用户设置 SSH 密钥来自定义蓝图:
[[customizations.sshkey]]
user = "root"
key = "PUBLIC-SSH-KEY"
注意

您只能为现有用户配置 customizations.sshkey 自定义。要创建用户并设置 SSH 密钥,请参阅 生成的系统镜像的用户规格 自定义。

4.8.7. 附加一个内核参数

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

流程

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

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

    [customizations.kernel]
    name = "KERNEL-rt"

4.8.8. 设置时区和 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 服务器来在所选环境中引导。但是,您可以在蓝图中自定义时区。

4.8.9. 自定义区域设置

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

流程

  • 设置区域设置:
[customizations.locale]
languages = ["LANGUAGE"]
keyboard = "KEYBOARD"

例如:

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

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

    $ localectl list-keymaps

4.8.10. 自定义防火墙

为生成的系统镜像设置防火墙。默认情况下,防火墙阻止进入的连接,但明确启用其端口的服务除外,如 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不同。

4.8.11. 启用或禁用服务

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

流程

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

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

    例如:

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

4.8.12. 指定分区模式

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

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

    [customizations]
    partitioning_mode = "lvm"

4.8.13. 指定一个自定义文件系统配置

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

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

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

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

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

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

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

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

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

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

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

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

注意

从 RHEL 9.0 发行版开始,才支持使用 CLI 自定义挂载点。在之前的发行版本中,您只能将 root 分区指定为挂载点,并将 size 参数指定为镜像大小的别名。

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

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

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

警告

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

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

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

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

您不能创建或替换以下文件:

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

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

注意

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

警告

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

4.8.13.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 目录下的绝对路径。
    • 模式 可选 - 以八进制格式设置对文件的访问权限。如果没有指定权限,则默认为 0644。前面的零是可选的。
    • user - 可选 - 将用户设置为文件所有者。如果没有指定用户,则默认为 root。您可以将用户指定为字符串或整数。
    • group - 可选 - 将组设置为文件所有者。如果没有指定组,则默认为 root。您可以将组指定为字符串或整数。
    • data - 可选 - 指定纯文本文件的内容。如果没有指定内容,它会创建一个空文件。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.