4.8. 支持的镜像自定义


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

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

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

4.8.1. 选择一个发行版

您可以使用 distro 字段指定在制作镜像或在蓝图中解决依赖项时要使用的发行版。如果 distro 字段留空,蓝图会自动使用主机的操作系统发行版。如果没有指定发行版,蓝图将使用主机分发。当您升级主机操作系统时,没有指定发行版的蓝图使用升级的操作系统版本构建镜像。

您可以在较新的系统上为旧的主版本构建镜像。例如,您可以使用 RHEL 10 主机创建 RHEL 9 和 RHEL 8 镜像。但是,您无法在较旧的系统上为较新的主版本构建镜像。

重要

您无法构建一个与 RHEL 镜像构建器主机不同的操作系统镜像。例如,您无法使用 RHEL 系统构建 Fedora 或 CentOS 镜像。

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

    name = "blueprint_name"
    description = "blueprint_version"
    version = "0.1"
    distro = "different_minor_version"
    Copy to Clipboard Toggle word wrap

    例如:

    name = "tmux"
    description = "tmux image with openssh"
    version = "1.2.16"
    distro = "rhel-9.5"
    Copy to Clipboard Toggle word wrap

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

4.8.2. 选择一个软件包组

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

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

注意

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

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

    [[groups]]
    name = "group_name"
    Copy to Clipboard Toggle word wrap

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

    [[groups]]
    name = "anaconda-tools"
    Copy to Clipboard Toggle word wrap

4.8.3. 嵌入容器

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

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

  • source - 必需的字段。它是对 registry 中的容器镜像的引用。这个示例使用 registry.access.redhat.com registry。您可以指定标签版本。默认标签版本为 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
    Copy to Clipboard Toggle word wrap

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

4.8.4. 设置镜像主机名

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

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

    [customizations]
    hostname = "baseimage"
    Copy to Clipboard Toggle word wrap

4.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
    Copy to Clipboard Toggle word wrap
    [[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
    Copy to Clipboard Toggle word wrap

    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())'
    Copy to Clipboard Toggle word wrap

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

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

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

4.8.6. 指定附加组

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

  • 自定义带有组的蓝图:

    [[customizations.group]]
    name = "GROUP-NAME"
    gid = NUMBER
    Copy to Clipboard Toggle word wrap

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

    [[customizations.group]]
    name = "widget"
    gid = 1130
    Copy to Clipboard Toggle word wrap

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

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

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

    [[customizations.sshkey]]
    user = "root"
    key = "PUBLIC-SSH-KEY"
    Copy to Clipboard Toggle word wrap

    例如:

    [[customizations.sshkey]]
    user = "root"
    key = "SSH key for root"
    Copy to Clipboard Toggle word wrap
    注意

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

4.8.8. 附加一个内核参数

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

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

    [customizations.kernel]
    append = "KERNEL-OPTION"
    Copy to Clipboard Toggle word wrap

    例如:

    [customizations.kernel]
    name = "kernel-debug"
    append = "nosmt=force"
    Copy to Clipboard Toggle word wrap

4.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/
    Copy to Clipboard Toggle word wrap
  2. /usr/share/osbuild-composer/repositories/rhel-8.version.json 文件中的内容复制到新目录中:

    # cp /usr/share/osbuild-composer/repositories/rhel-8.version.json /etc/osbuild-composer/repositories
    Copy to Clipboard Toggle word wrap
  3. 编辑 /etc/osbuild-composer/repositories/rhel-8.version.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
        },
    Copy to Clipboard Toggle word wrap
  4. 重启服务:

    # systemctl restart osbuild-composer
    Copy to Clipboard Toggle word wrap
  5. 确认 kernel-rt 已包含在 .json 文件中:

    # composer-cli sources list
    # composer-cli sources info kernel-rt
    Copy to Clipboard Toggle word wrap

    您将看到您之前配置的 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 = ""
    Copy to Clipboard Toggle word wrap
  7. 将蓝图推送到服务器:

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

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

验证

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

    $ cat /proc/cmdline
    BOOT_IMAGE=(hd0,got3)/vmlinuz-5.14.0-362.24.1..el8_version_.x86_64+rt...
    Copy to Clipboard Toggle word wrap

4.8.10. 设置时区和 NTP

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

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

    [customizations.timezone]
    timezone = "TIMEZONE"
    ntpservers = "NTP_SERVER"
    Copy to Clipboard Toggle word wrap

    例如:

    [customizations.timezone]
    timezone = "US/Eastern"
    ntpservers = ["0.north-america.pool.ntp.org", "1.north-america.pool.ntp.org"]
    Copy to Clipboard Toggle word wrap
    注意

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

