自定义 Anaconda
大约 32 分钟
自定义 Anaconda
来源:官方文档 原始多页入口:自定义 Anaconda 内容规模:约 49,990 字符,34 个章节标题,38 个命令/代码块,21 条提示框
阅读提要
- 副标题:更改安装程序外观,并在 Red Hat Enterprise Linux 上创建自定义附加组件
- 摘要:Anaconda 是 Red Hat Enterprise Linux 使用的安装程序。当在您的环境中安装 RHEL 时,您可以自定义 Anaconda 来扩展功能。
- 主要章节:更改安装程序外观,并在 Red Hat Enterprise Linux 上创建自定义附加组件;第 1 章 Anaconda 自定义介绍;第 2 章 执行预自定义任务;第 3 章 自定义引导菜单;第 4 章 图形用户界面的品牌塑造和镀铬;第 5 章 开发安装程序附加组件;第 6 章 完成自定义后的任务
- 推荐阅读顺序:先看“阅读提要”和目录,再按章节查看“关键点/命令/注意”;需要原文细节时点击来源链接。
章节笔记
概览
- 该章节主要为下一级主题的入口。
更改安装程序外观,并在 Red Hat Enterprise Linux 上创建自定义附加组件
- 要点:摘要
第 1 章 Anaconda 自定义介绍
- 要点:Red Hat Enterprise Linux 和 Fedora 安装程序 Anaconda 对其最新版本进行了很多改进。这些改进之一就是提高了定制性。现在编写附加组件以扩展安装程序的基本功能,并更改图形用户界面的外观。
- 要点:以下组件可以自定义:
- 列表:引导菜单 - 预配置选项、颜色方案以及后台
- 列表:图形界面的外形 - 徽标、背景、产品名称
- 列表:安装程序功能 - 附加组件可通过在图形和文本用户界面中添加新的 Kickstart 命令和新屏幕来增强安装程序
- 注意:重要 本书中描述的流程是为 Red Hat Enterprise Linux 10 或类似的系统编写的。在其他系统上,用于创建自定义 ISO 镜像的工具和应用程序(如 xorrisofs )可能有所不同,流程可能需要调整。
第 2 章 执行预自定义任务
- 要点:您可以通过从红帽客户门户网站下载 Red Hat Enterprise Linux 10 引导镜像来自定义 Red Hat Enterprise Linux 安装介质。下载完后解压其内容,并重新构建启动镜像,加入特定修改以满足定制部署需求。
2.1. 使用 ISO 镜像
- 要点:自定义安装程序需要对发行版 ISO 镜像进行处理:先提取镜像内容并进行修改,然后重新构建一个包含这些更改的新启动镜像。例如,可以添加附加组件(add-ons)、product.img 或其他 Anaconda 自定义内容。该工作流程包括以下方面:
- 列表:将 Red Hat Enterprise Linux ISO 提取到工作目录。
- 列表:创建包含自定义内容的新引导镜像。
2.2. 下载 RHEL 引导镜像
- 要点:在开始自定义安装程序前,请下载红帽提供的引导镜像。在登录到您的帐户后,您可以从 红帽客户门户网站 获取 Red Hat Enterprise Linux 10 引导介质。
- 要点:其他资源
- 列表:红帽客户门户网站
- 列表:产品下载
- 注意:注意 您的帐户必须有足够的权限来下载 Red Hat Enterprise Linux 10 镜像。 您必须下载 Binary DVD 或 Boot ISO 镜像。 您不能使用其他可用的下载(如 KVM 客户机镜像或补充 DVD)自定义安装程序。
2.3. 解压 Red Hat Enterprise Linux 引导镜像
- 要点:您可以将引导镜像的内容解压到工作目录,并修改内容以创建新的引导镜像。您可以在红帽客户门户网站中找到引导镜像。
- 要点:流程
- 列表:确保目录 /mnt/iso 存在,并且当前未在那里挂载任何内容。
- 列表:挂载下载的镜像。 # mount -t iso9660 -o loop path/to/image.iso /mnt/iso 其中 path/to/image.iso 是下载的引导镜像的路径。
- 列表:创建您要放置 ISO 镜像内容的工作目录。 $ mkdir /tmp/ISO
- 列表:将挂载镜像的所有内容复制到新工作目录中。确保您使用 -p 选项来保留文件和目录的权限和所有权。 # cp -pRf /mnt/iso /tmp/ISO
- 列表:卸载镜像。 # umount /mnt/iso
- 列表:产品下载
- 命令/配置摘录:
# mount -t iso9660 -o loop path/to/image.iso /mnt/iso
$ mkdir /tmp/ISO第 3 章 自定义引导菜单
- 要点:您可以自定义引导菜单选项以满足您的特定要求。使用可用的选项,您可以修改引导过程、选择不同的启动行为以及配置影响系统初始化方式的设置。
- 要点:引导菜单自定义涉及以下高级别任务:
- 列表:完成先决条件。
- 列表:自定义引导菜单。
- 列表:创建自定义引导镜像。
3.1. 自定义引导菜单
- 要点:引导菜单 是使用安装镜像引导系统时打开的菜单。通常,使用这个菜单,您可以选择 安装 Red Hat Enterprise Linux、从本地驱动器引导 或 恢复已安装的系统 等选项。
- 要点:要自定义引导菜单,您可以:
- 列表:自定义默认选项。
- 列表:添加更多选项。
- 列表:改变视觉风格(颜色和背景)。
3.2. 带有传统 BIOS 固件的系统
- 要点:引导介质上的 boot/grub2/grub.cfg 配置文件包含预配置的菜单条目列表,以及其他控制外观和引导菜单功能的指令。
- 要点:在配置文件中,Red Hat Enterprise Linux 的默认菜单条目(测试此介质并安装 Red Hat Enterprise Linux 10)在以下块中定义:
- 列表:menuentry - 定义条目的标题。它使用单引号或双引号(' 或 ")进行指定。您可以使用 --class 选项将菜单条目分组到不同的类中,然后使用 GRUB2 主题进行不同的样式化。 注意 您必须将每个菜单条目定义包含在大括号({})中。
- 列表:linux - 定义引导的内核(示例中为/images/pxeboot/vmlinuz ),以及其他额外的选项(如果有的话)。您可以自定义这些选项,来更改引导条目的行为。一个值得注意的选项是 inst.ks=。您可以使用这个选项指定 Kickstart 文件的位置。您可以将 Kickstart 文件放在引导 ISO 镜像上,并使用 inst.ks= 选项指定它的位置;例如,您可以将 kickstart.ks 文件放在镜像的根目录中,并使用 inst.ks=hd:LABEL=RHEL-10-0-BaseOS-x86_64:/kickstart.ks。您还可以使用 dracut.cmdline (7) 手册页中列出的 dracut 选…
- 列表:initrd - 要加载的初始 RAM 磁盘( initrd )镜像的位置。grub.cfg 配置文件中使用的其他选项有: set timeout - 确定在自动使用默认菜单条目之前显示的引导菜单的时长。默认值为 60,这意味着菜单显示 60 秒。将此值设置为 -1,可完全禁用超时。 注意 在执行无头安装时,将 timeout 设置为 0 非常有用,因为此设置会立即激活默认引导条目。
- 列表:set timeout - 确定在自动使用默认菜单条目之前显示的引导菜单的时长。默认值为 60,这意味着菜单显示 60 秒。将此值设置为 -1,可完全禁用超时。 注意 在执行无头安装时,将 timeout 设置为 0 非常有用,因为此设置会立即激活默认引导条目。
- 列表:submenu - 一个允许您在其下创建子菜单,并对一些条目进行分组的子菜单块,而不是在主菜单中显示它们。默认配置中的 Troubleshooting 子菜单包含用于救援现有系统的条目。条目的标题在单引号或双引号(' 或 ")中。submenu 块包含一个或多个 menuentry 定义,整个块用大括号({})括起来。例如: submenu 'Submenu title' { menuentry 'Submenu option 1' { linux /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 nomodeset quiet init…
- 列表:set default - 确定默认条目。条目号从 0 开始。如果要使第三个条目成为默认条目,请使用 set default=2 ,以此类推。
- 命令/配置摘录:
menuentry 'Install Red Hat Enterprise Linux 10.0' --class fedora --class gnu-linux --class gnu --class os { linux /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 quiet initrd /images/pxeboot/initrd.img } menuentry 'Test this media & install Red Hat Enterprise Linux 10.0' --class fedora --class gnu-linux --class gnu --class os { linux /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 rd.live.check quiet initrd /images/pxeboot/initrd.img }
submenu 'Submenu title' { menuentry 'Submenu option 1' { linux /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 nomodeset quiet initrd /images/pxeboot/initrd.img } menuentry 'Submenu option 2' { linux /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 inst.rescue quiet initrd /images/pxeboot/initrd.img } }- 注意:注意 您必须将每个菜单条目定义包含在大括号({})中。
- 注意:重要 当使用磁盘标签引用某个驱动器时,例如 inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64,使用 \x20 替换所有空格。
3.3. 带有 UEFI 固件的系统
- 要点:引导介质上的 EFI/BOOT/grub.cfg 配置文件包含预配置的菜单条目列表,以及其他控制外观和引导菜单功能的指令。
- 要点:在配置文件中,Red Hat Enterprise Linux 的默认菜单条目(Test this media & install Red Hat Enterprise Linux 10)在以下块中定义:
- 列表:menuentry - 定义条目的标题。它使用单引号或双引号(' 或 ")指定。您可以使用 --class 选项将菜单条目分组到不同的 类 中,然后使用 GRUB2 主题进行不同的样式化。 注意 如上例所示,您必须将每个菜单条目定义包含在大括号中({})。
- 列表:linuxefi - 定义引导的内核(示例中的/images/pxeboot/vmlinuz ),以及其他额外的选项(如果有的话)。 您可以自定义这些选项,来更改引导条目的行为。 一个值得注意的选项是 inst.ks=,它允许您指定 Kickstart 文件的位置。您可以将 Kickstart 文件放在引导 ISO 镜像上,并使用 inst.ks= 选项指定它的位置;例如,您可以将 kickstart.ks 文件放在镜像的根目录中,并使用 inst.ks=hd:LABEL=RHEL-10-0-BaseOS-x86_64:/kickstart.ks。 您还可以使用您系统上 dracut.cmdline(7) 手册页中列出的 drac…
- 列表:initrdefi - 要加载的初始 RAM 磁盘(initrd)镜像的位置。
- 列表:set timeout - 确定在自动使用默认菜单条目之前显示的引导菜单的时长。默认值为 60,这意味着菜单显示 60 秒。将此值设置为 -1,可完全禁用超时。 注意 在执行无头安装时,将超时设为 0 非常有用,因为此设置会立即激活默认引导条目。
- 列表:submenu - 一个允许您在其下创建子菜单,并对一些条目进行分组的 submenu 块,而不是在主菜单中显示它们。默认配置中的 Troubleshooting 子菜单包含用于拯救现有系统的条目。 条目的标题在单引号或双引号(' 或 ")中。 前面描述的子菜单 块包含一个或多个 menuentry 定义,整个块用大括号({})括起来: submenu 'Submenu title' { menuentry 'Submenu option 1' { linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 nomodeset qu…
- 列表:set default - 确定默认条目。条目号从 0 开始。如果要使 第三个 条目成为默认条目,请使用 set default=2 ,以此类推。
- 命令/配置摘录:
menuentry 'Test this media & install Red Hat Enterprise Linux 10.0' --class fedora --class gnu-linux --class gnu --class os { linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 rd.live.check quiet initrdefi /images/pxeboot/initrd.img }
submenu 'Submenu title' { menuentry 'Submenu option 1' { linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 nomodeset quiet initrdefi /images/pxeboot/initrd.img } menuentry 'Submenu option 2' { linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 inst.rescue quiet initrdefi /images/pxeboot/initrd.img } }- 注意:注意 如上例所示,您必须将每个菜单条目定义包含在大括号中({})。
- 注意:重要 当使用磁盘标签引用某个驱动器时,例如 inst.stage2=hd:LABEL=RHEL-10-BaseOS-x86_64,使用 \x20 替换所有空格。
第 4 章 图形用户界面的品牌塑造和镀铬
- 要点:Anaconda 用户界面的自定义可能包括自定义图形元素和自定义产品名称。
- 要点:用户界面自定义涉及以下高级别任务:
- 列表:完成先决条件。
- 列表:创建自定义品牌资料(如果您计划自定义图形元素)。
- 列表:自定义图形元素(如果您计划自定义它们)。
- 列表:自定义产品名称(如果您计划自定义它)。
- 列表:创建一个 product.img 文件。
- 列表:创建一个自定义引导镜像。 注意 要创建自定义品牌塑造材料,首先参考默认的图形元素文件类型和尺寸。您可以相应地创建自定义资料。有关默认图形元素的详情,请查看安装程序运行时文件系统的 /usr/share/anaconda/pixmaps/ 目录中提供的示例文件。
- 注意:注意 要创建自定义品牌塑造材料,首先参考默认的图形元素文件类型和尺寸。您可以相应地创建自定义资料。有关默认图形元素的详情,请查看安装程序运行时文件系统的 /usr/share/anaconda/pixmaps/ 目录中提供的示例文件。
4.1. 先决条件
- 列表:您已下载并提取 ISO 镜像。
- 列表:您已创建了自己的品牌资料。
4.2. 定制图形元素
- 要点:要自定义图形元素,请使用自定义品牌材料并更新容器文件来修改或替换可自定义的元素。这有助于自定义安装程序的图形元素。
- 要点:安装程序的可自定义图形元素存储在安装程序运行时文件系统的 /usr/share/anaconda/pixmaps/ 目录中。该目录包括以下可定制文件:
- 命令/配置摘录:
pixmaps ├─ anaconda-password-show-off.svg ├─ anaconda-password-show-on.svg ├─ right-arrow-icon.png ├─ sidebar-bg.png ├─ sidebar-logo.png └─ topbar-bg.png
/* theme colors/images */ @define-color product_bg_color @redhat; /* logo and sidebar classes */ .logo-sidebar { background-image: url('/usr/share/anaconda/pixmaps/sidebar-bg.png'); background-color: @product_bg_color; background-repeat: no-repeat; } /* Add a logo to the sidebar */ .logo { background-image: url('/usr/share/anaconda/pixmaps/sidebar-logo.png'); background-position: 50% 20px; background-repeat: no-repeat; background-color: transparent; } /* This is a placeholder to be filled by a product-specific logo. */ .product-logo { background-image: none; background-color: transparent; } AnacondaSpokeWindow #nav-box { background…4.3. 自定义产品名称
- 要点:您可以通过创建自定义 .buildstamp 文件来自定义产品名称。这有助于向安装程序添加自定义名称。
- 要点:流程
- 列表:使用以下内容创建一个新的 .buildstamp 文件: [Main] Product=My Distribution Version=10 BugURL=https://bugzilla.redhat.com/ IsFinal=True 将 My Distribution 更改为您要在安装程序中显示的名称。
- 列表:创建自定义 .buildstamp 文件后,请按照 创建 product.img 文件 里的说明来创建一个包含自定义的新的 product.img 文件,然后参照 创建自定义引导镜像 里的说明来创建包含您的更改的新的可引导 ISO 文件。
- 命令/配置摘录:
[Main] Product=My Distribution Version=10 BugURL=https://bugzilla.redhat.com/ IsFinal=True4.4. 配置默认配置文件
- 要点:您可以以 .ini 文件格式编写 Anaconda 配置文件。Anaconda 配置文件由section、options 和 comments 组成。每个部分都由一个 section 标头定义,注释以 # 字符开头,key = value 定义 options。
- 要点:生成的配置文件使用 configparser Python 配置文件解析器进行了处理。
- 命令/配置摘录:
# Anaconda configuration file. [Anaconda] # Run Anaconda in the debugging mode. debug = False # List of Anaconda DBus modules that can be activated. # Supported patterns: MODULE.PREFIX., MODULE.NAME activatable_modules = org.fedoraproject.Anaconda.Modules. org.fedoraproject.Anaconda.Addons.* # List of Anaconda DBus modules that are not allowed to run. # Supported patterns: MODULE.PREFIX., MODULE.NAME forbidden_modules = # List of Anaconda DBus modules that can fail to run. # The installation won't be aborted because of them. # Supported patterns: MODULE.PREFIX., MODULE.NAME optional_modules = org.fedoraproject.Anaconda.Modules.Subscription…
# Anaconda configuration file for My Distribution [Profile] Define the profile. profile_id = my_distribution [Profile Detection] Match os-release values. os_id = my_distribution [Network] default_on_boot = NONE [Storage] file_system_type = xfs default_partitioning = / (min 2 GiB, max 50 GiB) /home (min 20 GiB, free 10 GiB) /test (size 256 MiB) swap [Storage Constraints] swap_is_recommended = True [User Interface] custom_stylesheet = /usr/share/anaconda/pixmaps/my_distribution.css第 5 章 开发安装程序附加组件
- 要点:有关 Anaconda 及其架构的详情解释了其后端以及附加组件正常工作所需的各种插件。这些信息支持对特定要求定制的自定义附加组件的开发。
5.1. Anaconda 和附加组件介绍
- 要点:Anaconda 是 Fedora、Red Hat Enterprise Linux 及其变体使用的操作系统安装程序。它是一组 Python 模块和脚本,以及一些额外的文件,如 Gtk widgets(用 C 编写的)、systemd 单元和 dracut 库。
- 要点:它们一起形成一个工具来配置生成的(目标)系统的参数,然后在计算机上配置此系统。安装过程有四个主要步骤:
- 列表:准备安装目的地(通常是磁盘分区)
- 列表:安装软件包和数据
- 列表:安装并配置引导装载程序
- 列表:配置新安装的系统
5.2. Anaconda 架构概述
- 要点:Anaconda 是一组 Python 模块和脚本。它还使用几个外部软件包和程序库。
- 要点:这个工具组的主要组件包括以下软件包:
- 列表:pykickstart - 解析并验证 Kickstart 文件。另外,提供存储安装值的数据结构。
- 列表:dnf - 安装软件包并解决依赖项的软件包管理器
- 列表:blivet - 处理与存储管理相关的所有活动
- 列表:pyanaconda - 包含 Anaconda 的用户界面和模块,如键盘和时区选择、网络配置和用户创建。同时提供各种执行面向系统功能的工具
- 列表:python-meh - 包含一个异常处理程序,可在崩溃时收集和存储额外的系统信息,并将此信息传递给 libreport 库,后者本身是 ABRT 项目 的一部分。
- 列表:dasbus 库负责 anaconda 模块的 D-Bus 库和外部组件之间的的通信
5.3. Anaconda 用户界面
- 要点:Anaconda 用户界面(UI)有一个非线性结构,也称 hub 和 spoke 模型。
- 要点:Anaconda hub 和 spoke 模型的优点是:
- 列表:进入安装程序屏幕的灵活性。
- 列表:保留默认设置的灵活性。
- 列表:提供对配置的值的概述信息。
- 列表:支持可扩展性。您可以添加 hub,而无需对任何内容重新排序,并可解决一些复杂的依赖关系。
- 列表:支持使用图形和文本模式安装。
- 列表:ready - 说明您能否访问 spoke 。例如,当安装程序配置软件包源时,spoke 的颜色是灰色的,在配置完成后前您无法访问它。
- 注意:注意 安装概述 是 Anaconda 中唯一的 hub。它显示了在安装开始前配置的选项概述
5.4. 跨 Anaconda 线程通信
- 要点:安装过程中,部分操作可能耗时较长。例如,扫描磁盘中的现有分区或下载软件包元数据。为避免界面长时间无响应,Anaconda 在单独的线程中执行这些操作。
- 要点:Gtk 工具包不支持多个线程的元素更改。Gtk 的主事件循环运行在 Anaconda 进程的主线程中。因此,所有与 GUI 相关的操作都必须在主线程中执行。为此,请使用 GLib.idle_add,这并不总是容易。pyanaconda.ui.gui.utils 模块中定义的若干辅助函数和装饰器可能会增加操作的复杂度。
5.5. Anaconda 模块和 D-Bus 库
- 要点:Anaconda 中的模块作为独立进程运行。要使用其 D-Bus API 与这些进程通信,请使用 dasbus 库。
- 要点:通过 D-Bus API 调用方法是异步的,但使用 dasbus 库,您可以将它们转换为 Python 中同步方法进行调用。您还可以写入以下程序之一:
- 列表:带有异步调用和返回处理程序的程序
- 列表:调用者需要等待调用完成的程序。
- 列表:跨 Anaconda 线程通信
5.6. Hello World addon 示例
- 要点:Anaconda 开发人员发布了一个名为"Hello World"的示例附加组件,可在 GitHub 上找到。本文档中包含了后续章节的相关说明内容。
5.7. Anaconda 附加组件结构
- 要点:Anaconda 附加组件是 Python 软件包,其中包含 init.py 目录和其他源代码目录(子包)。由于 Python 中同名包只能被导入一次,因此应为包的顶层目录指定唯一名称。
- 要点:你可以使用任意名称,因为插件在加载时与其名称无关。唯一的要求是它们必须放在特定的目录中。
- 列表:对每个界面(图形界面和文本界面)的支持可由单独的子软件包提供,对于图形界面,这些子软件包被命名为 gui ,对于基于文本的界面,这些子软件包被命名为 tui 。
- 列表:gui 和 tui 软件包包含一个 spokes 子软件包。 [1]
- 列表:软件包中包含的模块有一个任意名称。
- 列表:gui/ 和 tui/ 目录包含带有任何名称的 Python 模块。
- 列表:有的服务可以执行附加组件的实际工作。可使用 Python 或者其他任何语言编写该服务。
- 列表:该服务实现了对 D-Bus 和 Kickstart 的支持。
- 命令/配置摘录:
com_example_hello_world ├─ gui │ ├─ init.py │ └─ spokes │ └─ init.py └─ tui ├─ init.py └─ spokes └─ init.py- 注意:重要 确保在每个目录中创建一个 init.py 文件。缺少这个文件的目录被视为无效的 Python 软件包。
- 注意:注意 对于所有附加组件,请遵循 Python 的 PEP 8 和 PEP 257 指南来编写文档字符串。对于 Anaconda 中文档字符串的具体内容格式,目前尚无统一标准。唯一的要求是必须具备可读性。如果您计划为附加组件生成自动化文档,则文档字符串应遵循你所使用的工具包的相关规范。。
5.8. Anaconda 服务及配置文件
- 要点:Anaconda 服务和配置文件包含在 data/ 目录中。这些文件是启动附加组件服务并配置 D-Bus 所需要的。
- 要点:以下是 Anaconda Hello World 附加组件的一些示例:
- 命令/配置摘录:
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> <busconfig> <policy user="root"> <allow own="org.fedoraproject.Anaconda.Addons.HelloWorld"/> <allow send_destination="org.fedoraproject.Anaconda.Addons.HelloWorld"/> </policy> <policy context="default"> <deny own="org.fedoraproject.Anaconda.Addons.HelloWorld"/> <allow send_destination="org.fedoraproject.Anaconda.Addons.HelloWorld"/> </policy> </busconfig>
[D-BUS Service] # Start the org.fedoraproject.Anaconda.Addons.HelloWorld service. # Runs org_fedora_hello_world/service/main.py Name=org.fedoraproject.Anaconda.Addons.HelloWorld Exec=/usr/libexec/anaconda/start-module org_fedora_hello_world.service User=root5.9. GUI 附加组件基本特性
- 要点:与附加组件中的 Kickstart 支持类似,GUI 支持要求附加组件的每个部分都至少包含一个模块,且定义一个继承自 API 中特定类的类。
- 要点:对于图形附加组件支持,唯一要添加的类是 NormalSpoke 类,它在 pyanaconda.ui.gui.spokes 中定义,用于表示普通类型的屏幕(spoke)。请参阅 Anaconda 用户界面。
- 列表:builderObjects - 列出了来自 spoke 的 .glade 文件中的所有顶级对象,它们应与其子对象(递归方式)一起暴露给 spoke。如果所有内容都应暴露给 spoke,则列表应为空。
- 列表:mainWidgetName - 包含 .glade 文件中定义的主窗口小部件(Add Link)的 id。
- 列表:uiFile - 包含 .glade 文件的名称。
- 列表:category - 包含 spoke 所属类别的类。
- 列表:icon - 包含用于 hub 上 spoke 的图标的标识符。
- 列表:title - 定义要用于 hub 上的 spoke 的标题。
5.10. 对附加图形用户界面(GUI)添加支持
- 要点:定义一个 NormalSpoke 派生的类,以为您的加载项添加 GUI 支持。实现所需的属性、初始化、初始化、刷新、应用和执行方法,以及状态属性和就绪、完成和强制属性。
- 要点:先决条件
- 列表:您的附加组件包括对 Kickstart 的支持。请参阅 Anaconda 附加组件结构。
- 列表:安装 anaconda-widgets 和 anaconda-widgets-devel 软件包,其中包含专用于 Anaconda 的 Gtk 小部件,如 SpokeWindow。
- 列表:根据以下示例,创建带有所有必要的定义的以下模块,来添加对 Add-on 图形用户界面(GUI)的支持。 # will never be translated _ = lambda x: x N_ = lambda x: x # the path to addons is in sys.path so we can import things from org_fedora_hello_world from org_fedora_hello_world.gui.categories.hello_world import HelloWorldCategory from pyanaconda.ui.gui.spokes import N…
- 列表:category,它的值从 com_example_hello_world.gui.gui.categories 模块的 HelloWorldCategory 类导入。附加组件路径 HelloWorldCategory 位于 sys.path 中,因此值可以从 com_example_hello_world 软件包导入。category 属性是 N_function 名称的一部分,用于标记要转换的字符串;但会返回字符串的非转换版本,因为转换发生在后续阶段。
- 列表:title,其定义中包含一个下划线。title 属性下划线标记标题本身的开头,并使用 Alt+H 键盘快捷键使 spoke 可访问。 通常在类定义标头和类 属性 定义后面是初始化类实例的构造器。如果是 Anaconda 图形界面对象,有两初始化新实例的种方法:init 方法和 initialize 方法。 这两个函数背后的原因是,GUI 对象可以一次在内存中创建 ,并在不同时间完全初始化,而 spoke 初始化可能会很耗时。因此,init 方法应只调用父类的 init 方法,例如初始化非 GUI 属性。另一方面,安装程序图形用户界面初始化时调用的 initialize 方法应该完成 spoke 的整个初始化…
- 列表:refresh - 在要访问 spoke 时调用 ;此方法会刷新 spoke 的状态,主要是它的 UI 元素,以确保显示的数据与内部数据结构相匹配,并通过它来确保显示 self.data 结构中存储的当前值。
- 命令/配置摘录:
# will never be translated _ = lambda x: x N_ = lambda x: x # the path to addons is in sys.path so we can import things from org_fedora_hello_world from org_fedora_hello_world.gui.categories.hello_world import HelloWorldCategory from pyanaconda.ui.gui.spokes import NormalSpoke # export only the spoke, no helper functions, classes or constants all = ["HelloWorldSpoke"] class HelloWorldSpoke(FirstbootSpokeMixIn, NormalSpoke): """ Class for the Hello world spoke. This spoke will be in the Hello world category and thus on the Summary hub. It is a very simple example of a unit for the Anaconda's graphical user interface. Since it is also inhe…
def __init__(self, data, storage, payload): """ :see: pyanaconda.ui.common.Spoke.init :param data: data object passed to every spoke to load/store data from/to it :type data: pykickstart.base.BaseHandler :param storage: object storing storage-related information (disks, partitioning, boot loader, etc.) :type storage: blivet.Blivet :param payload: object storing packaging-related information :type payload: pyanaconda.packaging.Payload """ NormalSpoke.init(self, data, storage, payload) self._hello_world_module = HELLO_WORLD.get_proxy() def initialize(self): """ The initialize method that is called after the instance is created. …- 注意:注意 从 RHEL10 开始,存储对象 不再可用。如果您的附加组件需要与存储配置进行交互,请使用 Storage DBus 模块。
- 注意:注意 此处演示的示例非常简单,不包含任何控制;需要掌握 Python Gtk 编程知识才能在 GUI 中开发功能性的、交互式 spoke 。
5.11. 附加组件 GUI 高级功能
- 要点:pyanaconda 软件包包含多个帮助程序和工具函数,以及用于 hub 和 spoke 的结构。其中大多数位于 pyanaconda.ui.gui.utils 软件包中。
- 要点:Hello World 附加组件示例演示了englightbox 内容管理器的用法,Anaconda 也使用它。此内容管理器可以将窗口置于 lightbox 中,以提高其可见性并聚焦它,以防止用户与底层窗口进行交互。为了演示此功能,示例附加组件包含一个打开新对话框窗口的按钮;对话框本身是一个继承于 GUIObject 类的特殊 HelloWorldDialog,其在 pyanaconda.ui.gui.init 中定义。
- 命令/配置摘录:
# every GUIObject gets ksdata in init dialog = HelloWorldDialog(self.data) # show dialog above the lightbox with self.main_window.enlightbox(dialog.window): dialog.run()5.12. TUI 附加组件基本特性
- 要点:Anaconda 还支持基于文本的界面(TUI)。这个界面在功能方面有更多限制,但在某些系统上,它可能是交互式安装的唯一选择。
- 要点:安装程序中的文本模式支持是基于 simpleline 库,该库仅允许非常简单的用户交互。文本模式界面:
- 列表:不支持光标移动 - 相反,其行为类似一台行打印机。
- 列表:不支持任何视觉增强,例如使用不同的颜色或字体。
- 列表:title - 决定 spoke 的标题,类似于 GUI 中的 title 参数。
- 列表:category - 确定作为字符串的 spoke 类;类名称不在任何地方显示,它仅用于分组。
- 列表:添加对附加 GUI 的支持
- 列表:Anaconda 附加组件结构
- 注意:注意 要在附加组件中添加对文本接口的支持,请在 tui 目录下创建新的子软件包集合,如 Anaconda 附加组件结构所述。
- 注意:注意 TUI 处理类的方式与 GUI 不同。将预先存在的类别分配给您的新 spoke。创建新类需要修补 Anaconda,这不会带来任何好处。
5.13. 定义一个简单的 TUI Spoke
- 要点:您可以通过定义继承自 NormalTUISpoke 类的类来实现简单的文本用户界面(TUI) spoke。
- 要点:先决条件
- 列表:您已在 tui 目录下创建了一组新的子软件包,如 Anaconda 附加组件结构所述。
- 列表:根据以下示例,创建带有所有必要定义的模块来添加对附加文本用户界面(TUI)的支持: class HelloWorldSpoke(NormalTUISpoke): # category this spoke belongs to category = HelloWorldCategory def init(self, *args, kwargs): """ Create the representation of the spoke. :see: simpleline.render.screen.UIScreen """ super().init(*args, kwargs) self.title = N_("Hello Wo…
- 列表:setup 方法为每个条目上的 spoke 的内部属性配置默认值,然后由 refresh 方法显示,由 input 方法更新,并由 apply 方法用来更新内部数据结构。
- 列表:execute 方法与 GUI 中的等效方法具有相同的目的;在这种情况下,该方法没有任何效果。
- 列表:input 方法特定于文本界面;在 Kickstart 或 GUI 中没有等效的方法。input 方法负责用户交互。
- 列表:input 方法处理输入的字符串,并根据其类型和值采取措施。前面的示例会接收任意输入值,然后将它存储为内部属性(key)。在更复杂的附加组件中,您通常需要执行一些不平凡的操作,如将字母解析为操作、将数字转换为整数、显示额外的屏幕或切换布尔值。
- 命令/配置摘录:
class HelloWorldSpoke(NormalTUISpoke): # category this spoke belongs to category = HelloWorldCategory def init(self, *args, kwargs): """ Create the representation of the spoke. :see: simpleline.render.screen.UIScreen """ super().init(*args, kwargs) self.title = N_("Hello World") self._hello_world_module = HELLO_WORLD.get_proxy() self._container = None self._reverse = False self._lines = "" def initialize(self): """ The initialize method that is called after the instance is created. The difference between init and this method is that this may take a long time and thus could be called in a separate thread. :see: pyanaconda.ui.commo…- 注意:注意 如果仅调用祖先的 init,则不需要覆盖 init 方法,但示例中的注释描述了以可理解的方式传递给 spoke 类构造器的参数。
5.14. 使用 NormalTUISpoke 定义文本界面 spoke
- 要点:重新定义简单 TUI Spoke 示例演示了一种实现 TUI spoke 的方法,其中它的方法处理打印和处理可用的和提供的数据。
- 要点:但是,使用 pyanaconda.ui.tui.spokes 软件包中的 NormalTUISpoke 类可以以不同的方式实现这一点。通过继承此类,您只需指定应在其中设置的字段和属性,就可实现典型的 TUI spoke 。以下示例演示了这一点:
- 列表:您已在 TUI 目录下添加了一组新的子软件包,如 Anaconda 附加组件结构中所述。
- 列表:根据以下示例,创建带有所有必要定义的模块,来对 Add-on 文本用户界面(TUI)添加支持。 class HelloWorldEditSpoke(NormalTUISpoke): """Example class demonstrating usage of editing in TUI""" category = HelloWorldCategory def init(self, data, storage, payload): """ :see: simpleline.render.screen.UIScreen :param data: data object passed to every spoke to …
- 命令/配置摘录:
class HelloWorldEditSpoke(NormalTUISpoke): """Example class demonstrating usage of editing in TUI""" category = HelloWorldCategory def init(self, data, storage, payload): """ :see: simpleline.render.screen.UIScreen :param data: data object passed to every spoke to load/store data from/to it :type data: pykickstart.base.BaseHandler :param storage: object storing storage-related information (disks, partitioning, boot loader, etc.) :type storage: blivet.Blivet :param payload: object storing packaging-related information :type payload: pyanaconda.packaging.Payload """ super().init(self, *args, **kwargs) self.title = N_("Hello Wor…5.15. 部署和测试 Anaconda 附加组件
- 要点:您可以在安装环境中部署并测试您自己的 Anaconda 附加组件。要做到这一点,请按照以下步骤执行:
- 要点:先决条件
- 列表:您创建了附加组件。
- 列表:您有权访问您的 D-Bus 文件。
- 列表:您已安装了 lorax 软件包。
- 列表:在您喜欢的位置创建一个 DIR 目录。
- 列表:将 Add-on python 文件添加到 DIR/usr/share/anaconda/addons/ 中。
- 列表:将您的 D-Bus 服务文件复制到 DIR/usr/share/anaconda/dbus/services/ 中。
- 命令/配置摘录:
cd DIR
find . | cpio -c -o | pigz -9cv > DIR/updates.img第 6 章 完成自定义后的任务
- 要点:要完成自定义配置,请执行以下任务:
- 要点:这部分提供有关如何创建 product.img 镜像文件以及创建自定义引导镜像的信息。
- 列表:创建 product.img 文件(仅适用于图形化定制)。
- 列表:创建自定义引导镜像。
6.1. 创建 product.img 文件
- 要点:product.img 镜像文件是包含新安装程序文件的存档文件,这些安装程序文可在运行时取代现有的安装程序文件。
- 要点:在系统引导过程中,Anaconda 从引导介质上的 images/ 目录中加载 product.img 文件。然后,它会使用此目录中的文件替换安装程序文件系统中同名的文件。通过替换这些文件,可以对安装程序进行自定义,例如将默认图像替换为自定义图像。
- 列表:导航到工作目录,如 /tmp ,创建名为 product/ 的子目录: $ cd /tmp
- 列表:创建一个子目录 product/ $ mkdir product/
- 列表:创建一个与您要替换的文件位置相同的目录结构。例如,如果要测试安装系统上 /usr/share/anaconda/addons 目录中的附加组件,请在您的工作目录中创建同样的结构: $ mkdir -p product/usr/share/anaconda/addons 注意 要查看安装程序的运行时文件系统,请启动安装并切换到虚拟控制台 1 (Ctrl+Alt+F1),然后切换到第二个 tmux 窗口(Ctrl+b+2)。可用来浏览文件系统打开的 shell 提示符。
- 列表:将自定义文件(在这个示例中, Anaconda 的自定义附加组件)放在新创建的目录中: $ cp -r ~/path/to/custom/addon/ product/usr/share/anaconda/addons/
- 列表:重复步骤 3 和 4(为您要添加到安装程序的每个文件创建目录结构并将自定义文件放在其中)。
- 列表:在目录的根目录中创建一个 .buildstamp 文件。.buildstamp 文件描述了系统版本、产品和其他几个参数。以下是 Red Hat Enterprise Linux 8.4 中的 .buildstamp 文件示例: [Main] Product=Red Hat Enterprise Linux Version=8.4 BugURL=https://bugzilla.redhat.com/ IsFinal=True UUID=202007011344.x86_64 [Compose] Lorax=28.14.49-1 IsFinal 参数指定镜像是否是产品的发行版本(GA)版本(True),还是预发布,如 Alpha、B…
- 命令/配置摘录:
$ cd /tmp
$ mkdir product/- 注意:注意 product.img 镜像必须包含与安装程序相同的目录结构。有关安装程序目录结构的更多信息,请参阅下表:
- 注意:注意 要查看安装程序的运行时文件系统,请启动安装并切换到虚拟控制台 1 (Ctrl+Alt+F1),然后切换到第二个 tmux 窗口(Ctrl+b+2)。可用来浏览文件系统打开的 shell 提示符。
- 表格样本(共 8 行):
- 自定义内容的类型 | 文件系统位置
- Pixmaps(logo、sidebar、top bar 等) | /usr/share/anaconda/pixmaps/
- GUI 样式表 | /usr/share/anaconda/anaconda-gtk.css
- Anaconda 附加组件 | /usr/share/anaconda/addons/
6.2. 创建自定义引导镜像
- 要点:自定义引导镜像和 GUI 布局后,创建一个新镜像,其中包含您所做的更改。这有助于您测试您在安装环境中所做的更改。
- 要点:流程
- 列表:确保工作目录中包含所有更改。例如,如果您要测试附加组件,请确保将 product.img 放在 images/ 目录中。
- 列表:确保当前工作目录为已解压 ISO 镜像的顶层目录,例如 /tmp/ISO/iso/。
- 列表:安装以下软件包:isomd5sum,xorriso,lorax: # dnf install isomd5sum xorriso lorax
- 列表:使用 mkefiboot 创建 EFI 引导镜像: # mkefiboot --label=ANACONDA /tmp/ISO/iso/EFI/BOOT/ /tmp/ISO/iso/images/efiboot.img
- 列表:使用 xorrisofs 创建一个新的 ISO 镜像: # xorrisofs -o ../NEWISO.iso -R -J -V RHEL-10-0-BaseOS-x86_64 --grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img -partition_offset 16 -appended_part_as_gpt -append_partition 2 C12A7328-F81F-11D2-BA4B-00A0C93EC93B /tmp/ISO/iso/images/efiboot.img -iso_mbr_part_type EBD0A0A2-B9E5-4433-87C0-68B6…
- 列表:如果您对需要一个位置来在同一磁盘上加载文件的选项使用 LABEL= 指令,请确保 -V 选项的值与镜像的引导装载程序配置匹配。如果您的引导装载程序配置(用于 BIOS 的boot/grub2/grub.cfg 和用于 UEFI 的 EFI/BOOT/grub.cfg )使用 inst.stage2=LABEL=disk_label 节来从同一磁盘加载安装程序的第二阶段,则磁盘标签必须匹配。 重要 在引导装载程序配置文件中,将磁盘标签中的所有空格替换为 \x20。例如,如果您创建了一个带有 RHEL 10.0 标签的 ISO 镜像,则引导装载程序配置应使用 RHEL\x2010.0。
- 命令/配置摘录:
# dnf install isomd5sum xorriso lorax
# mkefiboot --label=ANACONDA /tmp/ISO/iso/EFI/BOOT/ /tmp/ISO/iso/images/efiboot.img- 注意:重要 在引导装载程序配置文件中,将磁盘标签中的所有空格替换为 \x20。例如,如果您创建了一个带有 RHEL 10.0 标签的 ISO 镜像,则引导装载程序配置应使用 RHEL\x2010.0。
完整目录
- 更改安装程序外观,并在 Red Hat Enterprise Linux 上创建自定义附加组件
- 第 1 章 Anaconda 自定义介绍
- 第 2 章 执行预自定义任务
- 2.1. 使用 ISO 镜像
- 2.2. 下载 RHEL 引导镜像
- 2.3. 解压 Red Hat Enterprise Linux 引导镜像
- 第 3 章 自定义引导菜单
- 3.1. 自定义引导菜单
- 3.2. 带有传统 BIOS 固件的系统
- 3.3. 带有 UEFI 固件的系统
- 第 4 章 图形用户界面的品牌塑造和镀铬
- 4.1. 先决条件
- 4.2. 定制图形元素
- 4.3. 自定义产品名称
- 4.4. 配置默认配置文件
- 第 5 章 开发安装程序附加组件
- 5.1. Anaconda 和附加组件介绍
- 5.2. Anaconda 架构概述
- 5.3. Anaconda 用户界面
- 5.4. 跨 Anaconda 线程通信
- 5.5. Anaconda 模块和 D-Bus 库
- 5.6. Hello World addon 示例
- 5.7. Anaconda 附加组件结构
- 5.8. Anaconda 服务及配置文件
- 5.9. GUI 附加组件基本特性
- 5.10. 对附加图形用户界面(GUI)添加支持
- 5.11. 附加组件 GUI 高级功能
- 5.12. TUI 附加组件基本特性
- 5.13. 定义一个简单的 TUI Spoke
- 5.14. 使用 NormalTUISpoke 定义文本界面 spoke
- 5.15. 部署和测试 Anaconda 附加组件
- 第 6 章 完成自定义后的任务
- 6.1. 创建 product.img 文件
- 6.2. 创建自定义引导镜像