4.8.11. 自定义区域设置

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

流程

  • 设置区域设置:

    [customizations.locale]
    languages = ["LANGUAGE"]
    keyboard = "KEYBOARD"
    Copy to Clipboard Toggle word wrap

    例如:

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

    $ localectl list-locales
    Copy to Clipboard Toggle word wrap
  • $ localectl list-keymaps
    Copy to Clipboard Toggle word wrap

4.8.12. 

注意

  • [customizations.firewall]
    ports = ["PORTS"]
    Copy to Clipboard Toggle word wrap

    [customizations.firewall]
    ports = ["22:tcp", "80:tcp", "imap:tcp", "53:tcp", "53:udp", "30000-32767:tcp", "30000-32767:udp"]
    Copy to Clipboard Toggle word wrap

  • [customizations.firewall.services]
    enabled = ["SERVICES"]
    disabled = ["SERVICES"]
    Copy to Clipboard Toggle word wrap
  • $ firewall-cmd --get-services
    Copy to Clipboard Toggle word wrap

    [customizations.firewall.services]
    enabled = ["ftp", "ntp", "dhcp"]
    disabled = ["telnet"]
    Copy to Clipboard Toggle word wrap
    注意

4.8.13. 

  • [customizations.services]
    enabled = ["SERVICES"]
    disabled = ["SERVICES"]
    Copy to Clipboard Toggle word wrap

    [customizations.services]
    enabled = ["sshd", "cockpit.socket", "httpd"]
    disabled = ["postfix", "telnetd"]
    Copy to Clipboard Toggle word wrap

4.8.14. 

警告

[customizations.installer]
unattended = true
sudo-nopasswd = ["user", "%wheel"]
Copy to Clipboard Toggle word wrap

liveimg --url file:///run/install/<_repo_>/liveimg.tar.gz
lang en_US.UTF-8
keyboard us
timezone UTC
zerombr
clearpart --all --initlabel
text
autopart --type=plain --fstype=xfs --nohome
reboot --eject
network --device=link --bootproto=dhcp --onboot=on --activate
Copy to Clipboard Toggle word wrap

%post
echo -e "user\tALL=(ALL)\tNOPASSWD: ALL" > "/etc/sudoers.d/user"
chmod 0440 /etc/sudoers.d/user
echo -e "%wheel\tALL=(ALL)\tNOPASSWD: ALL" > "/etc/sudoers.d/%wheel"
chmod 0440 /etc/sudoers.d/%wheel
restorecon -rvF /etc/sudoers.d
%end
Copy to Clipboard Toggle word wrap

[customizations.installer.kickstart]
contents = """
text --non-interactive
zerombr
clearpart --all --initlabel --disklabel=gpt
autopart --noswap --type=lvm
network --bootproto=dhcp --device=link --activate --onboot=on
"""
Copy to Clipboard Toggle word wrap

4.8.15. 

  • [customizations]
    partitioning_mode = "lvm"
    Copy to Clipboard Toggle word wrap

4.8.16. 

注意

注意

警告

4.8.16.1. 

注意

警告

4.8.16.2. 

注意

  • [[customizations.filesystem]]
    mountpoint = "MOUNTPOINT"
    minsize = MINIMUM-PARTITION-SIZE
    Copy to Clipboard Toggle word wrap

    [[customizations.filesystem]]
    mountpoint = "/var"
    minsize = 1073741824
    Copy to Clipboard Toggle word wrap
  • [[customizations.filesystem]]
    mountpoint = "/opt"
    minsize = "20 GiB"
    Copy to Clipboard Toggle word wrap
    [[customizations.filesystem]]
    mountpoint = "/boot"
    minsize = "1 GiB"
    Copy to Clipboard Toggle word wrap
  • [[customizations.filesystem]]
    mountpoint = "/var"
    minsize = 2147483648
    Copy to Clipboard Toggle word wrap
  • [[customizations.directories]]
    path = "/etc/directory_name"
    mode = "octal_access_permission"
    user = "user_string_or_integer"
    group = "group_string_or_integer"
    ensure_parents = boolean
    Copy to Clipboard Toggle word wrap

  • [[customizations.files]]
    path = "/etc/directory_name"
    mode = "octal_access_permission"
    user = "user_string_or_integer"
    group = "group_string_or_integer"
    data = "Hello world!"
    Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat