管理监控和更新内核
大约 182 分钟
管理监控和更新内核
来源:官方文档 原始多页入口:管理监控和更新内核 内容规模:约 157,216 字符,221 个章节标题,540 个命令/代码块,111 条提示框
阅读提要
- 副标题:在 Red Hat Enterprise Linux 10 上管理 Linux 内核的指南
- 摘要:作为系统管理员,您可以配置 Linux 内核以优化操作系统。对 Linux 内核进行修改可以提高系统性能、安全性和稳定性,并可以对系统进行审核并对问题进行故障排除。
- 主要章节:在 Red Hat Enterprise Linux 10 上管理 Linux 内核的指南;对红帽文档提供反馈;第 1 章 Linux 内核;第 2 章 64k 页大小内核;第 3 章 管理内核模块;第 4 章 配置内核命令行参数;第 5 章 在运行时配置内核参数;第 6 章 使用 RHEL 系统角色永久配置内核参数;第 7 章 使用 UKI 管理内核命令行参数;第 8 章 使用 RHEL 系统角色配置 GRUB 2 引导装载程序;第 9 章 使用内核实时修补程序应用补丁;第 10 章 在虚拟环境中保留内核 panic 参数
- 推荐阅读顺序:先看“阅读提要”和目录,再按章节查看“关键点/命令/注意”;需要原文细节时点击来源链接。
章节笔记
概览
- 该章节主要为下一级主题的入口。
在 Red Hat Enterprise Linux 10 上管理 Linux 内核的指南
- 要点:摘要
对红帽文档提供反馈
- 要点:我们致力于为您提供高质量的文档,您的反馈将对我们有很大帮助。为帮助我们改进,您可以通过 Red Hat Jira 跟踪系统提交建议或报告错误。
- 要点:流程
- 列表:登录到 Jira 网站。 如果您还没有帐户,请创建一个。
- 列表:单击顶部导航栏中的 Create。
- 列表:在 Summary 字段中输入描述性标题。
- 列表:在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 列表:点窗口底部的 Create。
第 1 章 Linux 内核
- 要点:Red Hat kernel RPM 软件包提供 Linux 内核。您必须保持内核更新,以确保您的系统具有最新的程序错误修复、性能增强、补丁和硬件兼容性。
1.1. 内核是什么
- 要点:内核是 Linux 操作系统的一个核心部分,其管理系统资源,并在硬件和软件应用程序之间提供一个接口。
- 要点:红帽内核是一个基于上游 Linux 主线内核的定制内核,红帽工程师对其进行了进一步的开发和强化,专注于稳定性和与最新技术和硬件的兼容性。
- 列表:了解 RHEL 8、RHEL 9 和 RHEL 10 上的内核版本字符串的含义
- 注意:警告 红帽只支持红帽编译的内核。
1.2. 了解 RHEL 内核版本号
- 要点:系统报告的内核版本字符串标识 Red Hat Enterprise Linux (RHEL)内核软件包。它不描述内核中的所有代码。
- 要点:在 RHEL 上,uname -r 命令的输出 和内核 RPM 软件包的版本使用相同的命名模式,如 6.12.0-124.15.1.el10_1.x86_64。字符串有以下部分:
- 列表:上游 Linux 基础版本,如 6.12。
- 列表:红帽补丁计数,如 -124。
- 列表:可选的额外补丁级别,如 .15.1。
- 列表:RHEL 发行标签,如 .el10_1。
- 列表:系统架构,如 x86_64。
- 列表:什么是 kernel-core、kernel-modules 和 kernel-modules-extras 软件包?
1.2.1. version 字符串的含义
- 要点:内核版本字符串中的上游基础号不会列出内核源中的每个更改。
- 要点:红帽不会将上游基础编号视为承诺,您的内核的行为与未修改的上游内核在该标签中的行为。
- 列表:单个驱动程序和核心子系统可以包含来自上游内核的代码,这些代码比字符串中的基础版本更新。
- 列表:随着 RHEL 主发行版本的成熟,版本字符串和上游主线之间的区别会增加。
- 列表:您不能单独使用 version 字符串来决定特定的上游功能、API 或驱动程序行为是否存在。
1.2.2. RHEL 内核如何演变
- 要点:在红帽稳定 RHEL 主发行版本后,内核将继续通过后向移植和特定于红帽的工作而有所变化。
- 要点:当红帽建立新的 RHEL 主发行版本时,工程师选择上游 Linux 基础作为该主要内核流的起点。该基础会出现在主发行版本生命周期的版本字符串中。
- 列表:从较新的上游内核中向后移植安全修复、错误修复和所选功能
- 列表:为支持的配置启用硬件和平台
- 列表:红帽特定强化、测试和集成工作
1.2.3. RHEL 8、RHEL 9 和 RHEL 10 示例
- 要点:查看 RHEL 8、RHEL 9 和 RHEL 10 中典型的 RHEL 内核版本字符串。
- 要点:下表显示了典型的 version-string 带有示例。它们不是每个发行版本的后向移植的完整列表。
- 表格样本(共 4 行):
- RHEL 主要 | version 字符串示例 | 字符串中的上游基础
- RHEL 8 | 4.18.0-553.28.1.el8_10.x86_64 | Linux 4.18
- RHEL 9 | 5.14.0-503.23.1.el9_5.x86_64 | Linux 5.14
- RHEL 10 | 6.12.0-124.15.1.el10_1.x86_64 | Linux 6.12
1.2.4. 如何确定内核功能
- 要点:将内核版本字符串与发行文档和软件包详情一起使用,以确定系统上是否支持功能。
- 要点:使用版本字符串来识别已安装的 RHEL 内核软件包,并将 RHEL 内核构建与非红帽内核区分开。要确定系统中是否支持特定功能,还要查看以下项目:
- 列表:RHEL 发行注记和功能文档,用于您的主版本和次发行版本
- 列表:您的平台的硬件和软件认证和支持声明
- 列表:已安装的内核软件包详情,例如使用 dnf info kernel 命令
1.3. RPM 软件包
- 要点:RPM 软件包由用于在 Red Hat Enterprise Linux (RHEL)上安装和擦除这些文件的文件和元数据归档。
- 要点:具体来说,RPM 软件包包含以下部分:
- 列表:GPG 签名 GPG 签名用于验证软件包的完整性。
- 列表:标头(软件包元数据) RPM 软件包管理器使用此元数据来确定软件包依赖项、安装文件的位置及其他信息。
- 列表:payload 有效负载是一个 cpio 归档,其中包含要安装到系统的文件。
- 列表:源 RPM(SRPM) SRPM 包含源代码和一个 spec 文件,该文件描述了如何将源代码构建为二进制 RPM。另外,SRPM 可以包含源代码的补丁。
- 列表:二进制 RPM 一个二进制 RPM 包含了根据源代码和补丁构建的二进制文件。
1.4. Linux 内核 RPM 软件包概述
- 要点:内核 RPM 是一个元数据软件包,它不包含任何文件,而是确保正确安装了所有必需的子软件包。
- 要点:以下列表包括所需的软件包:
- 列表:什么是 kernel-core、kernel-modules 和 kernel-modules-extras 软件包?
1.5. 显示内核软件包的内容
- 要点:要检查内核软件包是否提供了特定的文件,如模块,请查询存储库。您可以在不下载或安装软件包的情况下显示文件列表。
- 要点:使用 dnf 工具查询文件列表,例如 kernel-core、kernel-modules-core 或 kernel-modules 软件包的文件列表。请注意,kernel 软件包是一个不包含任何文件的元数据软件包。
- 列表:列出软件包的可用版本: $ dnf repoquery <package_name>
- 列表:显示软件包中的文件列表: $ dnf repoquery -l <package_name>
- 列表:打包和分发软件
- 命令/配置摘录:
$ dnf repoquery <package_name>
$ dnf repoquery -l <package_name>1.6. 安装特定的内核版本
- 要点:您可以使用 DNF 软件包管理器安装新内核。
- 要点:流程
- 列表:要安装特定的内核版本,请输入以下命令: # dnf install kernel-<version>
- 列表:Red Hat Enterprise Linux 发行日期
- 命令/配置摘录:
# dnf install kernel-<version>1.7. 更新内核
- 要点:您可以使用 DNF 软件包管理器更新内核。
- 要点:流程
- 列表:要更新内核,请输入以下命令: # dnf upgrade kernel 此命令将内核以及所有依赖项更新至最新可用版本。
- 列表:重启您的系统以使更改生效。 如需更多信息,请参阅您系统上的 dnf (8) 手册页。
- 列表:使用 DNF 工具管理软件
- 命令/配置摘录:
# dnf upgrade kernel1.8. 将内核设置为默认
- 要点:要将特定内核设置为默认值,请使用 grubby 命令行工具和 GRUB 配置。
- 要点:流程
- 列表:使用 grubby 工具将内核设置为默认。 输入以下命令,使用 grubby 工具将内核设置为默认: # grubby --set-default $kernel_path
- 列表:输入以下命令,使用 grubby 工具将内核设置为默认: # grubby --set-default $kernel_path
- 列表:使用 version 参数将内核设置为默认。 使用 kernel 关键字列出引导条目,然后将预期的内核设置为默认值: # select k in /boot/vmlinuz-*; do grubby --set-default=$k; break; done 注意 要使用 title 参数列出引导条目,请输入 # grubby --info=ALL | grep title。
- 列表:使用 kernel 关键字列出引导条目,然后将预期的内核设置为默认值: # select k in /boot/vmlinuz-*; do grubby --set-default=$k; break; done 注意 要使用 title 参数列出引导条目,请输入 # grubby --info=ALL | grep title。
- 列表:仅为下次引导设置默认内核。 输入以下命令,来只为使用 grub2-reboot 命令的下一个重启设置默认内核: # grub2-reboot <index|title|id> 警告 小心地为下次启动设置默认内核。安装新的内核 RPM、自构建内核,以及手动将条目添加到 /boot/loader/entries/ 目录中可能会更改索引值。
- 列表:输入以下命令,来只为使用 grub2-reboot 命令的下一个重启设置默认内核: # grub2-reboot <index|title|id> 警告 小心地为下次启动设置默认内核。安装新的内核 RPM、自构建内核,以及手动将条目添加到 /boot/loader/entries/ 目录中可能会更改索引值。
- 命令/配置摘录:
# grubby --set-default $kernel_path
# select k in /boot/vmlinuz-*; do grubby --set-default=$k; break; done- 注意:注意 要使用 title 参数列出引导条目,请输入 # grubby --info=ALL | grep title。
- 注意:警告 小心地为下次启动设置默认内核。安装新的内核 RPM、自构建内核,以及手动将条目添加到 /boot/loader/entries/ 目录中可能会更改索引值。
第 2 章 64k 页大小内核
- 要点:kernel-64k 是一个支持 64k 页的额外的可选的 64 位 ARM 架构内核软件包。这个额外内核与 RHEL 10 for ARM 内核一起存在,它支持 4k 页。
- 要点:最佳的系统性能与不同的内存配置要求直接相关。这些要求由内核的两个变体解决,每个变体适合不同的工作负载。因此,64 位 ARM 硬件上的 RHEL 10 提供两个 MMU 页大小:
- 列表:用于在较小的环境中有效地使用内存的 4K 页内核,
- 列表:用于具有大型连续内存工作集的工作负载的kernel-64k。
2.1. 按系统构架确定内核页大小
- 要点:您可以确定不同系统构架的内核页大小。
- 要点:流程
- 列表:确定系统架构: # uname -r 6.12.0-55.9.1.el10_0.x86_64 在这个输出中,x86_64 表示 64 位 Intel 或 AMD 架构。
- 列表:检查默认页面大小: # getconf PAGE_SIZE 4096 在 x86_64 系统上,输出为 4096 B,这意味着默认的页面大小为 4 KB。 在 ppc64le 系统中,输出为 65536 B,这意味着默认的页面大小为 64 KB。
- 命令/配置摘录:
# uname -r
6.12.0-55.9.1.el10_0.x86_64第 3 章 管理内核模块
- 要点:内核模块扩展内核功能。获取模块信息并执行管理任务,如在引导时加载、卸载和配置模块。
3.1. 内核模块简介
- 要点:内核模块使用可选功能扩展 Red Hat Enterprise Linux 内核,而无需重启系统。在 Red Hat Enterprise Linux 10 中,它们以压缩的 < replaceable& gt; .ko.xz 对象文件打包额外的内核代码。
- 要点:内核模块启用的最常见功能是:
- 列表:添加用于支持新硬件的设备驱动程序
- 列表:支持文件系统,如 GFS2 或者 NFS
- 列表:系统调用
- 列表:检查当前运行的模块。
- 列表:检查可用来加载到内核的模块。
- 列表:检查模块接受的参数。
3.2. 内核模块依赖关系
- 要点:某些内核模块有时依赖一个或多个内核模块。/lib/modules/<KERNEL_VERSION>/modules.dep 文件包含相应内核版本的内核模块依赖项的完整列表。
- 要点:依赖项文件由 depmod 程序生成,包含在 kmod 软件包中。kmod 提供的很多工具会在执行操作时考虑模块依赖项。因此,很少需要 手动 跟踪依赖项。
- 列表:Red Hat Enterprise Linux 附带的 weak-modules 脚本的目的是什么?
- 列表:什么是内核应用程序二进制接口(kABI)?(红帽知识库)
- 注意:警告 内核模块的代码在不受限制的模式下在内核空间中执行。请小心您正在加载的模块。
3.3. 列出安装的内核
- 要点:grubby --info=ALL 命令显示 BLS 安装上已安装的内核的索引列表。使用 Boot Loader Specification(BLS),您可以标准化指定引导条目的方法。BLS 由 systemd-boot 原生支持,您可以将 GRUB 配置为使用 BLS。
- 要点:流程
- 列表:列出已安装的内核: # grubby --info=ALL | grep title 显示所有已安装的内核的列表: title="Red Hat Enterprise Linux (6.12.0-55.9.1.el10_0.x86_64) 10.0" title="Red Hat Enterprise Linux (0-rescue-0d772916a9724907a5d1350bcd39ac92) 10.0" 这是 GRUB 菜单中安装的 grubby-8.40-17 内核的列表。
- 命令/配置摘录:
# grubby --info=ALL | grep title
title="Red Hat Enterprise Linux (6.12.0-55.9.1.el10_0.x86_64) 10.0" title="Red Hat Enterprise Linux (0-rescue-0d772916a9724907a5d1350bcd39ac92) 10.0"3.4. 列出当前载入的内核模块
- 要点:使用 lsmod 命令列出当前载入的内核模块。
- 要点:先决条件
- 列表:已安装 kmod 软件包。
- 列表:列出所有当前载入的内核模块: $ lsmod Module Size Used by fuse 126976 3 uinput 20480 1 xt_CHECKSUM 16384 1 ipt_MASQUERADE 16384 1 xt_conntrack 16384 1 ipt_REJECT 16384 1 nft_counter 16384 16 nf_nat_tftp 16384 0 nf_conntrack_tftp 16384 1 nf_nat_tftp tun 49152 1 bridge 192512 0 stp 16384 1 bridge llc 16384 2 bridge,stp nf_tables_set 3…
- 列表:Module 列提供了当前载入的模块的 名称。
- 列表:Size 列显示每个模块 的内存量 (KB)。
- 列表:Used by 列显示 依赖于 特定模块的模块的编号,以及名称(可选)。
- 命令/配置摘录:
$ lsmod
Module Size Used by fuse 126976 3 uinput 20480 1 xt_CHECKSUM 16384 1 ipt_MASQUERADE 16384 1 xt_conntrack 16384 1 ipt_REJECT 16384 1 nft_counter 16384 16 nf_nat_tftp 16384 0 nf_conntrack_tftp 16384 1 nf_nat_tftp tun 49152 1 bridge 192512 0 stp 16384 1 bridge llc 16384 2 bridge,stp nf_tables_set 32768 5 nft_fib_inet 16384 1 ...3.5. 显示内核模块信息
- 要点:您可以使用 modinfo 命令显示指定内核模块的详细信息。
- 要点:先决条件
- 列表:已安装 kmod 软件包。
- 列表:显示有关任何内核模块的信息: $ modinfo <pass:quotes[KERNEL_MODULE_NAME]> 例如: $ modinfo virtio_net filename: /lib/modules/6.12.0-55.9.1.el10_0.x86_64/kernel/drivers/net/virtio_net.ko.xz license: GPL description: Virtio network driver rhelversion: 9.0 srcversion: 8809CDDBE7202A1B00B9F1C alias: virtio:d00000001v* depends: net_failover…
- 命令/配置摘录:
$ modinfo <pass:quotes[KERNEL_MODULE_NAME]>
$ modinfo virtio_net- 注意:注意 在输入内核模块的名称时,不要将 .ko.xz 扩展附加到名称的末尾。内核模块名称没有扩展。但是,它们相应的文件有扩展:
3.6. 在系统运行时载入内核模块
- 要点:扩展 Linux 内核功能的最佳方法是加载内核模块。使用 modprobe 命令查找并将内核模块载入到当前运行的内核中。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:kmod 软件包已安装。
- 列表:相应的内核模块没有被载入。要确保这一点,请列出 列出当前加载的内核模块。
- 列表:选择您要载入的内核模块。 模块位于 /lib/modules/$(uname -r)/kernel/<SUBSYSTEM>/ 目录中。
- 列表:载入相关内核模块: # modprobe <pass:quotes[MODULE_NAME]> 注意 在输入内核模块的名称时,不要将 .ko.xz 扩展附加到名称的末尾。内核模块名称没有扩展名,它们对应的文件有。
- 列表:(可选)验证相关的模块是否已载入: $ lsmod | grep <pass:quotes[MODULE_NAME]> 如果模块被正确载入了,您可以显示它: $ lsmod | grep serio_raw serio_raw 16384 0 如需更多信息,请参阅系统中的 modprobe (8) 手册页。
- 命令/配置摘录:
# modprobe <pass:quotes[MODULE_NAME]>
$ lsmod | grep <pass:quotes[MODULE_NAME]>- 注意:重要 重启系统后,这个过程中描述的更改不会保留。有关如何在系统重启后将内核模块载入为 持久性 的详情,请参考 在系统引导时自动载入内核模块。
- 注意:注意 在输入内核模块的名称时,不要将 .ko.xz 扩展附加到名称的末尾。内核模块名称没有扩展名,它们对应的文件有。
3.7. 在系统运行时卸载内核模块
- 要点:您可以使用 modprobe 命令在当前载入的内核运行时在系统运行时查找和卸载内核模块。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:kmod 软件包已安装。
- 列表:列出所有载入的内核模块: # lsmod
- 列表:选择要卸载的内核模块。 如果内核模块有依赖项,请在卸载内核模块前卸载它们。
- 列表:卸载相关内核模块: # modprobe -r <pass:quotes[MODULE_NAME]> 在输入内核模块的名称时,不要将 .ko.xz 扩展附加到名称的末尾。内核模块名称没有扩展名,它们对应的文件有。 重要 卸载不活跃的内核模块不会禁用为引导时自动载入配置的模块。系统重启时,这些模块将再次被自动载入。
- 列表:(可选)验证相关模块是否已卸载: $ lsmod | grep <pass:quotes[MODULE_NAME]> 如果模块被成功卸载,这个命令不显示任何输出。
- 命令/配置摘录:
# lsmod
# modprobe -r <pass:quotes[MODULE_NAME]>- 注意:警告 您不能卸载在运行的系统中活跃的内核模块。这可能导致系统不稳定或无法运行。
- 注意:重要 卸载不活跃的内核模块不会禁用为引导时自动载入配置的模块。系统重启时,这些模块将再次被自动载入。
3.8. 在启动过程早期卸载内核模块
- 要点:要在引导过程早期阻止内核模块加载,请使用引导装载程序。当模块导致系统在永久禁用它前变得无响应时,这非常有用。
- 要点:您可以在引导序列继续前编辑相关的引导装载程序条目,来卸载所需的内核模块。
- 列表:您有一个您打算防止其载入的可加载内核模块。
- 列表:将系统启动到引导装载程序中。
- 列表:使用光标键突出显示相关的引导装载程序条目。
- 列表:按 e 键编辑条目。
- 列表:使用光标键导航到以 linux 开头的行。
- 列表:将 modprobe.blacklist=module_name 附加到行尾。 serio_raw 内核模块演示了一个要在引导过程早期卸载的恶意模块。
- 命令/配置摘录:
# lsmod | grep serio_raw- 注意:重要 此流程中描述的更改在系统重启后 不会持久。有关如何在 denylist 中添加内核模块的详情,请参考 防止内核模块在系统引导时被自动加载。
3.9. 在系统引导时自动载入内核模块
- 要点:您可以将内核模块配置为在引导过程中自动载入。
- 要点:先决条件
- 列表:根权限
- 列表:kmod 软件包已安装。
- 列表:选择您要在引导过程中载入的内核模块。 模块位于 /lib/modules/$(uname -r)/kernel/<SUBSYSTEM>/ 目录中。
- 列表:为模块创建配置文件: # echo <MODULE_NAME> > /etc/modules-load.d/<MODULE_NAME>.conf 注意 在输入内核模块的名称时,不要将 .ko.xz 扩展附加到名称的末尾。内核模块名称没有扩展名,它们对应的文件有。
- 列表:重启后,验证相关模块是否已载入: $ lsmod | grep <MODULE_NAME> 重要 重启系统后,这个过程中描述的更改将会保留。 详情请查看您系统上的 modules-load.d (5) 手册页。
- 命令/配置摘录:
# echo <MODULE_NAME> > /etc/modules-load.d/<MODULE_NAME>.conf
$ lsmod | grep <MODULE_NAME>- 注意:注意 在输入内核模块的名称时,不要将 .ko.xz 扩展附加到名称的末尾。内核模块名称没有扩展名,它们对应的文件有。
- 注意:重要 重启系统后,这个过程中描述的更改将会保留。
3.10. 防止在系统引导时自动载入内核模块
- 要点:通过使用对应的命令在 modprobe 配置文件中列出模块,防止系统在引导过程中自动载入内核模块。
- 要点:先决条件
- 列表:此流程中的命令需要 root 权限。使用 su - 切换到 root 用户,或在命令前使用 sudo 。
- 列表:kmod 软件包已安装。
- 列表:确定您当前的系统配置不需要您计划拒绝的内核模块。
- 列表:使用 lsmod 命令列出载入到当前运行的内核的模块: $ lsmod Module Size Used by tls 131072 0 uinput 20480 1 snd_seq_dummy 16384 0 snd_hrtimer 16384 1 … 在输出中,识别您要防止加载的模块。 或者,识别您要防止在 /lib/modules/<KERNEL-VERSION>/kernel/<SUBSYSTEM>/ 目录中加载的而未加载的内核模块,例如: $ ls /lib/modules/6.12.0-55.9.1.el10_0.x86_64/kernel/crypto/ ansi_cprng.ko.xz chacha20poly13…
- 列表:或者,识别您要防止在 /lib/modules/<KERNEL-VERSION>/kernel/<SUBSYSTEM>/ 目录中加载的而未加载的内核模块,例如: $ ls /lib/modules/6.12.0-55.9.1.el10_0.x86_64/kernel/crypto/ ansi_cprng.ko.xz chacha20poly1305.ko.xz md4.ko.xz serpent_generic.ko.xz anubis.ko.xz cmac.ko.xz…
- 列表:创建一个配置文件作为 denylist : # touch /etc/modprobe.d/denylist.conf
- 命令/配置摘录:
$ lsmod
Module Size Used by tls 131072 0 uinput 20480 1 snd_seq_dummy 16384 0 snd_hrtimer 16384 1 …- 注意:注意 在输入内核模块的名称时,不要将 .ko.xz 扩展附加到名称的末尾。内核模块名称没有扩展名,它们对应的文件有。
- 注意:重要 此流程中描述的更改将在重启后生效并保留。如果您在 denylist 中错误地列出了关键内核模块,您可以将系统切换到不稳定或无法正常工作的状态。
3.11. 编译自定义的内核模块
- 要点:根据硬件和软件级别的各种配置的要求构建示例内核模块。
- 要点:先决条件
- 列表:kernel-devel、gcc 和 elfutils-libelf-devel 软件包已安装。 # dnf install kernel-devel-$(uname -r) gcc elfutils-libelf-devel
- 列表:您有 root 权限。
- 列表:您创建了 /root/testmodule/ 目录,在此编译自定义的内核模块。
- 列表:创建包含以下内容的 /root/testmodule/test.c 文件: #include <linux/module.h> #include <linux/kernel.h> int init_module(void) { printk("Hello World\n This is a test\n"); return 0; } void cleanup_module(void) { printk("Good Bye World"); } MODULE_LICENSE("GPL"); test.c 文件是一个源文件,其向内核模块提供主要功能。出于组织需要,该文件已创建在专用的 /root/testmodule/ 目录中。在…
- 列表:示例代码中的 printk() 函数需要 linux/kernel.h 头文件。
- 列表:linux/module.h 文件包含函数声明和用 C 编程语言编写的在多个源文件之间共享的宏定义。
- 命令/配置摘录:
# dnf install kernel-devel-$(uname -r) gcc elfutils-libelf-devel
#include <linux/module.h> #include <linux/kernel.h> int init_module(void) { printk("Hello World\n This is a test\n"); return 0; } void cleanup_module(void) { printk("Good Bye World"); } MODULE_LICENSE("GPL");第 4 章 配置内核命令行参数
- 要点:使用内核命令行参数更改 Red Hat Enterprise Linux 内核的某些方面的行为。系统管理员可控制在引导时设置哪些选项。请注意,某些内核行为只能在引导时设置。
- 注意:重要 通过修改内核命令行参数来更改系统的行为可能会对您的系统造成负面影响。在生产环境中部署前,始终测试更改。如需进一步指导,请联系红帽支持团队。
4.1. 什么是内核命令行参数
- 要点:使用内核命令行参数,您可以覆盖默认值并设置特定的硬件设置。在引导时,您可以配置 Red Hat Enterprise Linux 内核、初始 RAM 磁盘和用户空间功能。
- 要点:默认情况下,使用 GRUB 引导装载程序的系统的内核命令行参数是在每个内核引导条目的引导条目配置文件中定义。
- 列表:更改默认的引导条目。
- 列表:从 GRUB 菜单条目中添加或删除参数。
4.2. 了解引导条目
- 要点:了解引导条目以管理系统的内核配置。
- 要点:引导条目是存储在配置文件中的选项的集合,并绑定到特定的内核版本。在实践中,您的引导条目至少与您所安装的系统数量相同。引导条目配置文件位于 /boot/loader/entries/ 目录中:
- 命令/配置摘录:
d8712ab6d4f14683c5625e87b52b6b6e-6.12.0.el10_0.x86_64.conf
title Red Hat Enterprise Linux (6.12.0-0.el10_0.x86_64) 10.0 version 6.12.0-0.el10_0.x86_64 linux /vmlinuz-6.12.0-0.el10_0.x86_64 initrd /initramfs-6.12.0-0.el10_0.x86_64.img options root=/dev/mapper/rhel_kvm--02--guest08-root ro crashkernel=2G-64G:256M,64G-:512M resume=/dev/mapper/rhel_kvm--02--guest08-swap rd.lvm.lv=rhel_kvm-02-guest08/root rd.lvm.lv=rhel_kvm-02-guest08/swap console=ttyS0,115200 grub_users $grub_users grub_arg --unrestricted grub_class kernel4.3. 为所有引导条目更改内核命令行参数
- 要点:更改系统上所有引导条目的内核命令行参数。
- 要点:先决条件
- 列表:grubby 工具已安装在您的系统上。
- 列表:zipl 工具已安装在 IBM Z 系统上。
- 列表:添加参数: # grubby --update-kernel=ALL --args="<NEW_PARAMETER>" 对于使用 GRUB 引导装载程序的系统,在使用 zIPL 引导装载程序的 IBM Z 上,该命令会向每个 /boot/loader/entries/<ENTRY>.conf 文件添加新内核参数。 在 IBM Z 上,更新引导菜单: # zipl
- 列表:在 IBM Z 上,更新引导菜单: # zipl
- 列表:删除参数: # grubby --update-kernel=ALL --remove-args="<PARAMETER_TO_REMOVE>" 在 IBM Z 上,更新引导菜单: # zipl 注意 不需要为使用 GRUB 引导装载程序的系统更新引导菜单。
- 列表:在 IBM Z 上,更新引导菜单: # zipl 注意 不需要为使用 GRUB 引导装载程序的系统更新引导菜单。
- 命令/配置摘录:
# grubby --update-kernel=ALL --args="<NEW_PARAMETER>"
# zipl- 注意:重要 当在 Red Hat Enterprise Linux 10 系统中安装较新版本的内核时,grubby 工具会传递来自之前内核版本的内核命令行参数。
- 注意:注意 不需要为使用 GRUB 引导装载程序的系统更新引导菜单。
4.4. 为单一引导条目更改内核命令行参数
- 要点:对系统上单个引导条目的内核命令行参数进行更改。
- 要点:先决条件
- 列表:grubby 和 zipl 工具已安装在您的系统上。
- 列表:添加参数: # grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="<NEW_PARAMETER>" 在 IBM Z 上,更新引导菜单: # grubby --args="<NEW_PARAMETER> --update-kernel=ALL --zipl
- 列表:在 IBM Z 上,更新引导菜单: # grubby --args="<NEW_PARAMETER> --update-kernel=ALL --zipl
- 列表:删除参数: # grubby --update-kernel=/boot/vmlinuz-$(uname -r) --remove-args="<PARAMETER_TO_REMOVE>" 在 IBM Z 上,更新引导菜单: # grubby --args="<NEW_PARAMETER> --update-kernel=ALL --zipl 重要 grubby 修改单个内核引导条目的内核命令行参数并将其存储在 /boot/loader/entries/<ENTRY>.conf 文件中。
- 列表:在 IBM Z 上,更新引导菜单: # grubby --args="<NEW_PARAMETER> --update-kernel=ALL --zipl 重要 grubby 修改单个内核引导条目的内核命令行参数并将其存储在 /boot/loader/entries/<ENTRY>.conf 文件中。
- 命令/配置摘录:
# grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="<NEW_PARAMETER>"
# grubby --args="<NEW_PARAMETER> --update-kernel=ALL --zipl- 注意:重要 grubby 修改单个内核引导条目的内核命令行参数并将其存储在 /boot/loader/entries/<ENTRY>.conf 文件中。
4.5. 在引导时临时更改内核命令行参数
- 要点:通过在单个引导过程中更改内核参数,对内核惨淡条目进行临时更改。这个流程只适用于单个引导,且在系统重启后不持久。
- 要点:流程
- 列表:引导到 GRUB 引导菜单。
- 列表:选择您要启动的内核。
- 列表:按 e 键编辑内核参数。
- 列表:通过移动光标来找到内核命令行。
- 列表:将光标移至行末。
- 列表:根据需要编辑内核参数。例如,要在紧急模式下运行系统,请在 linux 行末尾添加 emergency 参数: linux ($root)/vmlinuz-6.12.0-0.el10_0.x86_64 root=/dev/mapper/rhel-root ro crashkernel=2G-64G:256M,64G-:512M resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet emergency 要启用系统消息,请删除 rhgb 和 quiet 参数。
- 命令/配置摘录:
linux ($root)/vmlinuz-6.12.0-0.el10_0.x86_64 root=/dev/mapper/rhel-root ro crashkernel=2G-64G:256M,64G-:512M resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet emergency- 注意:重要 如果按 Esc 键离开命令行编辑,它将丢弃用户做的所有更改。
4.6. 配置 GRUB 设置以启用串行控制台连接
- 要点:要在网络关闭时连接到无头服务器或嵌入式系统,您可以将 GRUB 2 配置为启用串行控制台连接。这也提供了对不同系统的登录访问,以避免安全规则。
- 要点:您需要配置一些默认的 GRUB 设置,以使用串行控制台连接。
- 列表:您在系统上具有 root 权限。
- 列表:将下面两行添加到 /etc/default/grub 文件中: GRUB_TERMINAL="serial" GRUB_SERIAL_COMMAND="serial --speed=9600 --unit=0 --word=8 --parity=no --stop=1" 第一行将 GRUB 配置为使用串行命令行而不是图形界面。GRUB_TERMINAL 键覆盖 GRUB_TERMINAL_INPUT 和 GRUB_TERMINAL_OUTPUT 键的值。 第二行调整了波特率(--speed),奇偶校验和其他值以适合您的环境和硬件。请注意,对于以下日志文件等任务,最好使用更高的波特率,如 115200。
- 列表:更新 GRUB 配置文件: # grub2-mkconfig -o /boot/grub2/grub.cfg 这适用于基于 BIOS 和 UEFI 的机器。
- 列表:重启系统以使更改生效。
- 命令/配置摘录:
GRUB_TERMINAL="serial" GRUB_SERIAL_COMMAND="serial --speed=9600 --unit=0 --word=8 --parity=no --stop=1"
# grub2-mkconfig -o /boot/grub2/grub.cfg4.7. 使用 GRUB 配置文件更改引导条目
- 要点:要更改 Linux 内核的引导条目,您可以修改 /etc/default/grub 配置文件。此文件包含 GRUB_CMDLINE_LINUX 键,它列出了内核命令行参数。
- 要点:/etc/default/grub 中的 GRUB_CMDLINE_LINUX 键列出了内核命令行参数:
- 列表:全新的 Red Hat Enterprise Linux 10 安装。
- 列表:使用 grubby 在安装后脚本中为各个内核添加或删除内核参数: # grubby --update-kernel <PATH_TO_KERNEL> --args "<NEW_ARGUMENTS>" 例如,在所选内核中添加 noapic 参数: # grubby --update-kernel /boot/vmlinuz-6.12.0-0.el10_0.x86_64 --args "noapic" 参数传播到 BLS 代码片段,但不传播到 /etc/default/grub 文件中。
- 列表:使用 /etc/default/grub 文件中 GRUB_CMDLINE_LINUX 值的内容覆盖 BLS 片断: # grub2-mkconfig -o /boot/grub2/grub.cfg --update-bls-cmdline Generating grub configuration file ... Adding boot menu entry for UEFI Firmware Settings ... done 注意 在运行 grub2-mkconfig 时,对 /etc/default/grub 中密钥的其他更改(如 GRUB_TIMEOUT )会被传播到新的 grub.cfg 文件中。
- 列表:重启您的系统。
- 列表:验证参数是否包含在 /proc/cmdline 文件中。 例如,如果您添加了 noapic 参数,/proc/cmdline 文件包含以下内容: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-6.12.0-0.el10_0.x86_64 root=/dev/mapper/RHELCSB-Root ro vconsole.keymap=us crashkernel=2G-64G:256M,64G-:512M rd.lvm.lv=RHELCSB/Root rd.luks.uuid=luks-d8a28c4c-96aa-4319-be26-96896272151d rhgb quiet noapic rd.luks.key…
- 列表:为所有引导条目更改内核命令行参数
- 命令/配置摘录:
GRUB_CMDLINE_LINUX="crashkernel=2G-64G:256M,64G-:512M resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap"
# grubby --update-kernel <PATH_TO_KERNEL> --args "<NEW_ARGUMENTS>"- 注意:注意 在运行 grub2-mkconfig 时,对 /etc/default/grub 中密钥的其他更改(如 GRUB_TIMEOUT )会被传播到新的 grub.cfg 文件中。
第 5 章 在运行时配置内核参数
- 要点:使用 sysctl 命令以及修改 /etc/sysctl.d/ 和 /proc/sys/ 目录中的配置文件,在运行时修改 Red Hat Enterprise Linux 内核的行为。
- 注意:重要 在产品系统中配置内核参数需要仔细规划。非计划的更改可能导致内核不稳定,需要重启系统。在更改任何内核值之前,验证您是否正在使用有效选项。
5.1. 什么是内核参数
- 要点:内核参数是可调整的值,您可以在系统运行时调整。请注意,要使更改生效,您不需要重启系统或重新编译内核。
- 要点:内核参数和内核命令行参数之间的区别是 ;内核参数可以使用所有选项配置 Linux 内核,而内核命令行参数是在引导时传递给内核的特定参数,允许运行时配置,而无需内核重新编译。
- 列表:sysctl 命令
- 列表:挂载于 /proc/sys/ 目录的虚拟文件系统
- 列表:/etc/sysctl.d/ 目录中的配置文件
- 列表:为 IBM DB2 调整 Red Hat Enterprise Linux
- 表格样本(共 11 行):
- 可调整类 | 子系统
- abi | 执行域和个人
- crypto | 加密接口
- debug | 内核调试接口
5.2. 使用 sysctl 临时配置内核参数
- 要点:您可以使用 sysctl 命令在运行时临时设置内核参数。命令也可用于列出和过滤可调项。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:列出所有参数及其值。 # sysctl -a 注意 sysctl -a 命令显示内核参数,这些参数可在运行时和引导时调整。
- 列表:要临时配置一个参数,请输入: # sysctl <TUNABLE_CLASS>.<PARAMETER>=<TARGET_VALUE> 这个示例在系统运行时更改参数值。更改会立即生效,不需要系统重启。 注意 在系统重启后,所在的改变会返回到默认状态。
- 列表:使用 /etc/sysctl.d/ 中的配置文件调整内核参数
- 命令/配置摘录:
# sysctl -a
# sysctl <TUNABLE_CLASS>.<PARAMETER>=<TARGET_VALUE>- 注意:注意 sysctl -a 命令显示内核参数,这些参数可在运行时和引导时调整。
- 注意:注意 在系统重启后,所在的改变会返回到默认状态。
5.3. 使用 sysctl 永久配置内核参数
- 要点:您可以使用 sysctl 命令永久设置内核参数。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:列出所有参数: # sysctl -a 该命令显示所有可在运行时配置的内核参数。
- 列表:永久配置一个参数: # sysctl -w <TUNABLE_CLASS>.<PARAMETER>=<TARGET_VALUE> >> /etc/sysctl.conf 示例命令会更改可调值,并将其写入 /etc/sysctl.conf 文件,该文件会覆盖内核参数的默认值。更改会立即并永久生效,无需重启。 注意 要永久修改内核参数,您还可以手动更改 /etc/sysctl.d/ 目录中的配置文件。
- 列表:使用 /etc/sysctl.d/ 中的配置文件调整内核参数
- 命令/配置摘录:
# sysctl -a
# sysctl -w <TUNABLE_CLASS>.<PARAMETER>=<TARGET_VALUE> >> /etc/sysctl.conf- 注意:注意 要永久修改内核参数,您还可以手动更改 /etc/sysctl.d/ 目录中的配置文件。
5.4. 使用 /etc/sysctl.d/ 中的配置文件调整内核参数
- 要点:要永久设置内核参数,请手动修改 /etc/sysctl.d/ 目录中的配置文件。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:在 /etc/sysctl.d/ 中创建新配置文件: # vim /etc/sysctl.d/<some_file.conf>
- 列表:包括内核参数,一行一个: <TUNABLE_CLASS>.<PARAMETER>=<TARGET_VALUE> <TUNABLE_CLASS>.<PARAMETER>=<TARGET_VALUE>
- 列表:保存配置文件。
- 列表:重启机器以使更改生效。 或者,在不重启的情况下应用更改: # sysctl -p /etc/sysctl.d/<some_file.conf> 使用此命令,您可以从之前创建的配置文件中读取值。 如需更多信息,请参阅系统中的 sysctl (8) 和 sysctl.d (5) man page。
- 列表:或者,在不重启的情况下应用更改: # sysctl -p /etc/sysctl.d/<some_file.conf> 使用此命令,您可以从之前创建的配置文件中读取值。 如需更多信息,请参阅系统中的 sysctl (8) 和 sysctl.d (5) man page。
- 命令/配置摘录:
# vim /etc/sysctl.d/<some_file.conf>
<TUNABLE_CLASS>.<PARAMETER>=<TARGET_VALUE> <TUNABLE_CLASS>.<PARAMETER>=<TARGET_VALUE>5.5. 通过 /proc/sys/ 临时配置内核参数
- 要点:要临时设置内核参数,请修改 /proc/sys/ 虚拟文件系统目录中的文件。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:识别您要配置的内核参数: # ls -l /proc/sys/<TUNABLE_CLASS>/ 命令返回的可写入文件可以用来配置内核。具有只读权限的文件提供了对当前设置的反馈。
- 列表:为 kernel 参数分配目标值: # echo <TARGET_VALUE> > /proc/sys/<TUNABLE_CLASS>/<PARAMETER> 使用命令应用的配置更改不是永久的,系统重启后会消失。
- 列表:验证新设置的内核参数的值: # cat /proc/sys/<TUNABLE_CLASS>/<PARAMETER>
- 命令/配置摘录:
# ls -l /proc/sys/<TUNABLE_CLASS>/
# echo <TARGET_VALUE> > /proc/sys/<TUNABLE_CLASS>/<PARAMETER>第 6 章 使用 RHEL 系统角色永久配置内核参数
- 要点:您可以使用 kernel_settings RHEL 系统角色一次在多个客户端上配置内核参数。
- 要点:同时配置有以下优点:
- 列表:提供带有有效输入设置的友好接口。
- 列表:保留所有预期的内核参数。
- 注意:重要 请注意,通过 RHEL 频道提供的 RHEL 系统角色可在默认 AppStream 软件仓库中作为 RPM 软件包提供给 RHEL 客户。RHEL 系统角色还可以通过 Ansible Automation Hub 为客户提供 Ansible 订阅的集合。
6.1. 使用 kernel_settings RHEL 系统角色应用所选的内核参数
- 要点:您可以使用 kernel_settings RHEL 系统角色在多个受管操作系统上远程配置各种内核参数,并具有持久效果。
- 要点:例如,通过使用 kernel_settings 角色,您可以配置:
- 列表:透明巨页,通过减少管理较小页的开销来提高性能。
- 列表:通过具有回环接口的网络传输的最大数据包大小。
- 列表:对文件的限制,可以同时打开。
- 列表:您已准备好控制节点和受管节点。
- 列表:以可在受管主机上运行 playbook 的用户登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 命令/配置摘录:
--- - name: Configuring kernel settings hosts: managed-node-01.example.com tasks: - name: Configure hugepages, packet size for loopback device, and limits on simultaneously open files. ansible.builtin.include_role: name: redhat.rhel_system_roles.kernel_settings vars: kernel_settings_sysctl: - name: fs.file-max value: 400000 - name: kernel.threads-max value: 65536 kernel_settings_sysfs: - name: /sys/class/net/lo/mtu value: 65000 kernel_settings_transparent_hugepages: madvise kernel_settings_reboot_ok: true
$ ansible-playbook --syntax-check ~/playbook.yml第 7 章 使用 UKI 管理内核命令行参数
- 要点:统一内核镜像(UKI)将内核、初始 RAM 磁盘(initrd)和引导命令行合并到一个可执行二进制文件中。
7.1. 了解带有 UKI 的内核命令行参数
- 要点:使用统一内核映像(UKI),systemd-boot,特别是 systemd-stub,负责处理内核命令行参数。红帽提供的 UKI 包括基本的内核命令行参数 console=tty0 console=ttyS0。
- 要点:您可以使用 UKI 附加组件添加额外的内核命令行参数。或者,您可以生成自己的 UKI 使其包含您需要的任何参数。
- 注意:重要 安全引导撤销不正确的签名英国和附加组件。这些签名也可以更改受信任的平台模块(TPM)中的平台配置寄存器(PCR)测量,这可能会影响引导序列。
7.2. 了解引导条目
- 要点:您直接在 UEFI NVRAM 中管理引导条目。这意味着它们不再存储在磁盘上。您可以使用 kernel-bootcfg 或 efibootmgr 等工具直接更改引导条目。
- 要点:以下是引导条目的示例:
- 命令/配置摘录:
Boot0001* redhat HD(1,GPT,9192a707-8768-4c9f-bb11-fdd7c7e307e7,0x800,0x100000)/\EFI\redhat\shimx64.efi\EFI\Linux\ffffffffffffffffffffffffffffffff-6.12.0-174.el10.x86_64.efi7.3. 获取 UKI 附加组件以添加内核命令行参数
- 要点:在来自红帽的 kernel-uki-virt-addons 软件包中正式签署了英国I 附加组件,提供内核命令行参数。红帽为这些附加组件提供与其相关的英国证书相同的证书。默认安装路径为 /lib/modules/$(uname -r)/vmlinuz-virt.efi.extra.d/。
- 要点:如果您需要软件包的签名附加组件以外的附加组件,或者您希望自己签署附加组件,请使用 systemd-ukify 或 dracut 等工具创建它们。
- 列表:了解带有 UKI 的内核命令行参数
- 列表:为所有引导条目更改内核命令行参数
- 列表:为单个 UKI 更改内核命令行参数
- 列表:创建 UKI 以包含自定义内核命令行参数
- 注意:注意 附加组件仅在将目标 UKI 或所有引导条目复制到正确的位置后生效。
7.4. 为所有引导条目更改内核命令行参数
- 要点:要更改所有引导条目的内核命令行参数,请将 UKI 附加组件添加到全局附加组件目录 /boot/efi/loader/addons/。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:您有 .addon.efi 文件。
- 列表:将附加组件文件复制到 /boot/efi/loader/addons/ 目录中: # cp <my-addon>.addon.efi /boot/efi/loader/addons/
- 列表:重启系统: # reboot
- 列表:验证新参数取决于添加的附加组件的类型。例如,检查内核命令行: # cat /proc/cmdline
- 命令/配置摘录:
# cp <my-addon>.addon.efi /boot/efi/loader/addons/
# reboot7.5. 为单个 UKI 更改内核命令行参数
- 要点:要更改单个英国I 的内核命令行参数,请基于每个UKI 管理附加组件。吊销机制适用于 UKI 及其相关附加组件。
- 要点:默认情况下,BishI 位于以下路径中:
- 列表:您在系统上具有 root 权限。
- 列表:您有一个 .addon.efi 附加组件文件。
- 列表:确定正在运行的内核版本和机器 ID: # uname -r # cat /etc/machine-id
- 列表:将附加组件文件复制到与 UKI 关联的特定目录中: # cp <my-addon>.addon.efi /boot/efi/EFI/Linux/<machine_id>-<kernel_version>.efi.extra.d/
- 列表:重启系统: # reboot
- 列表:验证新参数取决于添加的附加组件的类型。例如,检查内核命令行: # cat /proc/cmdline
- 命令/配置摘录:
# uname -r # cat /etc/machine-id
# cp <my-addon>.addon.efi /boot/efi/EFI/Linux/<machine_id>-<kernel_version>.efi.extra.d/- 注意:注意 当您更新 kernel-uki-virt 软件包时,系统会安装一个新的 UKI 版本。此更新还会将当前有效的附加组件复制到新 UKI 的目录中,只要同时安装了 kernel-uki-virt-addons 软件包。例如,在运行 dnf update 时会自动发生这种情况。
7.6. 创建 UKI 以包含自定义内核命令行参数
- 要点:要自定义 Linux 内核、初始 RAM 磁盘或 initrd 以及内核命令行参数,您可以使用 systemd-ukify 或 dracut 等工具创建自己的 UKI。
- 要点:步骤
- 列表:例如,要使用 systemd-ukify 创建自定义 UKI: # ukify build --initrd /boot/initramfs-$(uname -r).img --linux /lib/modules/$(uname -r)/vmlinuz --uname $(uname -r) --cmdline "console=tty0 console=ttyS0 emergency" --output uki.unsigned.efi
- 命令/配置摘录:
# ukify build --initrd /boot/initramfs-$(uname -r).img --linux /lib/modules/$(uname -r)/vmlinuz --uname $(uname -r) --cmdline "console=tty0 console=ttyS0 emergency" --output uki.unsigned.efi第 8 章 使用 RHEL 系统角色配置 GRUB 2 引导装载程序
- 要点:通过使用 bootloader RHEL 系统角色,您可以自动化与 GRUB2 引导装载程序相关的配置和管理任务。
- 要点:此角色目前支持配置在以下 CPU 构架上运行的 GRUB2 引导装载程序:
- 列表:AMD 和 Intel 64 位构架(x86-64)
- 列表:64 位 ARM 架构(ARMv8.0)
- 列表:IBM Power Systems, Little Endian(POWER9)
8.1. 使用 bootloader RHEL 系统角色更新现有的引导装载程序条目
- 要点:您可以使用 bootloader RHEL 系统角色,以自动的方式更新 GRUB2 引导菜单中的现有条目。这样,您可以有效地传递可以优化系统性能或行为的特定的内核命令行参数。
- 要点:例如,如果您使用不需要来自内核和 init 系统的详细引导消息的系统,请使用 bootloader 将 quiet 参数应用到受管节点上的现有引导装载程序条目中,以实现更干净、更整洁、更用户友好的引导体验。
- 列表:您已准备好控制节点和受管节点。
- 列表:以可在受管主机上运行 playbook 的用户登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:您确定了与您要更新的引导装载程序条目对应的内核。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Configuration and management of GRUB2 boot loader hosts: managed-node-01.example.com tasks: - name: Update existing boot loader entries ansible.builtin.include_role: name: redhat.rhel_system_roles.bootloader vars: bootloader_settings: - kernel: path: /boo…
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不会防止错误但有效的配置。
- 命令/配置摘录:
--- - name: Configuration and management of GRUB2 boot loader hosts: managed-node-01.example.com tasks: - name: Update existing boot loader entries ansible.builtin.include_role: name: redhat.rhel_system_roles.bootloader vars: bootloader_settings: - kernel: path: /boot/vmlinuz-6.12.0-0.el10_0.aarch64 options: - name: quiet state: present bootloader_reboot_ok: true
$ ansible-playbook --syntax-check ~/playbook.yml8.2. 使用 bootloader RHEL 系统角色,使用密码保护引导菜单
- 要点:您可以使用 bootloader RHEL 系统角色,以自动的方式为 GRUB2 引导菜单设置密码。这样,您可以有效地防止未经授权的用户修改引导参数,并更好地控制系统引导。
- 要点:先决条件
- 列表:您已准备好控制节点和受管节点。
- 列表:以可在受管主机上运行 playbook 的用户登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:将您的敏感变量存储在一个加密文件中: 创建 vault : $ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password> 在 ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据: pwd: <password> 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
- 列表:创建 vault : $ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
- 列表:在 ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据: pwd: <password>
- 命令/配置摘录:
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
pwd: <password>- 注意:重要 更改引导装载程序密码不是幂等事务。这意味着,如果您再次应用相同的 Ansible playbook,则结果不相同,并且受管节点的状态发生了变化。
8.3. 使用 bootloader RHEL 系统角色为引导装载程序菜单设置超时
- 要点:您可以使用 bootloader RHEL 系统角色,以自动的方式为 GRUB2 引导装载程序菜单配置超时。这样,您可以有效地更新一段时间,在此期间,您可以出于不同目的进行干预并选择一个非默认引导条目。
- 要点:先决条件
- 列表:您已准备好控制节点和受管节点。
- 列表:以可在受管主机上运行 playbook 的用户登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Configuration and management of GRUB2 boot loader hosts: managed-node-01.example.com tasks: - name: Update the boot loader timeout ansible.builtin.include_role: name: redhat.rhel_system_roles.bootloader vars: bootloader_timeout: 10 示例 playbook 中指定的设置包括以下内容:…
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不会防止错误但有效的配置。
- 列表:运行 playbook: $ ansible-playbook ~/playbook.yml
- 命令/配置摘录:
--- - name: Configuration and management of GRUB2 boot loader hosts: managed-node-01.example.com tasks: - name: Update the boot loader timeout ansible.builtin.include_role: name: redhat.rhel_system_roles.bootloader vars: bootloader_timeout: 10
$ ansible-playbook --syntax-check ~/playbook.yml8.4. 使用 bootloader RHEL 系统角色收集引导装载程序配置信息
- 要点:您可以使用 bootloader RHEL 系统角色,以自动的方式收集有关 GRUB2 引导装载程序条目的信息。这样,您可以快速确定您的系统是否被设置为正确引导,所有条目是否都指向正确的内核和初始 RAM 磁盘镜像。
- 要点:因此,您可以,例如:
- 列表:防止引导失败。
- 列表:在故障排除时恢复到已知的良好状态。
- 列表:确保与安全相关的内核命令行参数被正确配置。
- 列表:您已准备好控制节点和受管节点。
- 列表:以可在受管主机上运行 playbook 的用户登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 命令/配置摘录:
--- - name: Configuration and management of GRUB2 boot loader hosts: managed-node-01.example.com tasks: - name: Gather information about the boot loader configuration ansible.builtin.include_role: name: redhat.rhel_system_roles.bootloader vars: bootloader_gather_facts: true - name: Display the collected boot loader configuration information debug: var: bootloader_facts
$ ansible-playbook --syntax-check ~/playbook.yml第 9 章 使用内核实时修补程序应用补丁
- 要点:Red Hat Enterprise Linux 内核实时补丁解决方案在不重启或重启进程的情况下对运行的内核进行补丁。系统管理员可以立即应用关键安全补丁,维护系统正常运行时间,减少重新启动。实时补丁不会解决所有关键或重要的 CVE。
- 注意:重要 RHEL 10 kpatch 支持从 RHEL 10.2 开始。第一个支持 kpatch 的内核是 kernel-6.12.0-211.16.1.el10_2。旧的内核版本和旧的次版本不符合 kpatch 资格。
- 注意:警告 内核实时补丁和其它内核子组件之间存在一些不兼容。下一小节 是 kpatch 的限制,记录了这些不兼容的问题。在使用内核实时补丁前读取它。
9.1. kpatch 的限制
- 要点:带有 kpatch 的内核实时补丁在系统运行时应用定义的安全性和程序错误修复,但您必须遵循其他工具阻止补丁的规则。以下列表涵盖了在实时补丁处于活跃状态时 SystemTap 和 kprobe 的 kpatch 范围和限制。
- 列表:预期范围 : kpatch 功能可以应用简单的安全性和 bug 修复更新,这些更新不需要立即重启系统。
- 列表:SystemTap 和 kprobe :在载入补丁期间或之后不得使用 SystemTap 或 kprobe 工具。在探测被删除后,补丁可能才会生效。
9.2. 对第三方实时补丁的支持
- 要点:kpatch 实用程序是红帽通过红帽软件仓库提供的 RPM 模块支持的唯一内核实时补丁程序。红帽不支持第三方提供的实时补丁。
- 要点:其他资源
- 列表:作为客户,当我使用第三方组件时,红帽如何支持我?
9.3. 获得内核实时补丁
- 要点:红帽在 RPM 软件包中以内核模块(kmod)形式提供内核实时补丁。标准订阅可通过常规频道提供对实时补丁的访问。如果没有扩展支持,当下一个次发行版本可用时,当前次版本的新补丁会停止。
- 要点:例如,对于标准订阅,您可以在红帽发布 RHEL 10.3 内核前对 RHEL 10.2 内核进行补丁。在这个发行版本中,红帽不再为 RHEL 10.2 提供实时补丁。
- 列表:内核实时补丁的交付机制。
- 列表:为内核构建的一个内核模块打修补。
- 列表:补丁模块包含内核所需修复的代码。
- 列表:补丁模块注册到 livepatch 内核子系统,并指定要替换的原始功能,以及指向替换功能的指针。内核补丁模块以 RPM 的形式提供。
- 列表:命名规则为 kpatch_<kernel version><kpatch version><kpatch release>。名称中"kernel version"部分的点被下划线替代。
- 列表:内核实时补丁支持节奏更新
9.4. 实时对内核打补丁的过程
- 要点:kpatch 内核打补丁解决方案使用 livepatch 内核子系统将过时的功能重定向到更新的功能。
- 要点:将实时内核补丁应用到系统会触发以下进程:
- 列表:内核补丁模块复制到 /var/lib/kpatch/ 目录中,并在下次引导时由 systemd 注册到内核中。
- 列表:kpatch 模块加载到运行的内核中,新的功能使用指向新代码在内存中的位置的指针被注册到 ftrace 机制中。
9.5. 在 web 控制台中使用内核实时补丁应用补丁
- 要点:您可以在 RHEL web 控制台中配置 kpatch 框架,该框架在不强制系统重启的情况下应用内核安全补丁。
- 要点:先决条件
- 列表:您已安装了 RHEL 10 web 控制台。 具体说明请参阅安装并启用 Web 控制台。
- 列表:登录到 RHEL 10 web 控制台。
- 列表:点软件更新。
- 列表:检查内核补丁设置的状态。 如果没有安装补丁,点 Install。 要启用内核补丁,请点击 启用。 选中应用内核补丁的复选框。 选择您是否想只为当前和将来的内核或当前内核应用补丁。如果您决定订阅,以为将来的内核应用补丁,系统也会为即将发布的内核版本应用补丁。 点应用。
- 列表:如果没有安装补丁,点 Install。
- 列表:要启用内核补丁,请点击 启用。
9.6. 将当前安装的内核订阅到实时补丁流
- 要点:要将安装的内核订阅到实时补丁流,请安装特定的内核补丁模块 RPM。这些软件包会累积更新。
- 要点:以下流程解释了如何订阅以后为给定内核的所有累积实时补丁更新。因为实时补丁是累计的,所以您无法选择为一个特定的内核部署哪些单独的补丁。
- 列表:您在系统上具有 root 权限。
- 列表:可选:检查您的内核版本: # uname -r 6.12.0-211.16.1.el10_2.x86_64
- 列表:搜索与内核版本对应的实时补丁软件包: # dnf search $(uname -r)
- 列表:安装实时补丁(live patching)软件包: # dnf install kpatch 这个命令只为特定的内核安装并应用最新累积的实时补丁。 如果实时补丁软件包的版本是 1-1 或更高版本,则软件包将包含补丁模块。在这种情况下,内核会在安装 live patching 软件包期间自动修补。 内核补丁模块也安装到 /var/lib/kpatch/ 目录中,供 systemd 系统和服务管理器以后重启时载入。 注意 当给定内核没有可用的实时补丁时,将安装空的实时补丁软件包。空的 live patching 软件包会有一个 0-0 的 kpatch_version-kpatch_release,如 kpatch-patch-6_1…
- 列表:验证是否所有安装的内核都已打了补丁: # kpatch list Loaded patch modules: kpatch_6_12_0_211_16_1_0_1 [enabled] Installed patch modules: kpatch_6_12_0_211_16_1_0_1 (6.12.0-211.16.1.el10_2.x86_64) ... 输出显示内核补丁模块已加载到内核中,现在使用 kpatch-patch-6_12_0_211_16_1-0-1.el10_2.x86_64.rpm 软件包的最新修复进行补丁。 如需更多信息,请参阅系统中的 kpatch (1) 手册页。 注意 输入 kpatch list 命令…
- 命令/配置摘录:
# uname -r
6.12.0-211.16.1.el10_2.x86_64- 注意:警告 红帽不支持任何适用于红帽支持的系统的第三方实时补丁。
- 注意:注意 当给定内核没有可用的实时补丁时,将安装空的实时补丁软件包。空的 live patching 软件包会有一个 0-0 的 kpatch_version-kpatch_release,如 kpatch-patch-6_12_0_211_16_1-0-0.el10_2.x86_64.rpm。空 RPM 安装会将系统订阅到以后为给定内核提供的所有实时补丁。
9.7. 自动订阅将来的内核到实时补丁流
- 要点:要订阅内核补丁模块提供的修复,也称为内核实时补丁,请使用 kpatch-dnf DNF 插件。该插件为系统当前使用的任何内核激活 自动订阅 ,以及将来安装内核。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:可选:检查所有安装的内核和您当前运行的内核: # dnf list installed | grep kernel Updating Subscription Management repositories. Installed Packages ... kernel-core.x86_64 6.12.0-211.16.1.el10_2 @beaker-BaseOS kernel-core.x86_64 6.12.0-211.16.1.el10_2 @@commandline ... # uname -r 6.12.0-211.16.1.el10_2.x86_64
- 列表:安装 kpatch-dnf 插件: # dnf install kpatch-dnf
- 列表:启用自动订阅内核实时补丁: # dnf kpatch auto Updating Subscription Management repositories. Last metadata expiration check: 1:38:21 ago on Fri 17 Sep 2021 07:29:53 AM EDT. Dependencies resolved. ================================================== Package Architecture ================================================== Installing: …
- 列表:验证是否所有安装的内核都已打了补丁: # kpatch list Loaded patch modules: kpatch_6_12_0_211_16_1_0_1 [enabled] Installed patch modules: kpatch_6_12_0_211_16_1_0_1 (6.12.0-211.16.1.el10_2.x86_64) 输出显示,您正在运行的内核已使用 kpatch-patch-6_12_0_211_16_1-0-1.el10_2.x86_64.rpm 软件包中的修复进行了修补。 注意 输入 kpatch list 命令不会返回一个空的实时补丁软件包。使用 rpm -qa | grep kpatch …
- 命令/配置摘录:
# dnf list installed | grep kernel
Updating Subscription Management repositories. Installed Packages ... kernel-core.x86_64 6.12.0-211.16.1.el10_2 @beaker-BaseOS kernel-core.x86_64 6.12.0-211.16.1.el10_2 @@commandline ...- 注意:注意 当给定内核没有可用的实时补丁时,将安装空的实时补丁软件包。空的 live patching 软件包会有一个 0-0 的 kpatch_version-kpatch_release,如 kpatch-patch-6_12_0_211_16_1-0-0.el10_2.x86_64.rpm。 空 RPM 安装会将系统订阅到以后为给定内核提供的所有实时补丁。
- 注意:注意 输入 kpatch list 命令不会返回一个空的实时补丁软件包。使用 rpm -qa | grep kpatch 命令替代。 # rpm -qa | grep kpatch + kpatch-dnf-0.9.7_0.4-4.el10.noarch kpatch-0.9.7-4.el10.noarch kpatch-patch-6_12_0_211_16_1-0-1.el10_2.x86_64
9.8. 禁用实时补丁流的自动订阅
- 要点:要禁用 kpatch-patch 软件包的自动安装,您可以在订阅内核补丁模块修复后关闭自动订阅功能。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:可选:检查所有安装的内核和您当前运行的内核: # dnf list installed | grep kernel Updating Subscription Management repositories. Installed Packages ... kernel-core.x86_64 6.12.0-0.el10 @beaker-BaseOS kernel-core.x86_64 6.12.0-0.el10 @@commandline ... # uname -r 6.12.0-0.el10_0.x86_64
- 列表:禁用向内核实时补丁的自动订阅: # dnf kpatch manual Updating Subscription Management repositories. 如需更多信息,请参阅 kpatch (1) 和 dnf-kpatch (8) 手册页。
- 列表:您可以检查成功的结果: # yum kpatch status ... Updating Subscription Management repositories. Last metadata expiration check: 0:30:41 ago on Tue Jun 14 15:59:26 2022. Kpatch update setting: manual
- 命令/配置摘录:
# dnf list installed | grep kernel
Updating Subscription Management repositories. Installed Packages ... kernel-core.x86_64 6.12.0-0.el10 @beaker-BaseOS kernel-core.x86_64 6.12.0-0.el10 @@commandline ...9.9. 更新内核补丁模块
- 要点:要更新内核补丁模块,请使用标准 RPM 更新过程。红帽以累积 RPM 软件包的形式提供这些模块。
- 要点:先决条件
- 列表:系统已订阅实时补丁流,如将当前安装的内核订阅到实时补丁流中所述。
- 列表:更新至当前内核的新累计版本: # dnf update kpatch 这个命令会自动安装并应用当前运行的内核可用的更新。包括将来发布的所有实时补丁。
- 列表:另外,更新所有安装的内核补丁模块: # dnf update kpatch 注意 当系统重启到同一内核时,kpatch.service systemd 服务会再次对内核进行补丁。
- 列表:更新软件包
- 命令/配置摘录:
# dnf update kpatch
# dnf update kpatch- 注意:注意 当系统重启到同一内核时,kpatch.service systemd 服务会再次对内核进行补丁。
9.10. 删除 live patching 软件包
- 要点:要禁用内核实时补丁解决方案,请删除实时补丁软件包。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:已安装 live patching 软件包。
- 列表:选择 live patching 软件包: # dnf list installed | grep kpatch-patch kpatch-patch-6.12.0-0.el10_0.x86_64 0-0.el10 @@commandline ... 示例输出列出了您安装的实时补丁软件包。
- 列表:删除 live patching 软件包: # dnf remove kpatch-patch-6.12.0-0.el10_0.x86_64 删除实时补丁软件包后,内核将保持补丁,直到下次重启为止,但内核补丁模块会从磁盘中删除。将来重启时,对应的内核将不再被修补。
- 列表:重启您的系统。
- 列表:验证实时打补丁软件包是否已删除: # dnf list installed | grep kpatch-patch 如果软件包已被成功删除,命令不会显示任何输出。
- 命令/配置摘录:
# dnf list installed | grep kpatch-patch
kpatch-patch-6.12.0-0.el10_0.x86_64 0-0.el10 @@commandline ...- 注意:重要 目前,红帽不支持在不重启系统的情况下还原实时补丁。如有任何问题,请联系我们的支持团队。
9.11. 卸载内核补丁模块
- 要点:要防止内核实时补丁解决方案在以后的引导中应用内核补丁模块,请卸载它。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:已安装实时补丁软件包。
- 列表:已安装并载入内核补丁模块。
- 列表:选择内核补丁模块: # kpatch list Loaded patch modules: kpatch_6_12_0_1_0_1 [enabled] Installed patch modules: kpatch_6_12_0_1_0_1 (6.12.0.el10_0.x86_64) ...
- 列表:卸载所选的内核补丁模块。 # kpatch uninstall kpatch_6_12_0_1_0_1 uninstalling kpatch_6_12_0_1_0_1 (6.12.0.el10_0.x86_64) 请注意,卸载的内核补丁模块仍然被加载: # kpatch list Loaded patch modules: kpatch_6_12_0_1_0_1 [enabled] Installed patch modules: kpatch_6_12_0_1_0_1 (6.12.0.el10_0.x86_64) 卸载所选模块后,内核将保持补丁,直到下次重启为止,但已从磁盘中删除内核补丁模块。
- 列表:请注意,卸载的内核补丁模块仍然被加载: # kpatch list Loaded patch modules: kpatch_6_12_0_1_0_1 [enabled] Installed patch modules: kpatch_6_12_0_1_0_1 (6.12.0.el10_0.x86_64) 卸载所选模块后,内核将保持补丁,直到下次重启为止,但已从磁盘中删除内核补丁模块。
- 命令/配置摘录:
# kpatch list
Loaded patch modules: kpatch_6_12_0_1_0_1 [enabled] Installed patch modules: kpatch_6_12_0_1_0_1 (6.12.0.el10_0.x86_64) ...9.12. 禁用 kpatch.service
- 要点:要防止内核实时补丁解决方案在以后的引导中全局应用所有内核补丁模块,请禁用 kpatch 服务。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:已安装实时补丁软件包。
- 列表:已安装并载入内核补丁模块。
- 列表:验证 kpatch.service 是否已启用。 # systemctl is-enabled kpatch.service enabled
- 列表:禁用 kpatch.service : # systemctl disable kpatch.service Removed /etc/systemd/system/multi-user.target.wants/kpatch.service. 请注意,应用的内核补丁模块仍然被载入: # kpatch list Loaded patch modules: kpatch_6_12_0_1_0_1 [enabled] Installed patch modules: kpatch_6_12_0_1_0_1 (6.12.0.el10_0.x86_64)
- 列表:请注意,应用的内核补丁模块仍然被载入: # kpatch list Loaded patch modules: kpatch_6_12_0_1_0_1 [enabled] Installed patch modules: kpatch_6_12_0_1_0_1 (6.12.0.el10_0.x86_64)
- 命令/配置摘录:
# systemctl is-enabled kpatch.service
enabled- 注意:重要 目前,红帽不支持在不重启系统的情况下将实时补丁恢复原样。如有任何问题,请联系我们的支持团队。
第 10 章 在虚拟环境中保留内核 panic 参数
- 要点:在 Red Hat Enterprise Linux 10 中配置虚拟机时,不要启用 softlockup_panic 和 nmi_watchdog 内核参数。这些参数可能会导致错误的软锁定导致内核 panic。
- 要点:本建议背后的原因如下。
10.1. 什么是软锁定
- 要点:软锁定通常表示一个错误。受影响的任务在一个 CPU 上的内核空间中运行,而不重新调度。该任务也不允许任何其他任务在该特定 CPU 上运行。
- 要点:因此,用户通过系统控制台会显示警告信息。这个问题也被称为软锁定触发。
- 列表:什么是 CPU 软锁定?
10.2. 控制内核 panic 的参数
- 要点:通过配置某些内核参数,在软锁定过程中控制系统行为。您可以启用检测机制,调整阈值,并确定内核 panics 是否管理系统稳定性。
- 要点:控制当检测到软锁定时内核 panics。
- 列表:软锁定检测器和硬锁定检测器
- 列表:内核 sysctl
- 表格样本(共 3 行):
- 类型 | 值 | 效果
- 整数 | 0 | 内核在软锁定时不 panic
- 整数 | 1 | 软锁定中的内核 panics
10.3. 在虚拟环境中有伪装的软锁定
- 要点:在物理主机上的软锁定触发通常代表内核或硬件错误。在虚拟环境中的客户机操作系统上发生的同样的现象可能代表假的警告。
- 要点:主机上的重工作负载或对某些特定资源(如内存)的竞争可能导致错误的软锁定的触发,因为主机可能会调度客户端 CPU 的时间超过 20 秒。当客户机 CPU 再次被调度到在主机上运行时,它会经历一个触发 到期计时器的 时间跳跃。计时器还包括 hrtimer watchdog,其可报告客户机 CPU 上的软锁定。
- 列表:虚拟机组件及其交互
- 列表:什么是软锁定
- 注意:重要 若要了解客户机中的软锁定,必须了解,主机会作为一个任务调度客户机,客户机然后会调度自己的任务。
第 11 章 为数据库服务器调整内核参数
- 要点:配置所需的内核参数,以确保数据库服务器和数据库高效操作。
11.1. 介绍
- 要点:数据库服务器是一种提供数据库管理系统 (DBMS) 功能的服务。DBMS 提供数据库管理的实用程序,并与最终用户、应用程序和数据库交互。
- 要点:Red Hat Enterprise Linux 10 提供以下数据库管理系统:
- 列表:MariaDB 10.11
- 列表:MySQL 8.4
- 列表:PostgreSQL 16
- 列表:Valkey 7.2
11.2. 影响数据库应用程序性能的参数
- 要点:查看影响数据库应用程序性能的内核参数,如 fs.aio-max-nr、fs.file-max、kernel.shmall 等。调整这些设置可帮助您管理异步 I/O、文件处理和共享内存,以实现最佳数据库效率。
- 要点:定义系统可在服务器中处理的异步 I/O 操作的最大数目。
- 列表:脏页缓存回写和 vm.dirty 参数
- 注意:注意 增加 fs.aio-max-nr 参数不会在增加 aio 限制外产生任何变化。
- 注意:注意 一个 vm.dirty_bytes 或 vm.dirty_ratio 可以在同一时间被指定。
第 12 章 配置巨页
- 要点:系统在固定大小页面中管理物理内存。x86_64 上默认的 4KiB 页面大小适合常规工作负载,但具有大型数据集的应用程序可从巨页中受益。在 Red Hat Enterprise Linux 10 中配置巨页以提高性能并减少资源使用量。
12.1. 可用的巨页功能
- 要点:使用 Red Hat Enterprise Linux,您可以将巨页用于处理大数据集的应用程序,并改进此类应用程序的性能。
- 要点:以下是 RHEL 支持的巨页方法:
- 列表:在引导时 :这会增加成功的可能性,因为内存还没有很大的碎片。但是,在 NUMA 机器上,页面数量会自动在不同的 NUMA 节点间进行分隔。
- 列表:在运行时 :它允许您为每个 NUMA 节点保留巨页。如果在引导过程中以早期方式进行运行时保留,则可能会降低内存碎片的可能性。
- 列表:系统范围 :内核会在可以分配巨页时尝试为进程分配巨页,进程会使用一个大型连续的虚拟内存区域。
- 列表:针对每个进程 :内核仅将巨页分配给单个进程的内存区域,您可以使用 madvise () 系统调用来指定。 注意 THP 功能只支持 2 MB 页面。
- 列表:在引导时保留 HugeTLB 页面的参数
- 列表:在引导时配置 HugeTLB
- 注意:注意 THP 功能只支持 2 MB 页面。
12.2. 在引导时保留 HugeTLB 页面的参数
- 要点:使用某些内核参数在引导时影响 HugeTLB 页面行为。
- 要点:有关如何在引导时使用这些参数配置 HugeTLB 页的更多信息,请参阅 在引导时配置 HugeTLB。
- 表格样本(共 4 行):
- 参数 | 描述 | 默认值
- hugepages | 定义在引导时在内核中配置的持久性巨页数量。 在 NUMA 系统中,定义了这个参数的巨页在节点间平均划分。 您可以通过更改 /sys/devices/system/node/node_id/hugepages/hugepages-size/nr_hugepages 文件中的节点值,在运行时为特定节点分配巨页。 | 默认值为 0。 要在引导时更新这个值,在 /proc/sys/vm/nr_hugepages 文件中更改这个参数的值。
- hugepagesz | 定义在引导时在内核中配置的持久性巨页的大小。 | 有效值为 2 MB 和 1 GB。默认值为 2 MB。
- default_hugepagesz | 定义在引导时在内核中配置的持久性巨页的默认大小。 | 有效值为 2 MB 和 1 GB。默认值为 2 MB。
12.3. 在引导时配置 HugeTLB
- 要点:通过 Huge Translation Lookaside Buffer (HugeTLB),您可以在引导时保留巨页来使用巨页。您可以最小化内存碎片,以确保有足够的资源可用于从较大的内存页面中受益的工作负载。
12.3.1. 使用内核命令行参数配置 HugeTLB
- 要点:要在最早引导阶段保留 Huge Translation Lookaside Buffer (HugeTLB)页面,您可以使用内核命令行参数。这个方法可确保成功保留所需的巨页数和大小,因为在内核启动过程中分配内存。
- 要点:首选使用内核引导参数保留 HugeTLB 页面,因为此方法可确保与使用 systemd 单元相比,分配更大的连续内存区域。
- 列表:在您的系统中必须具有 root 权限。
- 列表:更新内核命令行使其包含 HugeLTB 选项。 要为您的架构保留默认大小的 HugeTLB 页面,请输入: # grubby --update-kernel=ALL --args="hugepages=10" 这个命令保留默认池大小的 10 HugeTLB 页面。例如,在 x86_64 上,默认的池大小为 2 MB。在具有非统一内存访问(NUMA)的系统上,分配在 NUMA 节点上均匀分布。如果系统有两个 NUMA 节点,每个节点保留五个页面。 要保留不同的 HugeTLB 页面大小,在内核命令行中指定 hugepagesz 和 hugepages 选项,请输入: # grubby --update-kernel=ALL --ar…
- 列表:要为您的架构保留默认大小的 HugeTLB 页面,请输入: # grubby --update-kernel=ALL --args="hugepages=10" 这个命令保留默认池大小的 10 HugeTLB 页面。例如,在 x86_64 上,默认的池大小为 2 MB。在具有非统一内存访问(NUMA)的系统上,分配在 NUMA 节点上均匀分布。如果系统有两个 NUMA 节点,每个节点保留五个页面。
- 列表:要保留不同的 HugeTLB 页面大小,在内核命令行中指定 hugepagesz 和 hugepages 选项,请输入: # grubby --update-kernel=ALL --args="hugepagesz=2M hugepages=10 hugepagesz=1G hugepages=1" 该命令保留 10 页(共 2 MB )和 1 页( 1 GB )。 系统在引导时保留 HugeTLB 页面的指定数量和大小,确保在操作系统开始正常操作前分配内存。 重要 选项的顺序非常重要。每个 hugepagesz= 选项必须紧接其对应的 hugepages= 选项。
- 命令/配置摘录:
# grubby --update-kernel=ALL --args="hugepages=10"
# grubby --update-kernel=ALL --args="hugepagesz=2M hugepages=10 hugepagesz=1G hugepages=1"- 注意:注意 该流程中的示例演示了如何使用命令行选项配置 HugeTLB 页面。这些示例不一定适用于您的系统配置。在在您的环境中应用这些设置前,请查看您的系统要求和目标。
- 注意:重要 选项的顺序非常重要。每个 hugepagesz= 选项必须紧接其对应的 hugepages= 选项。
12.3.2. 使用 systemd 服务单元配置 HugeTLB
- 要点:要在用户空间引导过程中配置 Huge Translation Lookaside Buffer (HugeTLB)页面,请使用 systemd 服务单元。这会在内核初始化后保留内存,但在大多数服务启动后,请确保应用程序可以访问所需的页面。
- 要点:先决条件
- 列表:在您的系统中必须具有 root 权限。
- 列表:在 /usr/lib/systemd/system/ 目录中创建一个名为 hugetlb-gigantic-pages.service 的新文件,并添加以下内容: [Unit] Description=HugeTLB Gigantic Pages Reservation DefaultDependencies=no Before=dev-hugepages.mount ConditionPathExists=/sys/devices/system/node ConditionKernelCommandLine=hugepagesz=1G [Service] Type=oneshot RemainAfterExit=yes Exec…
- 列表:在 /usr/lib/systemd/ 目录中创建一个名为 hugetlb-reserve-pages.sh 的新文件,并添加以下内容: #!/bin/sh nodes_path=/sys/devices/system/node/ if [ ! -d $nodes_path ]; then echo "ERROR: $nodes_path does not exist" exit 1 fi reserve_pages() { echo $1 > $nodes_path/$2/hugepages/hugepages-1048576kB/nr_hugepages } reserve_pages <number_of_pages>…
- 列表:创建可执行脚本: # chmod +x /usr/lib/systemd/hugetlb-reserve-pages.sh
- 列表:启用早期引导保留: # systemctl enable hugetlb-gigantic-pages.service 注意 您可以在运行时尝试保留更多 1 GB 页面,方法是写入 nr_hugepages 属性。但是,为了避免因为内存碎片导致失败,在引导过程中在早期保留 1 GB 页面。 保留静态巨页可以有效地减少系统可用的内存量,并阻止它使用内存容量。虽然正确大小的保留巨页池对使用它的应用程序有用,但保留巨页的过度或未使用的池最终会降低整体系统性能。当设置保留的巨页池时,请确定系统可以正确地使用其完整的内存容量。
- 命令/配置摘录:
[Unit] Description=HugeTLB Gigantic Pages Reservation DefaultDependencies=no Before=dev-hugepages.mount ConditionPathExists=/sys/devices/system/node ConditionKernelCommandLine=hugepagesz=1G [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/lib/systemd/hugetlb-reserve-pages.sh [Install] WantedBy=sysinit.target
#!/bin/sh nodes_path=/sys/devices/system/node/ if [ ! -d $nodes_path ]; then echo "ERROR: $nodes_path does not exist" exit 1 fi reserve_pages() { echo $1 > $nodes_path/$2/hugepages/hugepages-1048576kB/nr_hugepages } reserve_pages <number_of_pages> <node>- 注意:注意 您可以在运行时尝试保留更多 1 GB 页面,方法是写入 nr_hugepages 属性。但是,为了避免因为内存碎片导致失败,在引导过程中在早期保留 1 GB 页面。 保留静态巨页可以有效地减少系统可用的内存量,并阻止它使用内存容量。虽然正确大小的保留巨页池对使用它的应用程序有用,但保留巨页的过度或未使用的池最终会降低整体系统性能。当设置保留的巨页池时,请确定系统可以正确地使用其完整的内存容量。
12.4. 在运行时保留 HugeTLB 页面的参数
- 要点:使用特定内核参数在运行时影响 HugeTLB 页面行为。
- 要点:有关如何在运行时使用这些参数配置 HugeTLB 页的更多信息,请参阅 在运行时配置 HugeTLB。
- 表格样本(共 3 行):
- 参数 | 描述 | 文件名
- nr_hugepages | 定义分配给指定 NUMA 节点的指定大小的巨页数量。 | /sys/devices/system/node/node_id/hugepages/hugepages-size/nr_hugepages
- nr_overcommit_hugepages | 定义系统通过过量使用内存来创建和使用的最大额外巨页数。 在此文件中写入任何非零值表示,如果持久性巨页池耗尽,系统会从内核的正常页面池中获取巨页数量。随着这些多余的巨页变得未使用,它们会被释放并返回到内核的正常页面池。 | /proc/sys/vm/nr_overcommit_hugepages
12.5. 在运行时配置 HugeTLB
- 要点:在运行时配置 HugeTLB 页面,以提高需要大量内存分配的应用程序的内存性能。使用指定大小在特定 NUMA 节点上保留巨页。
- 要点:流程
- 列表:显示内存统计信息: # numastat -cm | egrep 'Node|Huge' Node 0 Node 1 Node 2 Node 3 Total add AnonHugePages 0 2 0 8 10 HugePages_Total 0 0 0 0 0 HugePages_Free 0 0 0 0 0 HugePages_Surp 0 0 0 0 0
- 列表:将指定大小的巨页数量添加到节点: # echo 20 > /sys/devices/system/node/node2/hugepages/hugepages-2048kB/nr_hugepages 替换以下值: 20,使用您要保留的巨页数 2048,使用巨页的大小(单位为 KiB) 带有您要保留页面的 NUMA 节点的 node2 注意 路径中的目录名称为 hugepages-size_KiB,其中 以 KiB 为单位指定大小。实际目录名称可能显示为 hugepages-2048KiB 或 hugepages-2048kB,具体取决于您的系统。
- 列表:20,使用您要保留的巨页数
- 列表:2048,使用巨页的大小(单位为 KiB)
- 列表:带有您要保留页面的 NUMA 节点的 node2 注意 路径中的目录名称为 hugepages-size_KiB,其中 以 KiB 为单位指定大小。实际目录名称可能显示为 hugepages-2048KiB 或 hugepages-2048kB,具体取决于您的系统。
- 列表:确保添加了巨页数量: # numastat -cm | egrep 'Node|Huge' Node 0 Node 1 Node 2 Node 3 Total AnonHugePages 0 2 0 8 10 HugePages_Total 0 0 40 0 40 HugePages_Free 0 0 40 0 40 HugePages_Surp 0 0 0 0 0 如需更多信息,请参阅 numastat (8) 手册页。
- 命令/配置摘录:
# numastat -cm | egrep 'Node|Huge'
Node 0 Node 1 Node 2 Node 3 Total add AnonHugePages 0 2 0 8 10 HugePages_Total 0 0 0 0 0 HugePages_Free 0 0 0 0 0 HugePages_Surp 0 0 0 0 0- 注意:注意 路径中的目录名称为 hugepages-size_KiB,其中 以 KiB 为单位指定大小。实际目录名称可能显示为 hugepages-2048KiB 或 hugepages-2048kB,具体取决于您的系统。
12.6. 管理透明巨页
- 要点:Red Hat Enterprise Linux 10 默认启用透明大内存页(THP)。但是,您可以启用、禁用透明巨页,或使用运行时配置、TuneD 配置文件、内核命令行参数或 systemd 单元文件将透明巨页设置为 madvise。
12.6.1. 使用运行时配置管理透明巨页
- 要点:要优化内存用量,请在运行时管理透明大内存页(THP)。请注意,运行时配置在重启后不会保留。
- 要点:流程
- 列表:检查 THP 的状态: $ cat /sys/kernel/mm/transparent_hugepage/enabled
- 列表:配置 THP. 启用 THP: $ echo always > /sys/kernel/mm/transparent_hugepage/enabled 禁用 THP: $ echo never > /sys/kernel/mm/transparent_hugepage/enabled 将 THP 设置为 madvise : $ echo madvise > /sys/kernel/mm/transparent_hugepage/enabled 要防止应用程序分配过多的内存资源,请禁用系统范围的透明巨页,并只为通过 madvise 系统调用明确请求它的应用程序启用它们。 注意 有时,为短期分配提供低延迟的优先级比立即实现长时间分配的…
- 列表:启用 THP: $ echo always > /sys/kernel/mm/transparent_hugepage/enabled
- 列表:禁用 THP: $ echo never > /sys/kernel/mm/transparent_hugepage/enabled
- 列表:将 THP 设置为 madvise : $ echo madvise > /sys/kernel/mm/transparent_hugepage/enabled 要防止应用程序分配过多的内存资源,请禁用系统范围的透明巨页,并只为通过 madvise 系统调用明确请求它的应用程序启用它们。 注意 有时,为短期分配提供低延迟的优先级比立即实现长时间分配的性能要高。在这种情况下,您可以在启用 THP 时禁用直接压缩。 直接压缩是在巨页分配过程中同步的内存压缩。禁用直接压缩功能无法保证保存内存,但可能会降低频繁页面错误期间延迟更高的风险。另外,禁用直接压缩只允许 madvise 中突出显示的虚拟内存区域(VMAs)的异步压缩。请注意,如果…
- 命令/配置摘录:
$ cat /sys/kernel/mm/transparent_hugepage/enabled
$ echo always > /sys/kernel/mm/transparent_hugepage/enabled- 注意:注意 有时,为短期分配提供低延迟的优先级比立即实现长时间分配的性能要高。在这种情况下,您可以在启用 THP 时禁用直接压缩。 直接压缩是在巨页分配过程中同步的内存压缩。禁用直接压缩功能无法保证保存内存,但可能会降低频繁页面错误期间延迟更高的风险。另外,禁用直接压缩只允许 madvise 中突出显示的虚拟内存区域(VMAs)的异步压缩。请注意,如果工作负载从 THP 有很大的好处,则性能会降低。禁用直接压缩: $ echo never > /sys/kernel/mm/transparent_hugepage/defrag
12.6.2. 使用 TuneD 配置文件管理透明巨页
- 要点:要永久管理透明大内存页(THP),请使用 TuneD 配置集。在 tuned.conf 文件中配置这些配置集。
- 要点:先决条件
- 列表:TuneD 软件包已安装。
- 列表:TuneD 服务已启用。
- 列表:将活动配置文件复制到 /etc/tuned/profiles/ 目录: $ sudo cp -R /usr/lib/tuned/profiles/<profile> /etc/tuned/profiles/<new_profile>
- 列表:编辑 /etc/tuned/profiles/<new_profile>/tuned.conf 文件: $ sudo vi /etc/tuned/profiles/<new_profile>/tuned.conf 要启用 THP,请添加行: [bootloader] cmdline = transparent_hugepage=always 要禁用 THP,请添加行: [bootloader] cmdline = transparent_hugepage=never 要将 THP 设置为 madvise,请添加行: [bootloader] cmdline = transparent_hugepage=madvise
- 列表:要启用 THP,请添加行: [bootloader] cmdline = transparent_hugepage=always
- 列表:要禁用 THP,请添加行: [bootloader] cmdline = transparent_hugepage=never
- 命令/配置摘录:
$ sudo cp -R /usr/lib/tuned/profiles/<profile> /etc/tuned/profiles/<new_profile>
$ sudo vi /etc/tuned/profiles/<new_profile>/tuned.conf12.6.3. 使用内核命令行参数管理透明巨页
- 要点:要在引导时管理透明大内存页(THP),请修改内核参数。此配置在重启后会保留。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:获取当前的内核命令行参数: # grubby --info=$(grubby --default-kernel) kernel="/boot/vmlinuz-6.12.X-XXX.XX.X.el10_0.x86_64" args="ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX console=tty0 console=ttyS0" root="UUID=XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" initrd="/boot/initramfs-6.1…
- 列表:通过添加内核参数来配置 THP。 要启用 THP: # grubby --args="transparent_hugepage=always" --update-kernel=DEFAULT 要禁用 THP: # grubby --args="transparent_hugepage=never" --update-kernel=DEFAULT 要将 THP 设置为 madvise : # grubby --args="transparent_hugepage=madvise" --update-kernel=DEFAULT
- 列表:要启用 THP: # grubby --args="transparent_hugepage=always" --update-kernel=DEFAULT
- 列表:要禁用 THP: # grubby --args="transparent_hugepage=never" --update-kernel=DEFAULT
- 列表:要将 THP 设置为 madvise : # grubby --args="transparent_hugepage=madvise" --update-kernel=DEFAULT
- 命令/配置摘录:
# grubby --info=$(grubby --default-kernel)
kernel="/boot/vmlinuz-6.12.X-XXX.XX.X.el10_0.x86_64" args="ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX console=tty0 console=ttyS0" root="UUID=XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" initrd="/boot/initramfs-6.12.X-XXX.XX.X.el10_0.x86_64.img" title="Red Hat Enterprise Linux (6.12.X-XXX.XX.X.el10_0.x86_64) 10.0" id="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-6.12.X-XXX.XX.X.el10_0.x86_64"12.6.4. 使用 systemd 单元文件管理透明巨页
- 要点:要在系统启动时管理透明大内存页(THP),请使用 systemd 单元文件。创建服务可确保在重启后一致的 THP 配置。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:创建新的 systemd 服务文件,以启用、禁用 THP ,并将 THP 设置为 madvise。例如:/etc/systemd/system/disable-thp.service。
- 列表:通过向新的 systemd 服务文件中添加以下内容来配置 THP。 要启用 THP,请将以下内容添加到 <new_thp_file>.service 文件中: [Unit] Description=Enable Transparent Hugepages After=local-fs.target Before=sysinit.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/sh -c 'echo always > /sys/kernel/mm/transparent_hugepage/enabled [Install] WantedBy=multi…
- 列表:要启用 THP,请将以下内容添加到 <new_thp_file>.service 文件中: [Unit] Description=Enable Transparent Hugepages After=local-fs.target Before=sysinit.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/sh -c 'echo always > /sys/kernel/mm/transparent_hugepage/enabled [Install] WantedBy=multi-user.target
- 列表:要禁用 THP,请将以下内容添加到 <new_thp_file>.service 文件中: [Unit] Description=Disable Transparent Hugepages After=local-fs.target Before=sysinit.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled [Install] WantedBy=multi-user.target
- 列表:要将 THP 设置为 madvise,请将以下内容添加到 <new_thp_file>.service 文件中: [Unit] Description=Madvise Transparent Hugepages After=local-fs.target Before=sysinit.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/sh -c 'echo madvise > /sys/kernel/mm/transparent_hugepage/enabled [Install] WantedBy=multi-user.target
- 命令/配置摘录:
[Unit] Description=Enable Transparent Hugepages After=local-fs.target Before=sysinit.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/sh -c 'echo always > /sys/kernel/mm/transparent_hugepage/enabled [Install] WantedBy=multi-user.target
[Unit] Description=Disable Transparent Hugepages After=local-fs.target Before=sysinit.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled [Install] WantedBy=multi-user.target12.7. 页面大小对转换后备缓冲区大小的影响
- 要点:从页表中读取地址映射非常耗时且消耗资源,因此 CPU 设计包括最近使用的地址的缓存,称为 Translation Lookaside Buffer (TLB)。但是,默认的 TLB 只能缓存特定数量的地址映射。
- 要点:如果请求的地址映射不在 TLB 中,称为 TLB miss(TLB未命中),系统仍然需要读取页表以确定到虚拟地址映射的物理。由于应用程序内存要求和用于缓存地址映射的页面大小的关系,具有大内存要求的应用程序可能会比内存要求小的应用程序造成性能下降。因此,务必要尽可能避免 TLB 丢失。
12.8. 其他资源
- 列表:RHEL 提供的调优配置文件
- 列表:TuneD 插件
第 13 章 管理内存设备
- 要点:作为系统管理员,您可以配置 Red Hat Enterprise Linux (RHEL)如何管理新添加的内存设备。默认情况下,RHEL 使用 udev 规则自动在线热插内存。如果需要手动控制内存,您可以禁用此行为。
13.1. 使用 udev 进行自动内存
- 要点:Red Hat Enterprise Linux (RHEL)使用 udev 规则自动在线新添加的内存设备,包括 Compute Express Link (CXL)内存。这种机制可确保,热插拔内存块可在无需人工干预的情况下立即提供给操作系统。
- 要点:内存热插拔操作的默认 udev 规则位于 /usr/lib/udev/rules.d/40-redhat-hotplug.rules。此文件包含触发自动内存的配置,并在适用的情况下将内存块分配给 ZONE_MOVABLE。
- 列表:在虚拟机中配置内存在线
- 列表:内存在线配置的比较
- 列表:配置内存热插拔
13.2. 为 GPGPU 和其他 CXL 加速器内存用例配置 ZONE_NORMAL
- 要点:当 GPGPU 或其他加速器工作负载需要稳定的直接内存访问(DMA)来共享 CXL 内存时,将 CXL 内存配置为 ZONE_NORMAL。在 DMA 传输过程中,页面地址必须保持固定,因此内核会从 ZONE_NORMAL 分配该内存。
- 要点:通过 udev 覆盖将 CXL 内存配置为 ZONE_NORMAL,适用于需要稳定的 DMA 访问 CXL 内存的 GPGPU 设备和其他基于 CXL 的加速器。
- 列表:使用共享 CXL 内存在 GPU 间存储和引用数据。例如,AI 或大型语言模型工作负载中的键值缓存。
- 列表:处理超过板载 GPU 内存或标准双数据率(DDR)内存的大规模 GPGPU 数据。
- 列表:您在系统中具有 root 权限。
- 列表:您检查了设备驱动程序文档,并确认稳定的 DMA 到 CXL 内存需要 ZONE_NORMAL 内存。 重要 当您将内存配置为 ZONE_NORMAL 时,内核和驱动程序可以使用它。您可能无法安全地删除关联的内存设备。只有在工作负载需要设备 DMA 访问 CXL 内存,且受影响内存设备不需要 hot-remove 时,才使用此配置。
- 列表:将默认规则复制到本地覆盖目录中: # cp /usr/lib/udev/rules.d/40-redhat-hotplug.rules /etc/udev/rules.d/
- 列表:通过在内存热插规则中将 online_movable 改为 online_kernel,在文本编辑器中编辑 /etc/udev/rules.d/40-redhat-hotplug.rules : 删除前: ENV{.state}="online" CONST{virt}=="none", ENV{.state}="online_movable" ATTR{state}=="offline", ATTR{state}="$env{.state}" 删除后: ENV{.state}="online" CONST{virt}=="none", ENV{.state}="online_kernel" ATTR{state}=="offli…
- 命令/配置摘录:
# cp /usr/lib/udev/rules.d/40-redhat-hotplug.rules /etc/udev/rules.d/
ENV{.state}="online" CONST{virt}=="none", ENV{.state}="online_movable" ATTR{state}=="offline", ATTR{state}="$env{.state}"- 注意:重要 当您将内存配置为 ZONE_NORMAL 时,内核和驱动程序可以使用它。您可能无法安全地删除关联的内存设备。只有在工作负载需要设备 DMA 访问 CXL 内存,且受影响内存设备不需要 hot-remove 时,才使用此配置。
13.3. 在lining 上禁用自动内存
- 要点:要防止新添加的内存设备立即可用于操作系统,请通过修改相关的 udev 规则来禁用 Red Hat Enterprise Linux 中的自动内存。
- 要点:先决条件
- 列表:您在系统中具有 root 权限。
- 列表:将默认规则复制到本地覆盖目录中: cp /usr/lib/udev/rules.d/40-redhat-hotplug.rules /etc/udev/rules.d/
- 列表:在文本编辑器中编辑 /etc/udev/rules.d/40-redhat-hotplug.rules 文件,并注释掉处理内存热插操作的行: # Memory hotadd request #SUBSYSTEM!="memory", GOTO="memory_hotplug_end" #ACTION!="add", GOTO="memory_hotplug_end" #CONST{arch}=="s390*", GOTO="memory_hotplug_end" #CONST{arch}=="ppc64*", GOTO="memory_hotplug_end" #ENV{.state}="online" #CONST{virt}=…
- 列表:重新载入 udev 规则以应用更改: udevadm control --reload-rules
- 列表:重启系统,或者删除该设备并将其重新添加到系统中,以确保新配置生效。
- 列表:禁用自动打开后,新添加的内存块将保持离线状态,直到您手动在线为止。
- 命令/配置摘录:
cp /usr/lib/udev/rules.d/40-redhat-hotplug.rules /etc/udev/rules.d/
# Memory hotadd request #SUBSYSTEM!="memory", GOTO="memory_hotplug_end" #ACTION!="add", GOTO="memory_hotplug_end" #CONST{arch}=="s390*", GOTO="memory_hotplug_end" #CONST{arch}=="ppc64*", GOTO="memory_hotplug_end" #ENV{.state}="online" #CONST{virt}=="none", ENV{.state}="online_movable" #ATTR{state}=="offline", ATTR{state}="$env{.state}" #LABEL="memory_hotplug_end"13.4. 手动显示内存
- 要点:如果您禁用了自动内存,则新添加的内存块(如热插 CXL 设备中的内存块)默认保持离线。您可以使用 sysfs 接口手动在线这些内存块。
- 要点:先决条件
- 列表:您在系统中具有 root 权限。
- 列表:使用 lsmem 命令识别离线内存块标识符: # lsmem RANGE SIZE STATE REMOVABLE BLOCK 0x0000000000000000-0x000000007fffffff 2G online yes 0-1 0x0000000100000000-0x000000087fffffff 30G online yes 4-33 0x0000000880000000-0x00000008ffffffff 2G offline 34-41 Memory block size: 256M Total online memory: 32G Total offline memory: 2G 在本例中,离线内存块为 …
- 列表:通过写入状态文件来在线特定的内存块: echo online > /sys/devices/system/memory/memory<identifier>/state 将 memory<identifier > 替换为内存块的标识符,例如 memory34。
- 列表:验证内存块在线: cat /sys/devices/system/memory/memory<identifier>/state online
- 命令/配置摘录:
# lsmem
RANGE SIZE STATE REMOVABLE BLOCK 0x0000000000000000-0x000000007fffffff 2G online yes 0-1 0x0000000100000000-0x000000087fffffff 30G online yes 4-33 0x0000000880000000-0x00000008ffffffff 2G offline 34-41 Memory block size: 256M Total online memory: 32G Total offline memory: 2G13.5. 管理 CXL 内存设备
- 要点:CXL v2 内存热插拔允许您在 Red Hat Enterprise Linux 环境中动态添加和删除内存资源,从而支持数据中心灵活性。使用 CXL 设备和外部交换机,当您的系统支持 CXL v2 时,您可以创建超出传统硬件限制的共享内存池。
- 要点:CXL v2 引入了增强的内存管理和热插拔功能,并扩展了对裸机系统的支持。这些增强功能有助于降低删除手动内存节点的风险,从而提高了系统的稳定性和可靠性。
- 注意:注意 在配置 CXL v2 内存热插拔前,请验证您的系统固件和硬件是否与 CXL v2 兼容。
13.5.1. CXL 内存设备状态级别
- 要点:计算 Express Link (CXL)内存设备转换了多个状态,以响应特定的系统事件。术语 "Level 0" through "Level 4" 描述在热插拔操作期间 CXL 内存设备的状态转换。
- 要点:在 RHEL 中,CXL 内存以名为内存区域的单元进行管理。内存区域可以对应单个 CXL 设备,或通过创建过程中指定 interleave 来跨越多个设备。纳入内存区域的内存必须在操作系统可用前"在线"显示。
- 列表:热删除 CXL 内存设备
- 列表:CXL 命令手册
13.5.2. 安全离线热移动内存
- 要点:在 Red Hat Enterprise Linux (RHEL)中,您无法离线或者热删除内核或驱动程序使用的内存。RHEL 无法从这些区域迁移数据,这样可以阻止热删除操作。
- 要点:默认情况下,内核和驱动程序可以使用所有内存区域。这个行为可防止其他内存设备,如 Compute Express Link (CXL),无法热插或热删除。为避免这种限制,RHEL 允许您创建 ZONE_MOVABLE。内核或驱动程序不使用此内存区域,确保可以安全地删除它。
13.5.3. 防止在热添加内存时触发 OOM Killer
- 要点:内核需要内存容量来管理热添加的内存,称为 memmap 区域。此区域使用大约 1.6% 内存,例如 16 GB 为 1 TB。默认情况下,内核会从 ZONE_NORMAL 分配它。如果 ZONE_NORMAL 缺少可用内存,则此分配可能会触发 OOM Killer。
- 要点:从热添加的内存本身分配 memmap 区域可避免耗尽 ZONE_NORMAL。特定的设备,如 Compute Express Link (CXL)设备和标准 Dual Inline Memory Modules (DIMM),支持此功能。
- 列表:您在系统上具有 root 权限。
- 列表:您的内存硬件支持在设备本身上分配 memmap。如需更多信息,请参阅硬件厂商的文档。
- 列表:通过添加以下内核引导选项启用 memmap_on_memory 功能: memory_hotplug.memmap_on_memory=1
- 列表:重启系统以使更改生效。
- 列表:验证设置是否已启用: # cat /sys/module/memory_hotplug/parameters/memmap_on_memory Y
- 命令/配置摘录:
memory_hotplug.memmap_on_memory=1
# cat /sys/module/memory_hotplug/parameters/memmap_on_memory13.5.4. 热插 CXL 内存设备
- 要点:要动态增加系统内存,您可以在 Red Hat Enterprise Linux 中热插内存设备,如 Compute Express Link (CXL)模块或 Dual Inline Memory Modules (DIMM)。
- 要点:先决条件
- 列表:您正在运行 Red Hat Enterprise Linux 8 或更高版本。
- 列表:您在系统中具有 root 权限。
- 列表:您的系统固件(如 BIOS 或 UEFI)和硬件组件(如 CXL 交换机或后端plane)必须支持内存热插拔事件。
- 列表:根据您的硬件供应商的说明,将支持的内存设备插入到适当的插槽中。 热插拔事件可能源自内存模块的物理安装到插槽,或者从逻辑分配(如从 CXL 共享内存池动态分配内存)中。
- 列表:列出内存块的在线状态,并确认新添加的内存是自动在线的: # lsmem RANGE SIZE STATE REMOVABLE BLOCK 0x0000000000000000-0x000000007fffffff 2G online yes 0-1 0x0000000100000000-0x000000087fffffff 30G online yes 4-33 0x0000000880000000-0x00000008ffffffff 2G offline 34-41 Memory block size: 256M Total online memory: 32G Total offline memory: 2G 注意 如果内存…
- 列表:检查系统内存和 NUMA 拓扑,以确保新内存完全集成: # free -h # numactl -H
- 命令/配置摘录:
# lsmem
RANGE SIZE STATE REMOVABLE BLOCK 0x0000000000000000-0x000000007fffffff 2G online yes 0-1 0x0000000100000000-0x000000087fffffff 30G online yes 4-33 0x0000000880000000-0x00000008ffffffff 2G offline 34-41 Memory block size: 256M Total online memory: 32G Total offline memory: 2G- 注意:注意 如果内存离线,请验证是否禁用了自动内存。如需更多信息,请参阅 禁用自动内存。如果操作没有自动完成,则必须手动在线内存块。
- 注意:重要 如果您遇到问题,请查看硬件文档并确保满足所有先决条件。
13.5.5. 热删除 CXL 内存设备
- 要点:要安全地删除计算 Express 链接(CXL)内存设备,您必须确保内核不再使用该内存。您可以通过使内存离线并禁用关联的内存区域来安全地删除 CXL 内存设备。
- 要点:先决条件
- 列表:您在系统中具有 root 权限。
- 列表:将内存设置为离线。 这允许内核从要删除的内存区域迁移数据,确保不再使用它。
- 列表:如果 CXL 内存区域仍然活跃,则禁用它: # cxl disable-region 注意 如果内存仍处于在线状态,cxl disable-region 命令也会自动使内存离线。
- 列表:销毁 CXL 内存区域: # cxl destroy-region
- 列表:禁用内存设备: # cxl disable-memdev
- 列表:所有命令成功完成后,物理删除 CXL 设备或使用硬件的管理界面断开连接。
- 命令/配置摘录:
# cxl disable-region
# cxl destroy-region- 注意:注意 如果内存仍处于在线状态,cxl disable-region 命令也会自动使内存离线。
13.5.6. 验证 CXL 内存状态
- 要点:您可以使用各种命令行工具验证 Compute Express Link (CXL)内存设备的状态和配置。
- 要点:先决条件
- 列表:您有 root 权限。
- 列表:已安装 pciutils 软件包(用于 lspci)。
- 列表:numactl 软件包已安装。
- 列表:使用 lspci 命令检查 CXL 设备连接: 由于 CXL 是 PCIe 的扩展,因此您可以使用 lspci 来查看设备详情。 # lspci -vvv 01:00.0 CXL: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [CXL Memory Device (CXL 2.x)] Subsystem: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... NUMA node: 0 ...
- 列表:将 CXL 内存状态检查为 NUMA 节点: CXL 内存被视为无 CPU NUMA 节点。使用 numactl 命令检查状态。 # numactl -H --cpu-compress available: 4 nodes (0-3) node 0 cpus: 0-95, 192-287 (192) node 0 size: 15219 MB ... node 2 cpus: (0) node 2 size: 258048 MB ...
- 列表:使用 dmesg 检查 BIOS-e820 输出中的"软保留"区域来验证 BIOS/EFI 配置支持: [ 0.000000] BIOS-e820: [mem 0x0000001070000000-0x000000506fffffff] soft reserved 配置 CXL 内存设备的支持取决于 EFI_MEMORY_SP BIOS 功能。如果没有启用此设置,Red Hat Enterprise Linux (RHEL)会将 CXL 设备视为普通 RAM。如果没有配置此设置,内核会将 CXL 设备视为 DDR DRAM。具体步骤请参考您的平台固件配置手册。
- 命令/配置摘录:
# lspci -vvv
01:00.0 CXL: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [CXL Memory Device (CXL 2.x)] Subsystem: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... NUMA node: 0 ...13.5.7. 使用 CXL 内存作为服务器间共享内存
- 要点:将 Compute Express Link (CXL)内存用作服务器间共享内存时,请确保设备设置为 Level 3 (启用内存区域,但没有为操作系统在线)。
- 要点:标准操作系统内存管理系统在级别 4 上运行。但是,在服务器间使用共享内存需要专用接口,且不能由传统 RHEL 内存管理处理。
- 列表:在lining 上禁用自动内存
13.5.8. 热拔出内存设备的注意事项
- 要点:当计划热删除内存设备时,请考虑以下潜在的问题和限制。
- 要点:这表示无法从目标删除的内存移动数据。内核重试内存迁移,通常会成功完成。但是,根据系统状况进行热移除失败:
- 列表:1GB 巨页 :不支持热删除。
- 列表:2MB 巨页 :迁移需要连续可用内存。如果内存不可用,则热移除会失败。 内存不足(OOM) Killer 风险 如果某个进程通过 mbind (MPOL_BIND) 绑定到非一致性内存访问(NUMA)节点,并且您热插拔该节点,则内核会因为内存不足而触发 OOM Killer。
- 列表:配置内存热插拔
- 命令/配置摘录:
[ 6381.169189] page dumped because: migration failure [ 6381.181353] migrating pfn 8842600 failed ret:2 ...第 14 章 内核日志记录入门
- 要点:Red Hat Enterprise Linux 中的内核日志记录使用 syslog 服务将系统、内核、服务和应用程序事件记录到日志文件中,以进行审核和故障排除。
14.1. 什么是内核环缓冲
- 要点:内核使用环缓冲来存储 printk () 消息,在系统启动期间保留重要信息。这会在 syslog 等服务读取并将其保存到持久性存储前保留早期引导信息。
- 要点:环缓冲是一个具有固定大小的循环数据结构,并硬编码到内核中。用户可以通过 dmesg 命令或 /var/log/boot.log 文件显示存储在内核环缓冲中的数据。当环形缓冲区满时,新数据将覆盖旧数据。
14.2. 日志级别和内核日志记录上的 printk 角色
- 要点:内核消息具有日志级别,表示其重要性。内核环缓冲会收集所有消息。kernel.printk 参数控制哪个缓冲区信息到达控制台。
- 要点:日志级别值按以下顺序划分:
- 列表:控制台日志级别,定义打印到控制台的消息的最低优先级。
- 列表:消息没有显式附加日志级别的默认日志级别。
- 列表:为控制台日志级别设置最低的日志级别配置。
- 列表:在引导时为控制台日志级别设置默认值。 这些值的每一个都定义不同的处理错误消息的规则。
- 列表:什么是内核环缓冲
- 命令/配置摘录:
# sysctl kernel.printk kernel.printk = 7 4 1 7- 注意:重要 默认的 7 4 1 7 printk 值可以更好地调试内核活动。但是,当与串行控制台耦合时,这个 printk 设置可能会导致大量 I/O 突发,这可能会导致 RHEL 系统变得暂时不响应。为避免这种情况,把 printk 值设置为 4 4 1 7 通常可以正常工作,但其代价是丢失额外的调试信息。 另请注意,某些内核命令行参数(如 quiet 或 debug)会更改默认的 kernel.printk 值。
第 15 章 重新安装 GRUB
- 要点:重新安装 GRUB 引导装载程序以解决安装不正确、缺失文件或系统损坏导致的问题。升级软件包时,还需要重新安装 GRUB,将引导信息添加到另一个驱动器中,或者恢复对安装的操作系统的控制。
- 注意:注意 只有在文件没有损坏时,GRUB 才能恢复这些文件。
15.1. 在基于 BIOS 的机器上重新安装 GRUB
- 要点:要确保基于 BIOS 的系统在启动时保持运行,请在更新 GRUB 软件包后在系统中重新安装 GRUB 引导装载程序。
- 要点:流程
- 列表:安装 grub2-pc: # grub2-pc
- 列表:在安装了它的设备上重新安装 GRUB。例如:如果 sda 是您的设备: # grub2-install /dev/sda
- 列表:重启您的系统以使更改生效: # reboot 如需更多信息,请参阅系统中的 grub2-pc (8) 手册页。
- 命令/配置摘录:
# grub2-pc
# grub2-install /dev/sda- 注意:重要 这会覆盖现有的 GRUB ,以安装新的 GRUB。确定系统在安装过程中不会导致数据损坏或引导崩溃。
15.2. 在基于 UEFI 的机器上重新安装 GRUB
- 要点:要解决引导问题,请在基于 UEFI 的系统中重新安装 GRUB 引导装载程序。
- 要点:流程
- 列表:重新安装 grub2-efi 和 shim 引导装载程序文件: # dnf reinstall grub2-efi-x64 shim
- 列表:重启您的系统以使更改生效: # reboot
- 命令/配置摘录:
# dnf reinstall grub2-efi-x64 shim
# reboot- 注意:重要 确定系统在安装过程中不会导致数据损坏或引导崩溃。
15.3. 在 IBM Power 机器上重新安装 GRUB
- 要点:要在 IBM Power 系统上维护系统可引导性,请在更新 GRUB 软件包后在 Power PC Reference Platform (PReP)引导分区中重新安装 GRUB 引导装载程序。
- 要点:流程
- 列表:列出存储 GRUB 的磁盘分区: # bootlist -m normal -o sda1
- 列表:在磁盘分区上重新安装 GRUB: # grub2-install partition 使用标识的 GRUB 分区(如 /dev/sda1) 替换 partition。
- 列表:重启您的系统以使更改生效: # reboot 详情请查看您系统中的 grub-install (1) 手册页。
- 命令/配置摘录:
# bootlist -m normal -o
sda1- 注意:重要 这会覆盖现有的 GRUB ,以安装新的 GRUB。确定系统在安装过程中不会导致数据损坏或引导崩溃。
15.4. 重置 GRUB
- 要点:要修复由于文件损坏或无效配置导致的引导失败,请重置 GRUB。这个过程会删除当前设置,并使用默认值重新安装引导装载程序。
- 要点:流程
- 列表:删除配置文件: # rm /etc/grub.d/* # rm /etc/sysconfig/grub
- 列表:重新安装软件包。 在基于 BIOS 的机器上: # dnf reinstall grub2-pc grub2-tools 在基于 UEFI 的机器上: # dnf reinstall grub2-efi shim grub2-tools grub2-common
- 列表:在基于 BIOS 的机器上: # dnf reinstall grub2-pc grub2-tools
- 列表:在基于 UEFI 的机器上: # dnf reinstall grub2-efi shim grub2-tools grub2-common
- 列表:重建 grub.cfg 文件,以使更改生效: # grub2-mkconfig -o /boot/grub2/grub.cfg 这适用于基于 BIOS 和 UEFI 的系统。 警告 对于基于 BIOS 和 UEFI 的机器,重建 grub.cfg 的路径是一样的。实际的 grub.cfg 只在 BIOS 路径中存在。UEFI 路径有一个 stub 文件,不能使用 grub2-mkconfig 命令进行修改或重新创建。
- 列表:按照 重新安装 GRUB 流程,来在 /boot/ 分区上恢复 GRUB。
- 命令/配置摘录:
# rm /etc/grub.d/* # rm /etc/sysconfig/grub
# dnf reinstall grub2-pc grub2-tools- 注意:重要 以下流程将删除用户所做的所有自定义。
- 注意:警告 对于基于 BIOS 和 UEFI 的机器,重建 grub.cfg 的路径是一样的。实际的 grub.cfg 只在 BIOS 路径中存在。UEFI 路径有一个 stub 文件,不能使用 grub2-mkconfig 命令进行修改或重新创建。
第 16 章 安装 kdump
- 要点:在 Red Hat Enterprise Linux 安装中默认安装并激活 kdump 服务。您可以在安装过程中使用 Anaconda 或命令行之后启用和配置 kdump。
16.1. kdump
- 要点:kdump 工具提供了一个崩溃转储机制,它生成 vmcore 文件进行分析。通过使用 kexec 系统调用,kdump 引导至保留 捕获内核,而无需重启。然后,它会将崩溃内核的内存保存到文件中。
- 要点:如果您在机器上有多个内核,则可以为所有安装的内核或只为指定的内核启用 kdump。安装 kdump 时,系统会创建一个默认的 /etc/kdump.conf 文件。/etc/kdump.conf 包含默认最小 kdump 配置,您可以编辑它来自定义 kdump 配置。
- 注意:重要 当出现系统故障时,内核崩溃转储唯一可用的信息。因此,在关键任务环境中操作 kdump 非常重要。您必须在正常的内核更新周期中定期更新并测试 kexec-tools、kdump-utils 和 makedumpfile 软件包。这在安装新内核功能时非常重要。
16.2. 使用 Anaconda 安装 kdump
- 要点:要在交互式安装过程中配置 kdump,请使用 Anaconda 安装程序的图形界面。使用此功能,您可以启用 kdump 并保留所需的内存。
- 要点:流程
- 列表:在 Anaconda 安装程序上,点 KDUMP 并启用 kdump。
- 列表:在 Kdump Memory Reservation 中,如果您必须自定义内存保留,请选择 Manual'。
- 列表:在 KDUMP > Memory for Reserved (MB) 中,设置 kdump 所需的内存保留。
16.3. 在命令行中安装 kdump
- 要点:要在默认没有安装时启用 kdump,比如在自定义 Kickstart 安装中,请安装所需的软件包并确认安装。
- 要点:先决条件
- 列表:一个有效的 Red Hat Enterprise Linux 订阅。
- 列表:包含用于您的系统 CPU 架构的 kexec-tools、kdump-utils 和 makedumpfile 软件包的存储库。
- 列表:满足 kdump 配置和目标的要求。详情请查看支持的 kdump 配置和目标。
- 列表:检查您的系统上是否已安装了 kdump : # rpm -q kexec-tools kdump-utils makedumpfile
- 列表:如果没有安装 kdump,请安装所需的软件包: # dnf install kexec-tools kdump-utils makedumpfile
- 命令/配置摘录:
# rpm -q kexec-tools kdump-utils makedumpfile
# dnf install kexec-tools kdump-utils makedumpfile第 17 章 在命令行中配置 kdump
- 要点:在 GRUB 配置文件中配置 kdump 内存保留。保留内存大小取决于 crashkernel= 值和系统的物理内存大小。
17.1. 估算 kdump 大小
- 要点:要有效地计划和构建 kdump 环境,请估算崩溃转储文件所需的空间。
- 要点:makedumpfile --mem-usage 命令估计崩溃转储文件所需的空间。它生成一个内存使用率报告。报告帮助您决定转储级别以及可以安全排除的页。
- 列表:输入以下命令生成内存用量报告: # makedumpfile --mem-usage /proc/kcore TYPE PAGES EXCLUDABLE DESCRIPTION ------------------------------------------------------------- ZERO 501635 yes Pages filled with zero CACHE 51657 yes Cache pages CACHE_PRIVATE 5442 yes Cache pages + private USER 16301 yes User process pages FREE 77738211 yes Free…
- 命令/配置摘录:
# makedumpfile --mem-usage /proc/kcore
TYPE PAGES EXCLUDABLE DESCRIPTION ------------------------------------------------------------- ZERO 501635 yes Pages filled with zero CACHE 51657 yes Cache pages CACHE_PRIVATE 5442 yes Cache pages + private USER 16301 yes User process pages FREE 77738211 yes Free pages KERN_DATA 1333192 no Dumpable kernel data- 注意:重要 makedumpfile --mem-usage 命令会以页为单位报告所需的内存。这意味着您必须根据内核页面大小计算所使用的内存大小。 默认情况下,RHEL 内核在 AMD64 和 Intel 64 CPU 构架上使用 4 KB 大小的页,在 IBM POWER 构架上使用 64 KB 大小的页。
17.2. 配置 kdump 内存用量
- 要点:为 kdump 配置内存保留。kdump-utils 软件包提供默认的 crashkernel= 值,您可以在手动设置内存时用作参考。
- 要点:kdump 自动内存分配根据系统硬件架构和可用内存大小而有所不同。例如,在 AMD64 和 Intel 64 位构架中,crashkernel= 参数的默认值仅在可用内存超过 2 GB 时才可以正常工作。kdump-utils 工具在 AMD64 和 Intel 64 位构架上配置以下默认的内存保留:
- 列表:您在系统上具有 root 权限。
- 列表:您已满足配置和目标的 kdump 要求。详情请查看支持的 kdump 配置和目标。
- 列表:如果是 IBM Z 系统,您已安装了 zipl 工具。
- 列表:为崩溃内核配置默认值: # kdumpctl reset-crashkernel --kernel=ALL 在配置 crashkernel= 值时,请通过重启启用了 kdump 的系统来测试配置。如果 kdump 内核无法引导,请逐渐增加内存大小来设置一个可接受的值。
- 列表:使用自定义 crashkernel= 值 配置所需的内存保留: crashkernel=192M 另外,您还可以使用语法 crashkernel=<range1>:<size1>,<range2>:<size2> ,根据安装的内存总量将保留的内存量设置为一个变量。例如: crashkernel=1G-4G:192M,2G-64G:256M 如果系统内存总量为 1 GB 或大于 4 GB,则示例保留 192 MB 内存。如果内存量超过 4 GB,则为 kdump 保留 256 MB。 可选:偏移保留内存。 有些系统必须以特定固定偏移量保留内存。crashkernel 保留在引导过程中早期发生,系统会出于特殊目的使用一些内存区域。设置…
- 列表:配置所需的内存保留: crashkernel=192M 另外,您还可以使用语法 crashkernel=<range1>:<size1>,<range2>:<size2> ,根据安装的内存总量将保留的内存量设置为一个变量。例如: crashkernel=1G-4G:192M,2G-64G:256M 如果系统内存总量为 1 GB 或大于 4 GB,则示例保留 192 MB 内存。如果内存量超过 4 GB,则为 kdump 保留 256 MB。
- 命令/配置摘录:
crashkernel=2G-64G:256M,64G-:512M
# kdumpctl reset-crashkernel --kernel=ALL- 注意:警告 测试 kdump 配置的命令会导致内核在数据丢失时崩溃。请仔细按照说明操作。不要使用活跃的生产环境系统来测试 kdump 配置。
17.3. 配置 kdump 目标
- 要点:配置 kdump 存储崩溃转储文件的位置。您可以使用 NFS 或 SSH 在本地存储转储或通过网络发送转储。一次只能配置一个存储选项。默认情况下,kdump 在本地文件系统中的 /var/crash/ 中存储崩溃转储。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:满足 kdump 配置和目标的要求。详情请查看支持的 kdump 配置和目标。
- 列表:要将崩溃转储文件保存在本地文件系统的 /var/crash/ 目录中,请编辑 /etc/kdump.conf 文件并指定路径: path /var/crash 选项 path /var/crash 代表 kdump 在其中保存崩溃转储文件的文件系统的路径。 当您在 /etc/kdump.conf 文件中指定转储目标时,路径相对于 指定的转储目标。当您没有指定转储目标时,路径代表根目录 的绝对路径。根据当前系统中挂载的文件系统,会自动配置转储目标和调整的转储路径。
- 列表:要保护崩溃转储文件以及 kdump 生成的文件,您必须为目标目标目录配置正确的属性。这些属性包括用户权限和 SELinux 上下文。另外,您可以定义一个脚本,如 kdump.conf 文件中的 kdump_post.sh,如下所示: kdump_post <path_to_kdump_post.sh> kdump_post 指令指定 shell 脚本或命令。这个脚本在 kdump 捕获并将崩溃转储保存到指定的目的地后运行。您可以使用此机制扩展 kdump 的功能,以执行包括调整文件权限在内的操作。
- 列表:显示并了解 kdump 目标配置: 通过过滤注释和空行来显示有效的配置: # grep -v '^#' /etc/kdump.conf | grep -v '^$' 输出示例: ext4 /dev/mapper/vg00-varcrashvol path /var/crash core_collector makedumpfile -c --message-level 1 -d 31 转储目标已指定了(ext4 /dev/mapper/vg00-varcrashvol),因此它被挂载到 /var/crash。path 选项也被设置为 /var/crash。因此,kdump 将 vmcore 文件保存在 /var/crash/var…
- 列表:通过过滤注释和空行来显示有效的配置: # grep -v '^#' /etc/kdump.conf | grep -v '^$'
- 命令/配置摘录:
path /var/crash
kdump_post <path_to_kdump_post.sh>- 注意:重要 在 Red Hat Enterprise Linux 10 中,在 kdump systemd 服务启动前,使用 path 指令定义为 kdump 目标的目录必须存在。否则,服务会失败。如果服务启动时目录不存在,则不再自动创建该目录。
- 注意:重要 您必须使用 LABEL= 或 UUID= 指定存储设备。无法保证 /dev/sda3 等磁盘设备名称在重启后保持一致。 当您在 IBM Z 硬件中使用 Direct Access Storage Device (DASD)时,请验证转储设备配置。在继续 kdump 前,请确保在 /etc/dasd.conf 中正确指定转储设备。
17.4. 了解 kdump 内核收集器
- 要点:/etc/kdump.conf 中的 core_collector 指令使用控制崩溃转储压缩、页面过滤和日志输出在集合期间运行 makedumpfile 工具。
- 要点:makedumpfile 工具是 Red Hat Enterprise Linux 中的默认核心收集器。它通过压缩数据并排除不必要的页面来减少崩溃转储大小。
- 列表:压缩崩溃转储文件,并使用各种转储级别只复制必要的页面
- 列表:排除不必要的崩溃转储页面
- 列表:过滤崩溃转储中包含的页面类型
- 列表:-c,-l,-p, 或 -z: 指定每个页的压缩转储文件格式。zlib for -c,lzo for -l,snappy for -p, 或 zstd for -z。
- 列表:-d (dump_level): Exclude 页,以便它们不会复制到转储文件中。
- 列表:--message-level :指定消息类型。您可以通过使用这个选项设置 message_level 来限制输出。例如,message_level 7 会输出常见消息和错误消息。message_level 的最大值为 31。
- 命令/配置摘录:
core_collector makedumpfile -l --message-level 1 -d 31- 注意:注意 崩溃转储文件压缩默认启用。
17.5. 配置 kdump 核心收集器
- 要点:设置 /etc/kdump.conf 中的 core_collector 行,以控制 makedumpfile 收集和压缩崩溃转储的方式。
- 要点:makedumpfile 工具通过以下方法减少崩溃转储文件的大小:
- 列表:使用各种转储级别压缩页面并仅复制必要的数据。
- 列表:排除不必要的崩溃转储页。
- 列表:过滤崩溃转储中包含的页面类型。
- 列表:-c,-l or -p: 使用 -c 选项的 zlib 、-l 选项的 lzo 、-p 选项的 snappy 或 -z 选项的 zstd,按每个页面指定压缩转储文件格式。
- 列表:-d (dump_level) :排除页面,它们不会复制到转储文件中。
- 列表:--message-level :指定消息类型。您可以通过使用这个选项指定 message_level 来限制打印的输出。例如,把 message_level 设置为 7 可打印常见消息和错误消息。message_level 的最大值为 31。
- 命令/配置摘录:
core_collector makedumpfile -l --message-level 1 -d 31
core_collector makedumpfile -l --message-level 1 -d 31- 注意:注意 崩溃转储文件压缩默认启用。
17.6. 配置 kdump 默认失败响应
- 要点:要为 kdump 配置默认失败响应,请指定默认重启以外的操作。这决定了保存内核转储失败时的系统行为。
- 要点:其他操作包括以下选项:
- 列表:您在系统上具有 root 权限。
- 列表:您已满足 kdump 配置和目标的要求。
- 列表:以 root 用户身份,删除 /etc/kdump.conf 配置文件中 #failure_action 行开头的哈希符号(#)。
- 列表:将值替换为所需的操作。 failure_action poweroff
- 列表:支持的 kdump 配置和目标
- 列表:配置 kdump 目标
- 命令/配置摘录:
failure_action poweroff17.7. kdump 的配置文件
- 要点:kdump 内核的配置文件是 /etc/sysconfig/kdump。此文件控制 kdump 内核命令行参数。对于大多数配置,请使用默认选项。
- 要点:然而,在某些情况下,您可能需要修改某些参数来控制 kdump 内核行为。例如,您可以修改 KDUMP_COMMANDLINE_APPEND 选项,为详细的调试输出附加 kdump 内核命令行。您还可以修改 KDUMP_COMMANDLINE_REMOVE 选项,以从 kdump 命令行中删除参数。
- 命令/配置摘录:
# KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swiotlb"
KDUMP_COMMANDLINE_APPEND="cgroup_disable=memory"17.8. 测试 kdump 配置
- 要点:配置 kdump 后,手动测试系统崩溃并确保 kdump 在定义的目标中生成 vmcore 文件。新引导的内核捕获 vmcore 文件,其中包含用于调试内核崩溃的重要信息。
- 要点:如果进行任何手动系统修改,您必须在任何系统修改的最后测试 kdump 配置。例如,如果您进行以下任何更改,请确保测试 kdump 配置以获得最佳 kdump 性能:
- 列表:软件包升级。
- 列表:硬件级别的更改,如存储或网络更改。
- 列表:固件升级。
- 列表:包括第三方模块的新安装和应用程序升级。
- 列表:如果您使用热插拔机制在支持此机制的硬件上添加更多内存。
- 列表:在 /etc/kdump.conf 或 /etc/sysconfig/kdump 文件中进行更改后。
- 命令/配置摘录:
# kdumpctl restart
# kdumpctl status- 注意:警告 不要对活动状态的生产环境系统测试 kdump。测试 kdump 的命令会导致内核崩溃。根据您的系统架构,调度重要的维护时间。kdump 测试可能需要使用较长的引导时间进行一些重启。 如果在 kdump 测试过程中没有生成 vmcore 文件,请识别并修复问题。然后,再次运行测试以验证 kdump 操作是否成功。
17.9. 系统崩溃后 kdump 生成的文件
- 要点:系统崩溃后,kdump 服务会在转储文件(vmcore)中捕获内核内存。该服务还会生成诊断文件,以帮助故障排除和事后分析。
- 要点:kdump 生成的文件:
- 列表:vmcore - 崩溃时包含系统内存的主内核内存转储文件。它会根据 kdump 配置中指定的 core_collector 程序的配置包括数据。默认情况下,它包括内核数据结构、进程信息、堆栈跟踪和其他诊断信息。
- 列表:vmcore-dmesg.txt - panic 的主内核中的内核环缓冲区日志的内容(dmesg)。
- 列表:kexec-dmesg.log - 在捕获内核收集 vmcore 数据时的内核和系统日志消息。
- 列表:什么是内核环缓冲
17.10. 启用和禁用 kdump 服务
- 要点:要在特定或所有安装的内核上管理 kdump 功能,您可以启用或禁用它。需要常规测试来验证 kdump 是否正常运行。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:您已为配置和目标完成了 kdump 要求。请参阅 支持的 kdump 配置和目标。
- 列表:用于安装 kdump 的所有配置都是根据需要设置的。
- 列表:为 multi-user.target 启用 kdump 服务: # systemctl enable kdump.service
- 列表:在当前会话中启动服务: # systemctl start kdump.service
- 列表:停止 kdump 服务: # systemctl stop kdump.service
- 命令/配置摘录:
# systemctl enable kdump.service
# systemctl start kdump.service- 注意:警告 建议将 kptr_restrict=1 设置为默认。当将 kptr_restrict 设置为(1)作为默认时,kdumpctl 服务会加载崩溃内核,而不考虑内核地址空间布局(KASLR)是否启用了。 如果 kptr_restrict 没有被设置为 1,并且 KASLR 被启用了,则生成的 /proc/kore 文件的内容全为零。kdumpctl 服务无法访问 /proc/kcore 文件,并加载崩溃内核。kexec-kdump-howto.txt 文件显示一个要设置 kptr_restrict=1 的警告消息。验证 sysctl.conf 文件中的以下内容,以确保 kdumpctl 服务加载崩溃内核: sysctl.conf 文件中的内核 kptr_restrict=1。
17.11. 防止内核驱动程序为 kdump 加载
- 要点:要防止特定内核驱动程序在捕获内核中加载,请使用 /etc/sysconfig/kdump 中的 KDUMP_COMMANDLINE_APPEND= 变量。这会停止 kdump initramfs 加载模块,有助于避免内存不足(OOM)错误和其他崩溃内核失败。
- 要点:您可以使用以下配置选项之一附加 KDUMP_COMMANDLINE_APPEND= 变量:
- 列表:rd.driver.blacklist=<modules>
- 列表:modprobe.blacklist=<modules>
- 列表:您在系统上具有 root 权限。
- 列表:显示载入到当前运行内核的模块的列表。选择您要阻止其加载的内核模块: $ lsmod Module Size Used by fuse 126976 3 xt_CHECKSUM 16384 1 ipt_MASQUERADE 16384 1 uinput 20480 1 xt_conntrack 16384 1
- 列表:更新 /etc/sysconfig/kdump 文件中的 KDUMP_COMMANDLINE_APPEND= 变量。例如: KDUMP_COMMANDLINE_APPEND="rd.driver.blacklist=hv_vmbus,hv_storvsc,hv_utils,hv_netvsc,hid-hyperv" 另外,考虑以下使用 modprobe.blacklist=<modules> 配置选项的示例: KDUMP_COMMANDLINE_APPEND="modprobe.blacklist=emcp modprobe.blacklist=bnx2fc modprobe.blacklist=libfcoe modprobe.…
- 列表:重启 kdump 服务: # systemctl restart kdump 如需更多信息,请参阅系统中的 dracut.cmdline 手册页。
- 命令/配置摘录:
$ lsmod
Module Size Used by fuse 126976 3 xt_CHECKSUM 16384 1 ipt_MASQUERADE 16384 1 uinput 20480 1 xt_conntrack 16384 117.12. 在使用加密磁盘的系统中运行 kdump
- 要点:要在带有 LUKS 加密分区的系统中运行 kdump,请确保有足够的可用内存。内存不足会导致 cryptsetup 无法挂载分区,防止第二个内核(捕获内核)中的 vmcore 捕获。
- 要点:kdumpctl estimate 命令可帮助您估算 kdump 所需的内存量。kdumpctl estimate 打印 crashkernel 值,这是 kdump 所需的最合适的内存大小。
- 列表:输出估计的 crashkernel= 值: # kdumpctl estimate Encrypted kdump target requires extra memory, assuming using the keyslot with minimum memory requirement Reserved crashkernel: 256M Recommended crashkernel: 652M Kernel image size: 47M Kernel modules size: 8M Initramfs size: 20M Runtime reservation: 64M LUKS required si…
- 列表:通过增加 crashkernel= 值来配置所需的内存量。
- 列表:重启系统。 注意 如果 kdump 服务仍无法将转储文件保存到加密的目标,请根据需要增大 crashkernel= 值。
- 命令/配置摘录:
# kdumpctl estimate
Encrypted kdump target requires extra memory, assuming using the keyslot with minimum memory requirement Reserved crashkernel: 256M Recommended crashkernel: 652M Kernel image size: 47M Kernel modules size: 8M Initramfs size: 20M Runtime reservation: 64M LUKS required size: 512M Large modules: <none> WARNING: Current crashkernel size is lower than recommended size 652M.- 注意:注意 如果 kdump 服务仍无法将转储文件保存到加密的目标,请根据需要增大 crashkernel= 值。
第 18 章 启用 kdump
- 要点:在特定内核或者 Red Hat Enterprise Linux 中的所有安装的内核中启用或禁用 kdump 功能。定期测试并验证 kdump 功能,以确保它正常工作。
18.1. 为所有安装的内核启用 kdump
- 要点:要为在机器上安装的所有内核启用 kdump 服务,请在安装 kdump-utils 软件包后启用 kdump.service。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:将 crashkernel= 命令行参数添加到所有安装的内核中: # grubby --update-kernel=ALL --args="crashkernel=xxM" xxM 是所需的内存(以 MB 为单位)。
- 列表:对于统一内核镜像(UKI),请将 crashkernel= 命令行参数添加到所有安装的 UKI 中。将与所需参数关联的附加组件从 /lib/modules/$(uname -r)/vmlinuz-virt.efi.extra.d/ 复制到 /boot/efi/loader/addons/。
- 列表:重启系统: # reboot
- 列表:启用 kdump 服务: # systemctl enable --now kdump.service
- 列表:检查 kdump 服务是否正在运行: # systemctl status kdump.service kdump.service - Crash recovery kernel arming Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: disabled) Active: active (live)
- 命令/配置摘录:
# grubby --update-kernel=ALL --args="crashkernel=xxM"
# reboot18.2. 为特定安装的内核启用 kdump
- 要点:要为特定安装的内核启用 kdump 服务,请在 Grand Unified Bootloader (GRUB)中配置 crashkernel 参数。选择目标内核并启用该服务捕获崩溃转储。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:列出安装在机器上的内核: # ls -a /boot/vmlinuz-* /boot/vmlinuz-0-rescue-2930657cd0dc43c2b75db480e5e5b4a9 /boot/vmlinuz-6.12.0-55.9.1.el10_0.x86_64 /boot/vmlinuz-6.12.0-55.9.1.el10_0.x86_64
- 列表:在系统的 Grand Unified Boot Loader (GRUB)配置中添加特定的 kdump 内核: 例如: # grubby --update-kernel=vmlinuz-6.12.0-55.9.1.el10_0.x86_64 --args="crashkernel=xxM" xxM 是所需的内存保留(以 MB 为单位)。
- 列表:对于统一内核镜像(UKI),将 crashkernel= 命令行参数添加到特定的 UKI 中。将与所需参数关联的附加组件从 /lib/modules/$(uname -r)/vmlinuz-virt.efi.extra.d/ 复制到 / boot/efi/EFI/Linux/ <machine-id>- <kernel-version>.efi.extra.d/。
- 列表:启用 kdump 服务: # systemctl enable --now kdump.service
- 列表:检查 kdump 服务是否正在运行: # systemctl status kdump.service kdump.service - Crash recovery kernel arming Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: disabled) Active: active (live)
- 命令/配置摘录:
# ls -a /boot/vmlinuz-*
/boot/vmlinuz-0-rescue-2930657cd0dc43c2b75db480e5e5b4a9 /boot/vmlinuz-6.12.0-55.9.1.el10_0.x86_64 /boot/vmlinuz-6.12.0-55.9.1.el10_0.x86_6418.3. 禁用 kdump 服务
- 要点:您可以停止 kdump 服务,并禁用该服务在 Red Hat Enterprise Linux 系统中启动。
- 要点:先决条件
- 列表:满足 kdump 配置和目标的要求。
- 列表:要在当前会话中停止 kdump 服务: # systemctl stop kdump.service
- 列表:要禁用 kdump 服务: # systemctl disable kdump.service 警告 您必须将 kptr_restrict=1 设置为默认。当将 kptr_restrict 设置为(1)作为默认值时,kdumpctl 服务会加载崩溃内核,而无论是否启用了内核地址空间布局(KASLR)。 如果 kptr_restrict 没有设置为 1,且 KASLR 被启用了,则 /proc/kore 文件的内容被生成为全零。kdumpctl 服务无法访问 /proc/kcore 文件,并加载崩溃内核。kexec-kdump-howto.txt 文件会显示一条警告信息,其建议您设置 kptr_restrict=1。验证 sysct…
- 列表:支持的 kdump 配置和目标
- 列表:使用 systemd 单元文件自定义和优化您的系统
- 命令/配置摘录:
# systemctl stop kdump.service
# systemctl disable kdump.service- 注意:警告 您必须将 kptr_restrict=1 设置为默认。当将 kptr_restrict 设置为(1)作为默认值时,kdumpctl 服务会加载崩溃内核,而无论是否启用了内核地址空间布局(KASLR)。 如果 kptr_restrict 没有设置为 1,且 KASLR 被启用了,则 /proc/kore 文件的内容被生成为全零。kdumpctl 服务无法访问 /proc/kcore 文件,并加载崩溃内核。kexec-kdump-howto.txt 文件会显示一条警告信息,其建议您设置 kptr_restrict=1。验证 sysctl.conf 文件中的以下内容,以确保 kdumpctl 服务加载崩溃内核: sysctl.conf 文件中的内核 kptr_restrict=1。
第 19 章 支持的 kdump 配置和目标
- 要点:kdump 机制在内核崩溃时生成崩溃转储文件,为根本原因分析提供重要信息。识别支持的配置和目标,配置 kdump,并在 Red Hat Enterprise Linux 系统上验证其操作。
19.1. kdump 的内存要求
- 要点:kdump 需要永久保留系统内存以便捕获内核存储崩溃转储进行分析。主内核无法访问此内存。
- 要点:内存要求因某些系统参数而异。主要因素之一就是系统的硬件构架。要识别确切的机器架构,如 Intel 64 和 AMD64,也称为 x86_64,并将其输出到标准输出,请使用以下命令:
- 列表:Red Hat Enterprise Linux 技术能力和限制
- 命令/配置摘录:
$ uname -m- 注意:重要 根据系统中内存总量自动配置保留内存是最佳工作量估算。实际需要的内存可能因其他因素(如 I/O 设备)而异。没有使用足够的内存可能会导致 debug 内核在出现内核 panic 的情况下无法作为捕获内核引导。要避免这个问题,请充分增加崩溃内核内存。
- 表格样本(共 16 行):
- 架构 | 可用内存 | 最小保留内存
- AMD64 和 Intel 64 (x86_64) | 2 GB 到 64 GB | 256 MB 内存
- 64 GB 及更多 | 512 MB 内存
- 64 位 ARM (4k 页) | 1 GB 到 4 GB | 256 MB 内存
19.2. 自动内存保留的最小阈值
- 要点:kdump-utils 工具使用 crashkernel 参数为 kdump 自动保留内存。但是,这需要最小系统内存,这因架构而异。如果您的系统内存小于阈值,您必须手动配置保留。
- 注意:注意 RHEL 10 不再支持引导命令行中的 crashkernel=1G-4G:192M,4G-64G:256M,64G:512M 选项。
- 表格样本(共 5 行):
- 架构 | 所需的内存
- AMD64 和 Intel 64 (x86_64) | 2 GB
- IBM Power 系统 (ppc64le) | 2 GB
- IBM Z (s390x) | 2 GB
19.3. 支持的 kdump 目标
- 要点:当发生内核崩溃时,操作系统会将转储文件保存在配置的或默认的目标位置上。您可以将转储保存到设备中,作为本地文件系统中的文件,或者通过网络。以下列表显示了 Red Hat Enterprise Linux 当前支持或不支持的 kdump 目标。
- 要点:其他资源
- 列表:配置 kdump 目标
- 表格样本(共 6 行):
- 目标类型 | 支持的目标 | 不支持的目标
- 物理存储 | 逻辑卷管理器(LVM)。 精简配置卷。 光纤通道(FC)磁盘,如 qla2xxx、lpfc、bnx2fc 和 bfa。 网络存储服务器上 iSCSI 软件配置的逻辑设备。 mdraid 子系统作为一个软件 RAID 的解决方案。 硬件 RAID,如 smartpqi、hpsa、megaraid、mpt3sas、ausraid 和 mpi3mr。 SCSI 和 SATA 磁盘。 iSCSI 和 HBA 卸载。 硬件 FCoE,如 qla2xxx 和 lpfc。 软件 FCoE,如 bnx2fc。要使软件 FCoE 正常工作,可能需要额外的内存配置。 | BIOS RAID。 带有 iBFT 的软件 iSCSI.目前支持的传输有 bnx2i、cxgb3i 和 cxgb4i。 带有混合设备驱动程序的软件 iSCSI,如 be2iscsi。 以太网上的光纤通道(FCoE)。 传统 IDE。 GlusterFS 服务器. GFS2 文件系统。 集群逻辑卷管理器(CLVM)。 高可用性 LVM 卷(HA-LVM)。
- 网络 | 使用 igb,ixgbe,ice,i40e,e1000e,igc,tg3,bnx2x,bnxt_en,qede,cxgb4,be2net, enic,sfc,mlx4_en,mlx5_core,r8169,atlantic,nfp, 以及仅在 64 位 ARM 架构上的 nicvf 等内核模块的硬件。 | 使用 sfc SRIOV、cxgb4vf 和 pch_gbe 等内核模块的硬件。 IPv6 协议. 无线连接。 InfiniBand 网络。 网桥和 team 上的 VLAN 网络。
- 虚拟机监控程序(Hypervisor) | 基于内核的虚拟机(KVM)。 仅在某些配置中的 Xen hypervisor。 ESXi 6.6, 6.7, 7.0. 仅在 RHEL Gen1 UP 客户机及更高版本上的 Hyper-V 2012 R2。
19.4. 支持的 kdump 过滤等级
- 要点:要减少转储文件大小,kdump 使用 makedumpfile 压缩数据并排除不需要的信息。有关支持的过滤级别,如排除 巨页,请查看表。
- 要点:其他资源
- 列表:配置 kdump 核心收集器
- 表格样本(共 6 行):
- 选项 | 描述
- 1 | 零页
- 2 | 缓存页
- 4 | 缓存私有
19.5. 支持的默认故障响应
- 要点:默认情况下,当 kdump 创建内核转储失败时,操作系统会重启。但是,当无法将内核转储保存到主目标上时,您可以将 kdump 配置为执行不同的操作。
- 要点:其他资源
- 列表:配置 kdump 默认失败响应
19.6. 使用 final_action 参数
- 要点:要在 kdump 成功或失败后执行 reboot 等操作,请使用 final_action 参数。默认操作为 reboot。
- 要点:流程
- 列表:要配置 final_action,请编辑 /etc/kdump.conf 文件并添加以下选项之一: final_action reboot final_action halt final_action poweroff
- 列表:final_action reboot
- 列表:final_action halt
- 列表:final_action poweroff
- 列表:重启 kdump 服务,以使更改生效。 # kdumpctl restart
- 命令/配置摘录:
# kdumpctl restart19.7. 使用 failure_action 参数
- 要点:要在崩溃转储失败时指定操作,请使用 failure_action 参数。默认操作为 reboot。
- 要点:参数接受以下要执行的操作:
- 列表:要将操作配置为在转储失败时执行的操作,请编辑 /etc/kdump.conf 文件并指定其中一个 failure_action 选项: failure_action reboot failure_action halt failure_action poweroff failure_action shell failure_action dump_to_rootfs
- 列表:failure_action reboot
- 列表:failure_action halt
- 列表:failure_action poweroff
- 列表:failure_action shell
- 列表:failure_action dump_to_rootfs
- 命令/配置摘录:
# kdumpctl restart第 20 章 固件支持的转储机制
- 要点:固件支持的转储(fadump)是 IBM POWER 系统中 kdump 的替代选择。它使用板固件来隔离内存区域,并防止意外覆盖崩溃分析数据。fadump 工具针对 IBM POWER 系统上的 Red Hat Enterprise Linux 进行了优化。
20.1. IBM PowerPC 硬件支持转储固件
- 要点:fadump 工具使用固件在崩溃期间保留内存,从完全重设系统捕获 vmcore。它重复使用 kdump 脚本保存文件。保留区域包括除引导内存、寄存器和硬件页表之外的所有系统内存。
- 要点:fadump 机制通过重新引导分区并使用新内核转储之前内核崩溃中的数据,提供比传统转储类型的更高可靠性。fadump 需要一个基于 IBM POWER6 处理器或更高版本的硬件平台。
- 注意:注意 未保留的内存区域(称为引导内存)是在崩溃事件后成功引导内核所需的 RAM 量。默认情况下,引导内存大小为 256MB 或系统 RAM 总量的 5%,以较大者为准。
20.2. 启用固件支持的转储机制
- 要点:要增强 IBM POWER 系统的崩溃转储功能,启用固件支持的转储(fadump)机制。
- 要点:在安全引导环境中,GRUB 引导装载程序分配一个引导内存区域,称为 Real Mode Area (RMA)。RMA 有 512 MB 大小的内存,在引导组件之间分配。如果组件超过其大小分配,则 GRUB 会失败,并显示内存不足(OOM)错误。
- 列表:您在系统上具有 root 权限。
- 列表:安装 kexec-tools、kdump-utils 和 makedumpfile 软件包。
- 列表:为 crashkernel 配置默认值: # kdumpctl reset-crashkernel --fadump=on --kernel=ALL
- 列表:可选:保留引导内存而不是默认值: # grubby --update-kernel ALL --args="fadump=on crashkernel=xxM" xxM 是所需的内存大小(以 MB 为单位)。 注意 当指定引导选项时,请通过重启启用了 kdump 的内核来测试配置。如果 kdump 内核无法引导,请逐渐增加 crashkernel 值来设置适当的值。
- 列表:重启以使更改生效: # reboot
- 命令/配置摘录:
error: ../../grub-core/kern/mm.c:376:out of memory. Press any key to continue…
# kdumpctl reset-crashkernel --fadump=on --kernel=ALL- 注意:警告 不要在 RHEL 9.1 及更早版本上的安全引导环境中启用固件支持的转储(fadump)机制。GRUB 引导装载程序失败,并显示以下错误: error: ../../grub-core/kern/mm.c:376:out of memory. Press any key to continue… 仅当您因为 fadump 配置而增加默认 initramfs 大小时,系统才是可恢复的。 有关恢复系统的临时解决方案方法的详情,请参考 GRUB 内存不足(OOM)中的系统引导结束 文章。
- 注意:注意 当指定引导选项时,请通过重启启用了 kdump 的内核来测试配置。如果 kdump 内核无法引导,请逐渐增加 crashkernel 值来设置适当的值。
20.3. IBM Z 硬件支持的固件转储机制
- 要点:使用固件支持的转储机制(如 sadump 和 VMDUMP )捕获 IBM Z 系统中的机器状态。这些工具在早期引导阶段运行,以便您可以分析 kdump 服务启动前发生的系统故障。
- 要点:IBM Z 系统支持以下固件支持的转储机制:
- 列表:独立转储 (sadump)
- 列表:VMDUMP
- 列表:系统控制台启动并控制 sadump 机制,并将其存储在 IPL 可引导设备上。
- 列表:VMDUMP 机制与 sadump 类似。此工具也从系统控制台启动,但会从硬件检索生成的转储并将其复制到系统以进行分析。
- 列表:这些方法(与其他基于硬件的转储机制类似)能够在 kdump 服务启动前捕获机器在早期启动阶段的状态。
- 列表:虽然 VMDUMP 包含一种将转储文件接收到 Red Hat Enterprise Linux 系统的机制,但 VMDUMP 的配置和控制是从 IBM Z 硬件控制台进行管理的。
20.4. 在 Fujitsu PRIMEQUEST 系统中使用 sadump
- 要点:要在 Fujitsu PRIMEQUEST 系统上 kdump 失败时捕获回退转储,请使用 sadump。使用管理局(MMB)接口配置 kdump,然后启用并启动 sadump。
- 要点:流程
- 列表:在 /etc/sysctl.conf 文件中添加或编辑以下行,以确保 sadump 的 kdump 按预期启动: kernel.panic=0 kernel.unknown_nmi_panic=1 警告 特别是,请确保在 kdump 后系统不会重启。如果系统在 kdump 无法保存 vmcore 文件后重启,则无法启动 sadump。
- 列表:适当地将 /etc/kdump.conf 中的 failure_action 参数设置为 halt 或 shell。 failure_action shell 如需更多信息,请参阅 FUJITSU Server PRIMEQUEST 2000 系列安装手册。
- 命令/配置摘录:
kernel.panic=0 kernel.unknown_nmi_panic=1
failure_action shell- 注意:警告 特别是,请确保在 kdump 后系统不会重启。如果系统在 kdump 无法保存 vmcore 文件后重启,则无法启动 sadump。
第 21 章 分析内核转储
- 要点:crash 工具分析由 kdump、netdump、diskdump 或 xendump 机制生成的内核转储来识别系统崩溃原因。它提供类似于 GDB 的交互式提示。或者,使用 Kernel Oops Analyzer 或 Kdump Helper 工具。
21.1. 安装 crash 工具
- 要点:要在运行时或通过检查 vmcore 转储文件来分析系统状态,请安装 crash 工具。这个工具提供了一个交互式 shell,用于调试正在运行的系统和分析崩溃转储。
- 要点:流程
- 列表:启用相关的软件仓库: # subscription-manager repos --enable baseos repository # subscription-manager repos --enable appstream repository # subscription-manager repos --enable rhel-10-for-x86_64-baseos-debug-rpms
- 列表:安装 crash 软件包: # dnf install crash
- 列表:安装 kernel-debuginfo 软件包: # dnf install kernel-debuginfo 软件包 kernel-debuginfo 与正在运行的内核对应,并提供转储分析所需的数据。
- 命令/配置摘录:
# subscription-manager repos --enable baseos repository
# subscription-manager repos --enable appstream repository21.2. 运行和退出 crash 工具
- 要点:要分析系统崩溃并排除与内核相关的问题,请在 vmcore 转储文件中使用 crash 工具。使用此工具了解崩溃时系统状态,并确定问题的根本原因。
- 要点:先决条件
- 列表:识别当前运行的内核(如 6.12.0-55.9.1.el10_0.x86_64)。
- 列表:要启动 crash 工具程序,需要将两个必要的参数传递给该命令: debug-info (一个解压缩的 vmlinuz 镜像),如通过特定的 kernel-debuginfo 软件包提供的 /usr/lib/debug/lib/modules/6.12.0-55.9.1.el10_0.x86_64/vmlinux。 实际的 vmcore 文件,如 /var/crash/127.0.0.1-2021-09-13-14:05:33/vmcore 然后,最终的 crash 命令如下所示: # crash /usr/lib/debug/lib/modules/6.12.0-55.9.1.el10_0.x86_64/vmlinux /var…
- 列表:debug-info (一个解压缩的 vmlinuz 镜像),如通过特定的 kernel-debuginfo 软件包提供的 /usr/lib/debug/lib/modules/6.12.0-55.9.1.el10_0.x86_64/vmlinux。
- 列表:实际的 vmcore 文件,如 /var/crash/127.0.0.1-2021-09-13-14:05:33/vmcore 然后,最终的 crash 命令如下所示: # crash /usr/lib/debug/lib/modules/6.12.0-55.9.1.el10_0.x86_64/vmlinux /var/crash/127.0.0.1-2021-09-13-14:05:33/vmcore 使用 kdump 捕获的相同 <kernel> 版本。
- 列表:运行 crash 工具。 以下示例显示了分析一个使用 6.12.0-55.9.1.el10_0.x86_64 内核创建的内核转储。 ... WARNING: kernel relocated [202MB]: patching 90160 gdb minimal_symbol values KERNEL: /usr/lib/debug/lib/modules/6.12.0-55.9.1.el10_0.x86_64/vmlinux DUMPFILE: /var/crash/127.0.0.1-2021-09-13-14:05:33/vmcore [PARTIAL DUMP] CPUS: 2 DATE: Mon Sep 13 …
- 列表:要退出交互式提示并停止 crash 工具,请键入 exit 或 q。 crash> exit ~]# 注意 crash 命令也用作调试实时系统的强大工具。但是,您必须谨慎使用它,以避免系统级的问题。
- 命令/配置摘录:
# crash /usr/lib/debug/lib/modules/6.12.0-55.9.1.el10_0.x86_64/vmlinux /var/crash/127.0.0.1-2021-09-13-14:05:33/vmcore
... WARNING: kernel relocated [202MB]: patching 90160 gdb minimal_symbol values KERNEL: /usr/lib/debug/lib/modules/6.12.0-55.9.1.el10_0.x86_64/vmlinux DUMPFILE: /var/crash/127.0.0.1-2021-09-13-14:05:33/vmcore [PARTIAL DUMP] CPUS: 2 DATE: Mon Sep 13 14:05:16 2021 UPTIME: 01:03:57 LOAD AVERAGE: 0.00, 0.00, 0.00 TASKS: 586 NODENAME: localhost.localdomain RELEASE: 6.12.0-55.9.1.el10_0.x86_64 VERSION: #1 SMP Wed Aug 29 11:51:55 UTC 2018 MACHINE: x86_64 (2904 Mhz) MEMORY: 2.9 GB PANIC: "sysrq: SysRq : Trigger a crash" PID: 10635 COMMAND: "bash" TASK: ffff8d6c84271800 [THREAD_INFO: ffff8d6c84271800] CPU: 1 STATE: TASK_RUNNING (SYSR…- 注意:注意 crash 命令也用作调试实时系统的强大工具。但是,您必须谨慎使用它,以避免系统级的问题。
21.3. 在 crash 工具中显示各种指示符
- 要点:要显示系统指示符,如内核消息缓冲区、后端、进程状态、虚拟内存信息和打开文件,请使用 crash 工具。
- 要点:流程
- 列表:要显示内核消息缓冲区,请在互动提示符下输入 log 命令: crash> log ... several lines omitted ... EIP: 0060:[<c068124f>] EFLAGS: 00010096 CPU: 2 EIP is at sysrq_handle_crash+0xf/0x20 EAX: 00000063 EBX: 00000063 ECX: c09e1c8c EDX: 00000000 ESI: c0a09ca0 EDI: 00000286 EBP: 00000000 ESP: ef4dbf24 DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 Proce…
- 列表:要显示内核堆栈追踪,请使用 bt 命令: crash> bt PID: 5591 TASK: f196d560 CPU: 2 COMMAND: "bash" #0 [ef4dbdcc] crash_kexec at c0494922 #1 [ef4dbe20] oops_end at c080e402 #2 [ef4dbe34] no_context at c043089d #3 [ef4dbe58] bad_area at c0430b26 #4 [ef4dbe6c] do_page_fault at c080fb9b #5 [ef4dbee4] error_code (via page_fault) at c080…
- 列表:要显示系统中进程的状态,请使用 ps 命令: crash> ps PID PPID CPU TASK ST %MEM VSZ RSS COMM > 0 0 0 c09dc560 RU 0.0 0 0 [swapper] > 0 0 1 f7072030 RU 0.0 0 0 [swapper] 0 0 2 f70a3a90 RU 0.0 0 0 [swapper] > 0 0 3 f70ac560 RU 0.0 0 0 [swapper] 1 0 1 f705ba90 IN 0.0 2828 1424 init ... several lines omitted ... 5566 1 1 f2592560 IN 0.0 1…
- 列表:要显示基本虚拟内存信息,在交互式提示符下键入 vm 命令: crash> vm PID: 5591 TASK: f196d560 CPU: 2 COMMAND: "bash" MM PGD RSS TOTAL_VM f19b5900 ef9c6000 1648k 5084k VMA START END FLAGS FILE f1bb0310 242000 260000 8000875 /lib/ld-2.12.so f26af0b8 260000 261000 8100871 /lib/ld-2.12.so efbc275c 261000 262000 8100873 /lib/ld-2.12.so efbc2a18 2680…
- 列表:要显示打开文件的信息,请使用 files 命令: crash> files PID: 5591 TASK: f196d560 CPU: 2 COMMAND: "bash" ROOT: / CWD: /root FD FILE DENTRY INODE TYPE PATH 0 f734f640 eedc2c6c eecd6048 CHR /pts/0 1 efade5c0 eee14090 f00431d4 REG /proc/sysrq-trigger 2 f734f640 eedc2c6c eecd6048 CHR /pts/0 10 f734f640 eedc2c6c eecd6048 CHR /pts/0 255 …
- 命令/配置摘录:
crash> log ... several lines omitted ... EIP: 0060:[<c068124f>] EFLAGS: 00010096 CPU: 2 EIP is at sysrq_handle_crash+0xf/0x20 EAX: 00000063 EBX: 00000063 ECX: c09e1c8c EDX: 00000000 ESI: c0a09ca0 EDI: 00000286 EBP: 00000000 ESP: ef4dbf24 DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 Process bash (pid: 5591, ti=ef4da000 task=f196d560 task.ti=ef4da000) Stack: c068146b c0960891 c0968653 00000003 00000000 00000002 efade5c0 c06814d0 <0> fffffffb c068150f b7776000 f2600c40 c0569ec4 ef4dbf9c 00000002 b7776000 <0> efade5c0 00000002 b7776000 c0569e60 c051de50 ef4dbf9c f196d560 ef4dbfb4 Call Trace: [<c068146b>] ? __handle_sysrq+0xfb/0x160 [<c06814d…
crash> bt PID: 5591 TASK: f196d560 CPU: 2 COMMAND: "bash" #0 [ef4dbdcc] crash_kexec at c0494922 #1 [ef4dbe20] oops_end at c080e402 #2 [ef4dbe34] no_context at c043089d #3 [ef4dbe58] bad_area at c0430b26 #4 [ef4dbe6c] do_page_fault at c080fb9b #5 [ef4dbee4] error_code (via page_fault) at c080d809 EAX: 00000063 EBX: 00000063 ECX: c09e1c8c EDX: 00000000 EBP: 00000000 DS: 007b ESI: c0a09ca0 ES: 007b EDI: 00000286 GS: 00e0 CS: 0060 EIP: c068124f ERR: ffffffff EFLAGS: 00010096 #6 [ef4dbf18] sysrq_handle_crash at c068124f #7 [ef4dbf24] __handle_sysrq at c0681469 #8 [ef4dbf48] write_sysrq_trigger at c068150a #9 [ef4dbf54] proc_reg_write…- 注意:注意 内核消息缓冲区包含有关系统崩溃的最重要的信息。它总是首先转储到 vmcore-dmesg.txt 文件中。如果您无法获取完整的 vmcore 文件,例如由于目标位置上空间不足,则您可以从内核消息缓冲中获得所需的信息。默认情况下,vmcore-dmesg.txt 放在 /var/crash/ 目录中。
21.4. 使用 Kernel Oops Analyzer
- 要点:要分析崩溃转储,请使用 Kernel Oops Analyzer。它将 oops 消息与知识库中的已知问题进行比较。
- 要点:先决条件
- 列表:oops 消息被安全地提供给 Kernel Oops Analyzer。
- 列表:访问 Kernel Oops Analyzer 工具。
- 列表:要诊断内核崩溃问题,请上传 vmcore 中生成的内核 oops 日志。 或者,您可以通过提供文本消息或 vmcore-dmesg.txt 作为输入来诊断内核崩溃问题。
- 列表:或者,您可以通过提供文本消息或 vmcore-dmesg.txt 作为输入来诊断内核崩溃问题。
- 列表:点 DETECT,来根据 makedumpfile 中的信息,将 oops 消息与已知解决方案进行比较。
- 列表:Kernel Oops Analyzer
21.5. Kdump Helper 工具
- 要点:Kdump Helper 工具有助于使用提供的信息设置 kdump。kdump 帮助程序根据您的偏好生成配置脚本。在服务器中启动并运行该脚本可设置 kdump 服务。
- 要点:其他资源
- 列表:kdump Helper
第 22 章 使用早期 kdump 来捕获引导时间崩溃
- 要点:早期 kdump 在系统服务启动前在早期引导阶段崩溃时会捕获 vmcore 文件。它加载内存早期的崩溃内核和 initramfs,以保留其他丢失的故障排除信息。
22.1. 启用早期 kdump
- 要点:early kdump 功能设置崩溃内核和初始 RAM 磁盘镜像(initramfs),以便早期加载以捕获早期崩溃的 vmcore 信息。这有助于消除丢失早期引导内核崩溃信息的风险。
- 要点:先决条件
- 列表:一个有效的 Red Hat Enterprise Linux 订阅。
- 列表:包含用于您的系统 CPU 架构的 kexec-tools、kdump-utils 和 makedumpfile 软件包的存储库。
- 列表:实现了 kdump 配置和目标要求。如需更多信息,请参阅 支持的 kdump 配置和目标。
- 列表:验证 kdump 服务是否已启用并活跃: # systemctl is-enabled kdump.service && systemctl is-active kdump.service enabled active 如果没有启用并运行 kdump,请设置所有必要的配置,并验证是否已启用 kdump 服务。
- 列表:使用 早期 kdump 功能重建引导内核的 initramfs 镜像: # dracut -f --add earlykdump
- 列表:添加 rd.earlykdump 内核命令行参数: # grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="rd.earlykdump"
- 命令/配置摘录:
# systemctl is-enabled kdump.service && systemctl is-active kdump.service
enabled active第 23 章 为安全引导签名内核和模块
- 要点:使用签名的内核和内核模块来提高系统安全性。在启用了安全引导机制的基于 UEFI 的系统上,自签名构建的内核或模块,并将公钥导入到目标系统。
- 要点:如果启用了安全引导机制,则必须使用私钥签名以下所有组件,并使用对应的公钥进行身份验证:
- 列表:UEFI 操作系统引导装载程序
- 列表:Red Hat Enterprise Linux 内核
- 列表:所有内核模块
- 列表:签名的引导装载程序
- 列表:签名的内核
- 列表:签名的内核模块
- 注意:注意 不是所有基于 UEFI 的系统都包括对安全引导的支持。 构建系统(构建和签署内核模块)不需要启用 UEFI 安全引导,甚至不需要是基于 UEFI 的系统。
23.1. 先决条件
- 要点:要能够为外部构建的内核模块签名,请从以下软件包安装工具:
- 列表:要能够为外部构建的内核模块签名,请从以下软件包安装工具: # dnf install pesign openssl kernel-devel mokutil keyutils Expand 表 23.1. 所需工具 工具 由软件包提供 用于 用途 efikeygen pesign 构建系统 生成公共和专用 X.509 密钥对 openssl openssl 构建系统 导出未加密的私钥 sign-file kernel-devel 构建系统 用来使用私钥为内核模块签名的可执行文件 mokutil mokutil 目标系统 用于手动注册公钥的可选工具 keyctl keyutils …
- 命令/配置摘录:
# dnf install pesign openssl kernel-devel mokutil keyutils- 表格样本(共 6 行):
- 工具 | 由软件包提供 | 用于 | 用途
- efikeygen | pesign | 构建系统 | 生成公共和专用 X.509 密钥对
- openssl | openssl | 构建系统 | 导出未加密的私钥
- sign-file | kernel-devel | 构建系统 | 用来使用私钥为内核模块签名的可执行文件
23.2. 什么是 UEFI 安全引导
- 要点:使用统一可扩展固件接口(UEFI)安全引导技术,您可以防止执行缺少可信签名的内核空间代码。加密密钥为系统引导装载程序签名,固件的公钥数据库授权该密钥。
- 要点:然后,您可以在下一个阶段引导装载程序和内核中验证签名。
- 列表:UEFI 私钥签名,公钥验证 shim 第一阶段引导装载程序。证书颁发机构 (CA)反过来签署公钥。CA 存储在固件数据库中。
- 列表:shim 文件包含红帽公钥 Red Hat Secure Boot (CA 密钥 1) 来验证 GRUB 引导装载程序和内核。
- 列表:内核又包含用于验证驱动程序和模块的公钥。
- 列表:用于非易失性存储中加密保护的 UEFI 变量的编程接口。
- 列表:在 UEFI 变量中存储可信的 X.509 根证书。
- 列表:UEFI 应用程序的验证,如引导装载程序和驱动程序。
23.3. UEFI 安全引导支持
- 要点:如果内核和所有加载的驱动程序都执行可信签名,您可以在启用了 UEFI 安全引导的系统中安装并运行 Red Hat Enterprise Linux 10。红帽提供了适用于红帽密钥的已签名的内核和驱动程序。
- 要点:如果要加载外部构建的内核或驱动程序,还必须给它们签名。
- 列表:系统仅在签名被正确验证后才运行 kernel-mode 代码。
- 列表:GRUB 模块加载被禁用,因为没有签名和验证 GRUB 模块的基础架构。允许模块加载将在安全引导定义的安全范围内运行不受信任的代码。
- 列表:红帽提供了一个签名的 GRUB 二进制文件,其有 Red Hat Enterprise Linux 上所有支持的模块。
- 列表:UEFI 安全引导施加的限制
23.4. 使用 X.509 密钥验证内核模块的要求
- 要点:查看使用 X.509 密钥验证内核模块的要求。内核根据可信密钥环验证模块签名,如 .builtin_trusted_keys 和 .platform,以根据 UEFI 安全引导配置强制安全策略。
- 要点:在 Red Hat Enterprise Linux 10 中,当加载内核模块时,内核会针对内核系统密钥环(.builtin_trusted_keys)和内核平台密钥环(.platform)中的公共 X.509 密钥检查模块的签名。.platform 密钥环从第三方平台提供商提供密钥和自定义公钥。内核系统 .blacklist 密钥环中的密钥不包括在验证中。
- 列表:如果启用了 UEFI 安全引导,或者指定了 module.sig_enforce 内核参数: 您只能加载那些签名的内核模块,它们的签名是针对系统密钥环(.builtin_trusted_keys)或平台密钥环(.platform)中的密钥进行验证的。 公钥不能在系统中被撤销的密钥环 (.blacklist)。
- 列表:您只能加载那些签名的内核模块,它们的签名是针对系统密钥环(.builtin_trusted_keys)或平台密钥环(.platform)中的密钥进行验证的。
- 列表:公钥不能在系统中被撤销的密钥环 (.blacklist)。
- 列表:如果禁用了 UEFI 安全引导且未指定 module.sig_enforce 内核参数: 您可以加载未签名的内核模块和签名的内核模块,而无需公钥。
- 列表:您可以加载未签名的内核模块和签名的内核模块,而无需公钥。
- 列表:如果系统不基于 UEFI,或者禁用 UEFI 安全引导: 只有内核中嵌入的密钥才会加载到 .builtin_trusted_keys 和 .platform。 您无法在不重新构建内核的情况下添加这组密钥。
- 表格样本(共 10 行):
- 模块已签名 | 找到公钥,且签名有效 | UEFI 安全引导状态 | sig_enforce | 模块载入 | 内核污点
- 未签名 | - | 未启用 | 未启用 | 成功 | 是
- 未启用 | Enabled | Fails | -
- Enabled | - | Fails | -
23.5. 公钥的源
- 要点:查看内核在启动过程中载入系统密钥环的 X.509 密钥源。内核使用这些密钥,这些密钥来自持久性存储,如 UEFI 数据库和 Machine Owner Key (MOK)列表,以验证模块和二进制文件的完整性。
- 列表:系统密钥环 (.builtin_trusted_keys)
- 列表:.platform 密钥环
- 列表:系统 .blacklist 密钥环
- 列表:在引导时构建的密钥环。
- 列表:提供可信的公钥。
- 列表:查看密钥需要 root 权限。
- 表格样本(共 8 行):
- X.509 密钥源 | 用户可以添加密钥 | UEFI 安全引导状态 | 引导过程中载入的密钥
- 嵌入于内核中 | 否 | - | .builtin_trusted_keys
- UEFI db | 有限 | 未启用 | 否
- Enabled | .platform
23.6. 生成公钥和私钥对
- 要点:要在安全引导系统上使用自定义内核或模块,请生成 X.509 密钥对。使用私钥签署内核或模块,并在 Machine Owner Key (MOK)列表中注册公钥进行验证。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:创建一个 X.509 公钥和私钥对。 如果您只想为自定义内核 模块 签名: # efikeygen --dbdir /etc/pki/pesign \ --self-sign \ --module \ --common-name 'CN=Organization signing key' \ --nickname 'Custom Secure Boot key' 如果要为自定义 内核 签名: # efikeygen --dbdir /etc/pki/pesign \ --self-sign \ --kernel \ --common-name 'CN=Organization signing key' \ --ni…
- 列表:如果您只想为自定义内核 模块 签名: # efikeygen --dbdir /etc/pki/pesign \ --self-sign \ --module \ --common-name 'CN=Organization signing key' \ --nickname 'Custom Secure Boot key'
- 列表:如果要为自定义 内核 签名: # efikeygen --dbdir /etc/pki/pesign \ --self-sign \ --kernel \ --common-name 'CN=Organization signing key' \ --nickname 'Custom Secure Boot key'
- 列表:当 RHEL 系统运行 FIPS 模式时: # efikeygen --dbdir /etc/pki/pesign \ --self-sign \ --kernel \ --common-name 'CN=Organization signing key' \ --nickname 'Custom Secure Boot key' \ --token 'NSS FIPS 140-2 Certificate DB' 注意 在 FIPS 模式下,您必须使用 --token 选项,以便 efikeygen 在 PKI 数据库中找到默认的"NSS Certificate DB"令牌。 公钥和私钥现在存储在 /etc/pki/pe…
- 列表:创建并管理 TLS 密钥和证书
- 命令/配置摘录:
# efikeygen --dbdir /etc/pki/pesign \ --self-sign \ --module \ --common-name 'CN=Organization signing key' \ --nickname 'Custom Secure Boot key'
# efikeygen --dbdir /etc/pki/pesign \ --self-sign \ --kernel \ --common-name 'CN=Organization signing key' \ --nickname 'Custom Secure Boot key'- 注意:注意 在 FIPS 模式下,您必须使用 --token 选项,以便 efikeygen 在 PKI 数据库中找到默认的"NSS Certificate DB"令牌。
- 注意:重要 好的安全实践是在签名密钥的有效周期内为内核和内核模块签名。但是,sign-file 工具不会警告您,且无论有效期如何,密钥都将在 Red Hat Enterprise Linux 10 中使用。
23.7. 系统密钥环输出示例
- 要点:您可以使用 keyutils 软件包中的 keyctl 实用程序显示系统密钥环中的密钥信息。
- 要点:以下是 .builtin_trusted_keys、.platform 和来自启用了 UEFI 安全引导的 Red Hat Enterprise Linux 10 系统的 .blacklist 密钥环的缩短的示例输出。
- 命令/配置摘录:
# keyctl list %:.builtin_trusted_keys
6 keys in keyring: ...asymmetric: Red Hat Enterprise Linux Driver Update Program (key 3): bf57f3e87... ...asymmetric: Red Hat Secure Boot (CA key 1): 4016841644ce3a810408050766e8f8a29... ...asymmetric: Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed... ...asymmetric: Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e... ...asymmetric: Red Hat Enterprise Linux kernel signing key: 4249689eefc77e95880b... ...asymmetric: Red Hat Enterprise Linux kpatch signing key: 4d38fd864ebe18c5f0b7...23.8. 通过在 MOK 列表中添加公钥在目标系统中注册公钥
- 要点:要访问内核或内核模块,您必须验证您的公钥。将密钥注册到目标系统的平台密钥环(.platform)。
- 要点:在统一可扩展固件接口(UEFI)安全引导系统上,内核会从 db 数据库导入密钥。它不会导入 dbx 数据库标记为已撤销的密钥。
- 列表:您已生成了一个公钥和私钥对,并了解公钥的有效日期。详情请参阅生成公钥和私钥对。
- 列表:将您的公钥导出到 sb_cert.cer 文件中: # certutil -d /etc/pki/pesign \ -n 'Custom Secure Boot key' \ -Lr \ > sb_cert.cer
- 列表:将您的公钥导入到 MOK 列表中: # mokutil --import sb_cert.cer
- 列表:输入此 MOK 注册请求的新密码。
- 列表:重启机器。 shim 引导装载程序会注意到待处理的 MOK 密钥注册请求,并启动 MokManager.efi,以使您从 UEFI 控制台完成注册。
- 列表:选择 Enroll MOK,在提示时输入之前与此请求关联的密码,并确认注册。 您的公钥已添加到 MOK 列表中,这是永久的。 密钥位于 MOK 列表中后,它会在启用 UEFI 安全引导时自动传播到此列表中的 .platform 密钥环,并在后续引导时自动传播到 .platform 密钥环。
- 命令/配置摘录:
# certutil -d /etc/pki/pesign \ -n 'Custom Secure Boot key' \ -Lr \ > sb_cert.cer
# mokutil --import sb_cert.cer- 注意:注意 要在您的系统上获得内核模块的身份验证服务,请考虑请求您的系统厂商将公钥合并到其工厂固件镜像中的 UEFI 安全引导密钥数据库中。
23.9. 使用私钥签名内核
- 要点:要在 UEFI 安全引导系统上增强系统安全性,请加载使用私钥签名的内核。
- 要点:先决条件
- 列表:您已生成了一个公钥和私钥对,并了解公钥的有效日期。详情请参阅生成公钥和私钥对。
- 列表:您已在目标系统上注册了公钥。详情请查看在 MOK 列表中添加公钥在目标系统中注册公钥。
- 列表:您有一个可用于签名的 ELF 格式的内核镜像。
- 列表:在 x64 构架上: 创建一个签名的镜像: # pesign --certificate 'Custom Secure Boot key' \ --in vmlinuz-version \ --sign \ --out vmlinuz-version.signed 使用 vmlinuz 文件的版本后缀替换 version,使用您之前选择的名称替换 Custom Secure Boot key 。 可选:检查签名: # pesign --show-signature \ --in vmlinuz-version.signed 使用签名镜像覆盖未签名的镜像: # mv vmlinuz-version.signed vmlinu…
- 列表:创建一个签名的镜像: # pesign --certificate 'Custom Secure Boot key' \ --in vmlinuz-version \ --sign \ --out vmlinuz-version.signed 使用 vmlinuz 文件的版本后缀替换 version,使用您之前选择的名称替换 Custom Secure Boot key 。
- 列表:可选:检查签名: # pesign --show-signature \ --in vmlinuz-version.signed
- 命令/配置摘录:
# pesign --certificate 'Custom Secure Boot key' \ --in vmlinuz-version \ --sign \ --out vmlinuz-version.signed
# pesign --show-signature \ --in vmlinuz-version.signed23.10. 使用私钥签名 GRUB 构建
- 要点:要在 UEFI 安全引导系统上使用自定义 GRUB 构建,请使用私钥对其进行签名。您需要它用于自定义构建,或者删除 Microsoft 信任锚。
- 要点:先决条件
- 列表:您已生成了一个公钥和私钥对,并了解公钥的有效日期。详情请参阅生成公钥和私钥对。
- 列表:您已在目标系统上注册了公钥。详情请查看在 MOK 列表中添加公钥在目标系统中注册公钥。
- 列表:您有一个可用于签名的 GRUB EFI 二进制文件。
- 列表:在 x64 构架上: 创建一个签名的 GRUB EFI 二进制文件: # pesign --in /boot/efi/EFI/redhat/grubx64.efi \ --out /boot/efi/EFI/redhat/grubx64.efi.signed \ --certificate 'Custom Secure Boot key' \ --sign 将 Custom Secure Boot key 替换为您之前选择的名称。 可选:检查签名: # pesign --in /boot/efi/EFI/redhat/grubx64.efi.signed \ --show-signature 使用签名的二进制文件覆盖未签名…
- 列表:创建一个签名的 GRUB EFI 二进制文件: # pesign --in /boot/efi/EFI/redhat/grubx64.efi \ --out /boot/efi/EFI/redhat/grubx64.efi.signed \ --certificate 'Custom Secure Boot key' \ --sign 将 Custom Secure Boot key 替换为您之前选择的名称。
- 列表:可选:检查签名: # pesign --in /boot/efi/EFI/redhat/grubx64.efi.signed \ --show-signature
- 命令/配置摘录:
# pesign --in /boot/efi/EFI/redhat/grubx64.efi \ --out /boot/efi/EFI/redhat/grubx64.efi.signed \ --certificate 'Custom Secure Boot key' \ --sign
# pesign --in /boot/efi/EFI/redhat/grubx64.efi.signed \ --show-signature- 注意:警告 当覆盖 grub 二进制文件时,您的系统可能无法正常引导,您可能需要从系统镜像重新安装 grub。
23.11. 使用私钥签名内核模块
- 要点:要增强 UEFI 安全引导系统的安全性,请加载使用私钥签名的内核模块。
- 要点:在禁用了 UEFI 安全引导的系统上或非 UEFI 系统上,您签名的内核模块也是可以加载的。因此,您不需要提供内核模块的签名的和未签名的版本。
- 列表:您已生成了一个公钥和私钥对,并了解公钥的有效日期。详情请参阅生成公钥和私钥对。
- 列表:您已在目标系统上注册了公钥。详情请查看在 MOK 列表中添加公钥在目标系统中注册公钥。
- 列表:您有一个可以签注的 ELF 镜像格式的内核模块。
- 列表:将您的公钥导出到 sb_cert.cer 文件中: # certutil -d /etc/pki/pesign \ -n 'Custom Secure Boot key' \ -Lr \ > sb_cert.cer
- 列表:从 NSS 数据库中提取密钥作为 PKCS #12 文件: # pk12util -o sb_cert.p12 \ -n 'Custom Secure Boot key' \ -d /etc/pki/pesign
- 列表:当上一个命令提示时,请输入新的加密私钥的密码。
- 命令/配置摘录:
# certutil -d /etc/pki/pesign \ -n 'Custom Secure Boot key' \ -Lr \ > sb_cert.cer
# pk12util -o sb_cert.p12 \ -n 'Custom Secure Boot key' \ -d /etc/pki/pesign- 注意:重要 确保未加密的私钥的安全。
- 注意:重要 在 Red Hat Enterprise Linux 10 中,密钥对的有效日期很重要。这个密钥没有过期,但必须在其签名密钥的有效周期内对内核模块进行签名。sign-file 实用程序不会提醒您这样做。 例如,一个只在 2021 年有效的密钥可用于验证在 2021 年使用该密钥签名的内核模块。但是,用户无法使用该密钥在 2022 年签发内核模块。
23.12. 载入经过签名的内核模块
- 要点:要载入签名的内核模块,请在平台密钥环和机器所有者密钥(MOK)列表中注册您的公钥,然后使用 modprobe 命令。
- 要点:先决条件
- 列表:您已生成了公钥和私钥对。详情请参阅生成公钥和私钥对。
- 列表:您已将公钥注册到平台密钥环中。详情请查看在 MOK 列表中添加公钥在目标系统中注册公钥。
- 列表:您用私钥签名了一个内核模块。详情请查看使用私钥签名内核模块。
- 列表:安装 kernel-modules-extra 软件包,它会创建 /lib/modules/$(uname -r)/extra/ 目录: # dnf -y install kernel-modules-extra
- 列表:验证您的公钥是否在平台密钥环中: # keyctl list %:.platform
- 列表:将内核模块复制到您想要的内核的 extra/ 目录中: # cp my_module.ko /lib/modules/$(uname -r)/extra/
- 命令/配置摘录:
# dnf -y install kernel-modules-extra
# keyctl list %:.platform第 24 章 更新安全引导撤销列表
- 要点:更新 UEFI 安全引导撤销列表,以识别具有已知安全问题的软件,并阻止它破坏引导过程。
24.1. 安全引导撤销列表
- 要点:UEFI 安全引导撤销列表或安全引导禁止签名数据库(dbx)是一个列表,其识别安全引导不再允许运行的软件。
- 要点:当在与安全引导(Secure Boot)接口的软件中发现安全问题或稳定性问题时,比如在 GRUB 引导装载程序中,撤销列表会存储其哈希签名。带有此类可识别签名的软件在引导过程中无法运行,系统引导无法防止损害系统。
24.2. 应用一个在线撤销列表更新
- 要点:要防止已知的安全问题,您可以更新系统上的安全引导撤销列表。这个过程是安全的,并确保更新不会阻止系统引导。
- 要点:先决条件
- 列表:安全引导已在您的系统上启用。
- 列表:您的系统已连接到互联网,以便获取更新。
- 列表:确定撤销列表的当前版本: # fwupdmgr get-devices 请参阅 UEFI dbx 下的 Current version 字段。
- 列表:启用 LVFS Revocation List 存储库: # fwupdmgr enable-remote lvfs
- 列表:刷新存储库元数据: # fwupdmgr refresh
- 列表:应用撤销列表更新: 在命令行上: # fwupdmgr update 在图形界面中: 打开 Software 应用程序 进入 Updates 选项卡。 查找 Secure Boot dbx Configuration Update 条目。 单击 Update。
- 命令/配置摘录:
# *fwupdmgr get-devices*
# *fwupdmgr enable-remote lvfs*24.3. 应用一个离线撤销列表更新
- 要点:要防止没有互联网连接的系统上已知的安全问题,您可以从 Red Hat Enterprise Linux 更新安全引导撤销列表。这个过程是安全的,并确保更新不会阻止系统引导。
- 要点:流程
- 列表:识别撤销列表的当前版本: # fwupdmgr get-devices 请参阅 UEFI dbx 下的 Current version 字段。
- 列表:列出 RHEL 中可用的更新: # ls /usr/share/dbxtool/
- 列表:为您的构架选择最新的更新文件。文件名采用以下格式: DBXUpdate-date-architecture.cab
- 列表:安装所选更新文件: # fwupdmgr install /usr/share/dbxtool/DBXUpdate-date-architecture.cab
- 列表:在更新结束时,fwupdmgr 会要求您重启系统。确认重启。
- 列表:重启后,再次检查撤销列表的当前版本: # fwupdmgr get-devices
- 命令/配置摘录:
# *fwupdmgr get-devices*
# *ls /usr/share/dbxtool/*第 25 章 启用 HTTPS 引导加密
- 要点:HTTPS 引导加密保护传输中的引导文件,并在网络引导过程中验证下载服务器。配置 UEFI 固件,以通过 HTTPS 下载内核和初始 RAM 文件系统(initramfs),并提供传输加密和签名验证。
25.1. RHEL 中的 HTTPS 引导加密
- 要点:HTTPS 引导加密通过 HTTPS 通过传输加密、数字签名验证和服务器身份验证下载内核和初始 RAM 文件系统(initramfs)。
- 要点:借助固件传输层安全性(TLS)支持和可信安全证书,您可以在系统中管理 HTTPS 引导加密。数字签名确保在固件加载下载的镜像前引导文件的完整性和可靠性。固件必须具有解密功能。普通 HTTP 引导不提供与 HTTPS 引导加密相同的传输保护。
- 列表:使用 HTTP 从网络引导安装
- 注意:注意 每个固件供应商都有自己的注册证书的步骤。请参考您的固件厂商文档来启用 HTTPS 引导加密。
25.2. 在 TianoCore 固件上配置 HTTPS 引导加密
- 要点:要为内核和初始 RAM 文件系统(initramfs)启用 UEFI HTTPS 引导,请配置 OVMF 或其他基于 TianoCore 的固件以通过 HTTPS 下载它们,设置引导源、注册证书颁发机构(CA)证书,并在引导顺序中放置 UEFI HTTPS 引导选项。
- 要点:先决条件
- 列表:您在系统中具有 root 权限。
- 列表:您已配置了 HTTPS 服务器,并为签名的内核和初始 RAM 文件系统镜像提供服务。
- 列表:您的 HTTPS 服务器上的 /etc/pki/ 目录中有一个 CA 证书文件。
- 列表:可选:您使用引导选项配置动态主机配置协议(DHCP)服务器,或者在固件中配置 HTTPS 引导服务器 URL。
- 列表:重启系统并打开 UEFI 固件设置: 注意 这些步骤为物理硬件和 Open Virtual Machine Firmware (OVMF)虚拟机提供单独的说明。仅遵循与您的平台匹配的选项。 在物理硬件中,按您的供应商在启动时文档的固件设置键。 在带有 Open Virtual Machine Firmware (OVMF)的虚拟机上,在启动时按 Esc。
- 列表:在物理硬件中,按您的供应商在启动时文档的固件设置键。
- 命令/配置摘录:
# openssl x509 -in <ca-certificate>.pem -outform DER -out <ca-certificate>.der- 注意:注意 这些步骤为物理硬件和 Open Virtual Machine Firmware (OVMF)虚拟机提供单独的说明。仅遵循与您的平台匹配的选项。
- 注意:警告 UEFI 设置不正确可能会阻止系统引导。在更改固件选项前,请查看您的硬件文档。
25.3. 在 QEMU 和 libvirt 上载入 HTTPS 引导加密的 CA 证书
- 要点:当您没有通过固件接口注册证书时,在 Quick EMUlator (QEMU)或 libvirt 虚拟机上加载 HTTPS 引导 CA 证书的 EFI 签名列表。
- 要点:先决条件
- 列表:您以 EFI 签名列表格式创建了一个根 CA 签名列表文件,扩展 .esl。
- 列表:在主机系统上具有 root 权限。
- 列表:虚拟机使用带有 HTTPS 引导支持的 Open Virtual Machine Firmware (OVMF)。
- 列表:使用以下方法之一载入 CA 证书: 对于 QEMU,在 qemu-system-x86_64 命令中添加以下参数: # qemu-system-x86_64 <existing-qemu-options> -fw_cfg name=etc/edk2/https/cacerts,file=<path-to-root-ca>.esl 对于 libvirt,在虚拟机配置的 domain 元素中添加以下 XML: <qemu:commandline> <qemu:arg value='-fw_cfg'/> <qemu:arg value='name=etc/edk2/https/cacerts,file=<path-to-root-c…
- 列表:对于 QEMU,在 qemu-system-x86_64 命令中添加以下参数: # qemu-system-x86_64 <existing-qemu-options> -fw_cfg name=etc/edk2/https/cacerts,file=<path-to-root-ca>.esl
- 列表:对于 libvirt,在虚拟机配置的 domain 元素中添加以下 XML: <qemu:commandline> <qemu:arg value='-fw_cfg'/> <qemu:arg value='name=etc/edk2/https/cacerts,file=<path-to-root-ca>.esl'/> </qemu:commandline> 重要 name 值必须是 etc/edk2/https/cacerts。这是 EDK2 如何标识 root CA 签名列表。
- 命令/配置摘录:
# qemu-system-x86_64 <existing-qemu-options> -fw_cfg name=etc/edk2/https/cacerts,file=<path-to-root-ca>.esl
<qemu:commandline> <qemu:arg value='-fw_cfg'/> <qemu:arg value='name=etc/edk2/https/cacerts,file=<path-to-root-ca>.esl'/> </qemu:commandline>- 注意:注意 签名列表文件包含 EFI 签名列表格式的 HTTPS 引导证书颁发机构证书。 当 HTTPS 服务器使用主机信任存储中的 CA 证书时,在主机上运行 update-ca-trust,并使用 /etc/pki/ca-trust/extracted/edk2/cacerts.bin 作为 fw_cfg 参数中的文件。 当使用专用 CA 证书时,在通过 fw_cfg 加载前,创建一个带有 .esl 扩展的 EFI 签名列表文件,该文件只包含那个证书。
- 注意:重要 name 值必须是 etc/edk2/https/cacerts。这是 EDK2 如何标识 root CA 签名列表。
第 26 章 使用内核完整性子系统提高安全性
- 要点:使用内核完整性子系统的组件来提高系统安全性。配置相关组件,如基于 IMA 签名的应用程序和远程测试。
26.1. 内核完整性子系统
- 要点:内核完整性子系统通过检测文件篡改并启用远程测试来保护系统的完整性。它包括完整性测量架构(IMA)和扩展验证模块(EVM)。
- 要点:IMA 维护文件内容的完整性。它包括您可以通过 IMA 策略启用的三个功能:
- 列表:IMA-Measurement :收集文件内容散列或签名,并将测量保存在内核中。如果有 TPM 可用,每个测量都会扩展 TPM PCR,它启用了认证引用的远程测试。
- 列表:IMA-Appraisal: 通过将计算的文件哈希与已知良好的参考值进行比较,或者验证存储在 security.ima 属性中的签名来验证文件的完整性。如果验证失败,系统会拒绝访问。
- 列表:IMA-Audit :将计算的文件内容散列或签名存储在系统审计日志中。
- 列表:安全强化
- 列表:使用 SELinux
26.2. 通过基于 IMA 的 appraisal 启用内核的运行时完整性监控
- 要点:为确保系统仅执行授权的软件包文件,请使用示例策略运行 ima-setup 命令来启用基于签名的 IMA appraisal。从 RHEL 9 中,红帽为每个文件签署所有软件包文件。
- 要点:流程
- 列表:运行 ima-setup 以启用基于签名的 IMA appraisal : # ima-setup --policy=/usr/share/ima/policies/01-appraise-executable-and-lib-signatures 这个命令: 将软件包文件签名存储在 security.ima 中,适用于所有安装的软件包。 包括 dracut integrity 模块,以将 IMA 代码签名密钥加载到内核。 将策略复制到 /etc/ima/ima-policy,以便 systemd 在引导时加载它。
- 列表:将软件包文件签名存储在 security.ima 中,适用于所有安装的软件包。
- 列表:包括 dracut integrity 模块,以将 IMA 代码签名密钥加载到内核。
- 列表:将策略复制到 /etc/ima/ima-policy,以便 systemd 在引导时加载它。
- 列表:ip 命令可以被成功执行。
- 列表:如果 ip 复制到 /tmp,默认情况下,它会丢失其 security.ima,因此 ip 命令不会被执行。 # cp /usr/sbin/ip /tmp # /tmp/ip bash: /tmp/ip: Permission denied # /tmp/ip doesn't have security.ima # getfattr -m security.ima -d /tmp/ip # whereas /usr/sbin/ip has # getfattr -m security.ima /usr/sbin/ip # file: usr/sbin/ip security.ima=0sAwIE0zIESQBnMGUCMQCLXZ…
- 命令/配置摘录:
# ima-setup --policy=/usr/share/ima/policies/01-appraise-executable-and-lib-signatures
# cp /usr/sbin/ip /tmp # /tmp/ip26.3. 使用 IMA 测量启用远程测试
- 要点:要使用远程测试工具(如 Keylime )验证系统完整性,请启用完整性测量架构(IMA)测量。签名的示例测量策略位于 /usr/share/ima/policies/02-keylime-remote-attestation。部署并运行符合您要求的策略。
- 要点:先决条件
- 列表:签名的测量策略位于 /usr/share/ima/policies/02-keylime-remote-attestation 中。
- 列表:安装 rpm-plugin-ima 软件包: # dnf install rpm-plugin-ima
- 列表:重新安装 ima-evm-utils 软件包,以便示例策略将 IMA 签名存储在扩展属性中: # dnf reinstall ima-evm-utils
- 列表:确认 IMA 签名已存储: # evmctl ima_verify -k /etc/keys/ima/redhatimarelease-10.der /usr/share/ima/policies/02-keylime-remote-attestation keyid d3320449 (from /etc/keys/ima/redhatimarelease-10.der) key 1: d3320449 /etc/keys/ima/redhatimarelease-10.der /usr/share/ima/policies/02-keylime-remote-attestation: verification is OK
- 列表:将保留扩展属性的签名的测量策略复制到 /etc/ima/ima-policy,以便 systemd 在引导时自动载入它: # cp --preserve=xattr /usr/share/ima/policies/02-keylime-remote-attestation /etc/ima/ima-policy
- 列表:启用 dracut 完整性模块,以便在引导时载入 IMA 密钥: # cp --preserve=xattr /usr/share/ima/dracut-98-integrity.conf /etc/dracut.conf.d/ima.conf
- 命令/配置摘录:
# dnf install rpm-plugin-ima
# dnf reinstall ima-evm-utils- 注意:警告 在启用了安全引导的系统中,内核不接受未签名的 IMA 策略。如果您在内核可用的 IMA 代码签名密钥前载入策略,则负载会失败,下一次重启可能会挂起。因此,您必须在密钥可用后载入策略。
第 27 章 扩展、自定义并故障排除内核完整性子系统
- 要点:扩展、自定义内核完整性子系统并对内核完整性子系统进行故障排除,以满足不同操作环境中的特定安全要求。
27.1. 为 IMA appraisal 生成良好的参考值
- 要点:在部署包含 IMA-appraisal 规则的 Integrity 测量架构(IMA)策略前,请确保这些规则管理的所有文件在 security.ima 扩展属性中都有有效的引用值。缺少引用值可能会阻止正确引导或拒绝访问文件。
- 命令/配置摘录:
# ima-appraise-file </path/to/file>27.1.1. 添加 IMA 签名作为不可变文件的良好引用
- 要点:要支持完整性验证,您可以使用 IMA 签名作为不可变文件的可信引用值。这种方法有助于确保仅访问具有有效签名的文件,从而增强系统安全性和合规性。
- 要点:先决条件
- 列表:您已创建了包含 IMA-appraisal 规则的 IMA 策略。
- 列表:安装 rpm-plugin-ima : $ sudo dnf install rpm-plugin-ima -yq 这样可确保软件包文件在软件包安装、重新安装或升级过程中自动存储在 security.xattr 中。
- 列表:重新安装所有软件包: $ sudo dnf reinstall "*" -y 这样可确保为所有软件包更新了 security.xattr 扩展属性。
- 列表:启用 dracut 完整性模块,以便在引导时自动在 /etc/keys/ima 载入中的官方 IMA code-signing 密钥: $ sudo dracut -f
- 列表:验证签名是否已正确存储在 security.ima 扩展属性中: $ # evmctl ima_verify -k /etc/keys/ima/redhatimarelease-10.der /usr/lib/systemd/systemd keyid d3320449 (from /etc/keys/ima/redhatimarelease-10.der) key 1: d3320449 /etc/keys/ima/redhatimarelease-10.der /usr/lib/systemd/systemd: verification is OK $ # evmctl ima_verify -k /etc/keys/ima/…
- 命令/配置摘录:
$ sudo dnf install rpm-plugin-ima -yq
$ sudo dnf reinstall "*" -y27.1.2. 为可变文件生成良好的参考值
- 要点:要保持可能随时间变化的文件的完整性,请根据需要生成和更新参考值。这样可确保系统准确验证可变文件的真实性,并防止未经授权的修改。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:您已创建了包含 IMA-appraisal 规则的 IMA 策略。
- 列表:您已为 IMA appraisal 生成了很好的参考值。
- 列表:禁用安全引导。
- 列表:可选:启用您选择的 IMA-appraisal 策略,或者如果您只使用自定义策略,请跳过这一步。使用内置 ima_policy=appraise_tcb 作为示例: # grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="ima_policy=appraise_tcb" 另外,s390x 系统: # zipl
- 列表:另外,s390x 系统: # zipl
- 命令/配置摘录:
# grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="ima_policy=appraise_tcb"
# zipl27.2. 编写自定义 IMA 策略
- 要点:如果内置的 IMA 策略来自内核参数,如 ima_policy=tcb 或 ima_policy=critical_data,或在 /usr/share/ima/policies/ 中生成示例策略,请不要满足您的要求,创建自定义 IMA 策略规则。当 systemd 加载 /etc/ima/ima-policy 时,它会替换内置的 IMA 策略。
- 要点:流程
- 列表:检查规则格式和示例策略。 IMA 策略规则使用格式 操作 [condition …] 指定在特定条件下触发的操作。例如,/usr/share/ima/policies/01-appraise-executable-and-lib-signatures 中的示例策略包括以下规则: # Skip some unsupported filesystems # For a list of these filesystems, see # https://www.kernel.org/doc/Documentation/ABI/testing/ima_policy # PROC_SUPER_MAGIC dont_appraise fsma…
- 列表:为 IMA appraisal 生成良好的参考值
- 命令/配置摘录:
# Skip some unsupported filesystems # For a list of these filesystems, see # https://www.kernel.org/doc/Documentation/ABI/testing/ima_policy # PROC_SUPER_MAGIC dont_appraise fsmagic=0x9fa0 … appraise func=BPRM_CHECK appraise_type=imasig- 注意:警告 定义 IMA 策略后,如果策略在部署前包含 IMA-appraisal 规则,请生成很好的引用值。如果您的策略不包含 IMA-appraisal 规则,您可以通过运行 echo /PATH-TO-YOUR-DRAFT-IMA-POLICY > /sys/kernel/security/integrity/ima/policy 来验证策略。这种方法有助于防止系统引导失败。 请参阅 为 IMA appraisal 生成良好的参考值。
27.3. 使用 OpenSSL 创建自定义 IMA 密钥
- 要点:要保护您的代码,请使用 OpenSSL 为您的数字证书生成证书签名请求(CSR)。
- 要点:内核搜索 .ima 密钥环中的代码签名密钥,以验证完整性测量架构(IMA)签名。在向 .ima keyring 中添加代码签名密钥前,您需要确保 IMA CA 密钥在 .builtin_trusted_keys 或 .secondary_trusted_keys keyring 中签名了这个密钥。
- 列表:自定义 IMA CA 密钥有以下扩展: 带有 CA 布尔值断言的基本约束扩展。 带有 keyCertSign 位断言的 KeyUsage 扩展,但 没有 digitalSignature 断言。
- 列表:带有 CA 布尔值断言的基本约束扩展。
- 列表:带有 keyCertSign 位断言的 KeyUsage 扩展,但 没有 digitalSignature 断言。
- 列表:自定义 IMA 代码签名密钥符合以下条件: IMA CA 密钥签名了这个自定义 IMA 代码签名密钥。 自定义密钥包括 subjectKeyIdentifier 扩展。
- 列表:IMA CA 密钥签名了这个自定义 IMA 代码签名密钥。
- 列表:自定义密钥包括 subjectKeyIdentifier 扩展。
- 命令/配置摘录:
# openssl req -new -x509 -utf8 -sha256 -days 3650 -batch -config ima_ca.conf -outform DER -out custom_ima_ca.der -keyout custom_ima_ca.priv
# cat ima_ca.conf27.4. 加载由自定义 IMA 密钥签名的 IMA 策略
- 要点:要保持您的系统完整性并满足机构的安全要求,您可以加载使用您自己的自定义 IMA 密钥签名的完整性测量架构(IMA)策略。这样可确保系统在启动或运行时只应用可信的、经过身份验证的策略。
- 要点:先决条件
- 列表:在您的系统中必须具有 root 权限。
- 列表:为 Red Hat Enterprise Linux 启用 UEFI 安全引导,或者内核使用 ima_policy=secure_boot 参数引导,以确保只能加载签名的 IMA 策略。
- 列表:自定义 IMA CA 密钥已添加到 MOK 列表中。如需更多信息,请参阅在 MOK 列表中添加公钥在目标系统上注册公钥。
- 列表:内核版本为 5.14 或更高版本。
- 列表:为 IMA 策略生成了很好的参考值。如需更多信息,请参阅 为 IMA appraisal 生成良好的参考值。
- 列表:将自定义 IMA 代码签名密钥添加到 .ima 密钥环中: # keyctl padd asymmetric <KEY_SUBJECT> %:.ima < <PATH_TO_YOUR_CUSTOM_IMA_KEY>
- 命令/配置摘录:
# keyctl padd asymmetric <KEY_SUBJECT> %:.ima < <PATH_TO_YOUR_CUSTOM_IMA_KEY>
# evmctl ima_sign <PATH_TO_YOUR_CUSTOM_IMA_POLICY> -k <PATH_TO_YOUR_CUSTOM_IMA_KEY>- 注意:注意 此流程只适用于启用了 UEFI 安全引导的 x86_64 和 aarch64 系统,以及运行 PowerVM 安全引导的 ppc64le 系统。
- 注意:警告 不要跳过这一步。如果这样做,您的系统可能无法引导,您需要恢复您的系统。
27.5. 对 systemd 无法加载 IMA 策略的故障排除
- 要点:当 systemd 没有加载 /etc/ima/ima-policy 时,系统会挂起并带有 systemd[1]: Freezing execution 错误消息。
- 要点:失败可能如下所示:
- 列表:关闭安全引导 :如果错误表示 UEFI 系统中缺少签名,则使用此方法。
- 列表:使用 init=/bin/bash启动 :使用此方法打开 shell 并修复策略文件。
- 列表:使用 initcall_blacklist=init_ima引导 :使用此方法启动禁用 IMA 的系统。
- 命令/配置摘录:
[ 5.829882] ima: policy update failed [ 5.830094] ima: signed policy file (specified as an absolute pathname) required [!!!!!!] Failed to load IMA policy. … [ 5.859994] systemd[1]: Freezing execution.27.5.1. 关闭安全引导
- 要点:如果策略缺少签名,内核会阻止它加载并记录特定的错误消息。
- 要点:作为临时解决方案,您可以临时关闭安全引导,并遵循 由自定义 IMA 密钥签名的 IMA 策略 来解决这个问题。
- 命令/配置摘录:
[ 5.661906] ima: policy update failed [ 5.662290] ima: signed policy file (specified as an absolute pathname) required [ 5.662496] systemd[1]: Failed to load the IMA custom policy file /etc/ima/ima-policy1: Permission denied [ 5.662663] ima: policy update failed [ 5.662856] audit: type=1800 audit(1744968172.925:7): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 op=appraise_data cause=IMA-signature-required comm="systemd" name="/etc/ima/ima-policy" dev="vda3" ino=25679834 res=0 errno=0 [ 5.663205] audit: type=1802 audit(1744968172.925:8): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 …27.5.2. 使用 init=/bin/bash 内核参数引导系统
- 要点:要使用 init=/bin/bash 内核参数启动系统,将其添加到引导装载程序条目中,并在恢复 shell 中运行所需的命令。然后您可以在正常重启前更正并验证 IMA 策略。
- 要点:流程
- 列表:修改引导装载程序条目并添加 init=/bin/bash 内核参数。 # grubby --update-kernel="$(grubby --default-kernel)" --args="init=/bin/bash"
- 列表:访问 shell 后,使用写权限重新挂载系统: # mount -o remount,rw /
- 列表:将 /etc/ima/ima-policy 重命名为 /etc/ima/ima-policy.bak : # mv /etc/ima/ima-policy /etc/ima/ima-policy.bak
- 列表:启用 SysRq magic 键: # echo 1 > /proc/sys/kernel/sysrq
- 列表:重启系统: # printf "s\nb" > /proc/sysrq-trigger
- 列表:解决 /etc/ima/ima-policy.bak 中的任何问题,并验证是否可以载入该策略: # echo /etc/ima/ima-policy.bak >> /sys/kernel/security/integrity/ima/policy
- 命令/配置摘录:
# grubby --update-kernel="$(grubby --default-kernel)" --args="init=/bin/bash"
# mount -o remount,rw /27.5.3. 使用 initcall_blacklist=init_ima 内核参数引导系统
- 要点:要在系统挂起时,使用 initcall_blacklist=init_ima 内核参数启动系统 [1]: Freezing execution,将参数添加到引导装载程序条目中,并运行所需的命令。然后您可以在正常重启前更正并验证 IMA 策略。
- 要点:流程
- 列表:修改引导装载程序条目并添加 initcall_blacklist=init_ima 内核参数。 # grubby --update-kernel="$(grubby --default-kernel)" --args="initcall_blacklist=init_ima"
- 列表:将 /etc/ima/ima-policy 重命名为 /etc/ima/ima-policy.bak : # mv /etc/ima/ima-policy /etc/ima/ima-policy.bak
- 列表:重启系统: # systemctl reboot
- 列表:解决 /etc/ima/ima-policy.bak 中的任何问题,并验证是否可以载入该策略: # echo /etc/ima/ima-policy.bak >> /sys/kernel/security/integrity/ima/policy
- 列表:将 /etc/ima/ima-policy.bak 重命名为 /etc/ima/ima-policy: # mv /etc/ima/ima-policy.bak /etc/ima/ima-policy
- 命令/配置摘录:
# grubby --update-kernel="$(grubby --default-kernel)" --args="initcall_blacklist=init_ima"
# mv /etc/ima/ima-policy /etc/ima/ima-policy.bak27.6. 签名自定义构建的软件包
- 要点:为保持系统的完整性,在部署前务必要为自定义构建的软件包签名。使用 rpm-sign 工具和 IMA 代码签名密钥,您可以签署您的自定义构建软件包。
- 要点:先决条件
- 列表:您在系统中具有 root 权限。
- 列表:您有一个要签名的自定义构建软件包。
- 列表:您有 IMA 代码签名密钥。
- 列表:已安装 rpm-sign 工具。
- 列表:创建自定义 IMA 密钥。请参阅使用 OpenSSL 创建自定义 IMA 密钥。
- 列表:使用 rpmsign -signfiles 为软件包文件签名: # rpmsign --define "gpg_name _<GPG_KEY_NAME>" --addsign --signfiles --fskpass --fskpath=<PATH_TO_YOUR_PRIVATE_IMA_CODE_SIGNING_KEY> <PATH_TO_YOUR_RPM> --define "gpg_name _<GPG_KEY_NAME>" GPG 密钥为软件包签名,IMA 代码签名密钥签署软件包中的每个文件。 --addsign 在软件包中添加签名。 --signfiles 对软件包中的每个文件进行签名。 --fskpass 避免重复输…
- 命令/配置摘录:
# rpmsign --define "gpg_name _<GPG_KEY_NAME>" --addsign --signfiles --fskpass --fskpath=<PATH_TO_YOUR_PRIVATE_IMA_CODE_SIGNING_KEY> <PATH_TO_YOUR_RPM>
# rpm -q --queryformat "[%{FILENAMES} %{FILESIGNATURES}\n] <PATH_TO_YOUR_RPM>"27.7. 在 IMA 和 fapolicyd 间选择
- 要点:IMA 和 fapolicyd 是两个不同的工具,用于强制文件的完整性。IMA 是一个内核模块,它通过在引导时验证文件的完整性来强制实施文件完整性。fapolicyd 是一个守护进程,它通过在运行时验证文件的完整性来强制实施文件完整性。
- 要点:以下列表可帮助您确定哪个工具满足您的要求:
- 列表:IMA 验证数字签名以确保完整性,而 fapolicyd 目前只支持基于哈希的验证。
- 列表:IMA 在内核空间中运行,fapolicyd 在用户空间中运行。
- 列表:fapolicyd 通过检查文件大小来支持基本的完整性验证,也可以验证存储在 security.ima 中的引用哈希值。
- 列表:IMA 和 fapolicyd 使用不同的策略语法。例如,fapolicyd 支持基于路径的策略,但 IMA 不支持。
第 28 章 使用 systemd 管理应用程序使用的资源
- 要点:Red Hat Enterprise Linux 10 将 cgroup 层次结构绑定到 systemd 单元树,将资源管理从进程移到应用程序。使用 systemctl 或 systemd 单元文件管理资源。systemd 使用内核系统调用、cgroups 和命名空间将配置应用到进程组。
- 注意:注意 您可以在以下手册页中查看 systemd 的完整配置选项: systemd.resource-control (5) systemd.exec (5)
28.1. 资源管理中的 systemd 角色
- 要点:systemd 系统和服务管理器为系统服务和应用程序提供服务管理、监管和资源管理功能。
- 要点:systemd 系统和服务管理器:
- 列表:确保受管服务在正确时间启动,并在启动过程中按正确的顺序启动。
- 列表:确保受管服务平稳运行,以最优地使用底层硬件平台。
- 列表:提供定义资源管理策略的能力。
- 列表:提供调整各种选项的能力,这可以提高服务的性能。
- 注意:重要 通常,建议您使用 systemd 来控制系统资源的使用。除非是特殊情况,否则不得手动配置 cgroups 虚拟文件系统。
28.2. 系统源的分发模型
- 要点:要控制系统资源使用情况,请应用分布模型,如权重、限值和保护。这些设置决定了 CPU 和内存等资源如何在控制组(cgroups)中共享。
- 要点:系统源的分发模型包括以下选项:
28.3. 使用 systemd 分配系统资源
- 要点:使用 systemd 分配系统资源涉及创建和管理 systemd 服务和单元。您可以将它们配置为在特定时间启动、停止或重启,或者响应某些系统事件。您可以更改服务的单元文件选项,或使用 systemctl 命令。
- 要点:流程
- 列表:使用 systemctl 命令。 检查为您选择的服务分配的值: # systemctl show --property <unit file option> <service name> 设置 CPU 时间分配策略选项的必要值: # systemctl set-property <service name> <unit file option>=<value> 如需更多信息,请参阅 systemd.resource-control (5) 和 systemd.exec (5) 手册页。
- 列表:检查为您选择的服务分配的值: # systemctl show --property <unit file option> <service name>
- 列表:设置 CPU 时间分配策略选项的必要值: # systemctl set-property <service name> <unit file option>=<value> 如需更多信息,请参阅 systemd.resource-control (5) 和 systemd.exec (5) 手册页。
- 列表:检查为您选择的服务新分配的值: # systemctl show --property <unit file option> <service name>
- 命令/配置摘录:
# systemctl show --property <unit file option> <service name>
# systemctl set-property <service name> <unit file option>=<value>28.4. cgroups 的 systemd 层次结构概述
- 要点:systemd 使用 slice、scope 和 service 单元在控制组中组织进程。您可以通过创建自定义单元文件或使用 systemctl 来修改此层次结构。systemd 自动挂载在 /sys/fs/cgroup/ 中的控制器层次结构。
- 要点:对于资源控制,您可以使用以下三种 systemd 单元类型:
- 列表:使用 systemctl 管理系统服务
- 列表:内核资源控制器简介
- 命令/配置摘录:
<name>.service
<name>.scope28.5. 列出 systemd 单元
- 要点:要列出 systemd 单元,请使用 system 和 service manager 命令。
- 要点:流程
- 列表:使用 systemctl 工具列出系统上所有活动的单元。在命令行中看到类似以下示例的输出: # systemctl UNIT LOAD ACTIVE SUB DESCRIPTION ... init.scope loaded active running System and Service Manager session-2.scope loaded active running Session 2 of user jdoe abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active runni…
- 列表:列出所有活跃的和不活跃的单元: # systemctl --all
- 列表:限制输出中的信息量: # systemctl --type service,masked --type 选项需要一个以逗号分隔的单元类型列表,如 service 和 slice,或者单元载入状态,如 loaded 和 masked。 如需更多信息,请参阅系统上的 systemd.resource-control (5) 和 systemd.exec (5) 手册页。
- 列表:使用 systemctl 管理系统服务
- 命令/配置摘录:
# systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION ... init.scope loaded active running System and Service Manager session-2.scope loaded active running Session 2 of user jdoe abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrt-vmcore.service loaded active exited Harvest vmcores for ABRT abrt-xorg.service loaded active running ABRT Xorg log watcher ... -.slice loaded active active Root Slice machine.slice loaded active active Virtual Machine and Container Slice system-getty.slice loaded active active system-getty.slice system-lvm2\x2dpvscan.slice loaded active active system-lvm…28.6. 查看 systemd cgroups 层次结构
- 要点:显示控制组(cgroups)层次结构和在特定 cgroup 中运行的进程。
- 要点:流程
- 列表:使用 systemd-cgls 命令显示您系统上的整个 cgroups 层次结构。 # systemd-cgls Control group /: -.slice ├─user.slice │ ├─user-42.slice │ │ ├─session-c1.scope │ │ │ ├─ 965 gdm-session-worker [pam/gdm-launch-environment] │ │ │ ├─1040 /usr/libexec/gdm-x-session gnome-session --autostart /usr/share/gdm/greeter/autostart ... ├─init.scope │ └─1 …
- 列表:使用 systemd-cgls <resource_controller> 命令显示 由资源控制器过滤的 cgroups 层次结构。 # systemd-cgls memory Controller memory; Control group /: ├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 18 ├─user.slice │ ├─user-42.slice │ │ ├─session-c1.scope │ │ │ ├─ 965 gdm-session-worker [pam/gdm-launch-environment] ... └─sy…
- 列表:使用 systemctl status <system_unit > 命令显示特定单元及其 cgroups 层次结构的一部分的详细信息。 # systemctl status example.service ● example.service - My example service Loaded: loaded (/usr/lib/systemd/system/example.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2019-04-16 12:12:39 CEST; 3s ago Main PID: 1773…
- 命令/配置摘录:
# systemd-cgls
Control group /: -.slice ├─user.slice │ ├─user-42.slice │ │ ├─session-c1.scope │ │ │ ├─ 965 gdm-session-worker [pam/gdm-launch-environment] │ │ │ ├─1040 /usr/libexec/gdm-x-session gnome-session --autostart /usr/share/gdm/greeter/autostart ... ├─init.scope │ └─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 18 └─system.slice ... ├─example.service │ ├─6882 /bin/bash /home/jdoe/example.sh │ └─6902 sleep 1 ├─systemd-journald.service └─629 /usr/lib/systemd/systemd-journald ...28.7. 查看进程的 cgroup
- 要点:进程属于 控制组 (cgroup)。/proc/PID/cgroup 记录其 cgroup 路径,控制器加上控制器的配置文件出现在 /sys/fs/cgroup/ 的匹配路径下。
- 要点:流程
- 列表:要查看某个进程所属的 cgroup,请运行 # cat /proc/<PID>/cgroup 命令: # cat /proc/2467/cgroup 0::/system.slice/example.service 输出示例与关注进程相关。在这种情况下,它是由 PID 2467 来标识的进程,它属于 example.service 单元。您可以检查该过程是否放置在 systemd 单元文件规格定义的正确控制组中。
- 列表:显示 cgroup 使用哪些控制器: # cat /sys/fs/cgroup/system.slice/example.service/cgroup.controllers memory pids
- 列表:列出 example.service cgroup 目录中的配置文件和其他 cgroup 文件: # ls /sys/fs/cgroup/system.slice/example.service/ cgroup.controllers cgroup.events ... cpu.pressure cpu.stat io.pressure memory.current memory.events ... pids.current pids.events pids.max cgroup 版本 1 层次结构使用每个控制器模型。因此,/proc/PID/cgroup 文件中的输出显示 PID 所属的每个控制器下的 cgroups。您可以在…
- 列表:内核资源控制器简介
- 命令/配置摘录:
# cat /proc/2467/cgroup
0::/system.slice/example.service28.8. 监控资源消耗
- 要点:要查看运行控制组(cgroups)及其实时资源消耗的列表,请使用监控工具。
- 要点:流程
- 列表:使用 systemd-cgtop 命令显示当前运行的 cgroup 的动态帐户: # systemd-cgtop Control Group Tasks %CPU Memory Input/s Output/s / 607 29.8 1.5G - - /system.slice 125 - 428.7M - - /system.slice/ModemManager.service 3 - 8.6M - - /system.slice/NetworkManager.service 3 - 12.8M - - /system.slice/accounts-daemon.service 3 - 1.8M - - /system.slic…
- 命令/配置摘录:
# systemd-cgtop
Control Group Tasks %CPU Memory Input/s Output/s / 607 29.8 1.5G - - /system.slice 125 - 428.7M - - /system.slice/ModemManager.service 3 - 8.6M - - /system.slice/NetworkManager.service 3 - 12.8M - - /system.slice/accounts-daemon.service 3 - 1.8M - - /system.slice/boot.mount - - 48.0K - - /system.slice/chronyd.service 1 - 2.0M - - /system.slice/cockpit.socket - - 1.3M - - /system.slice/colord.service 3 - 3.5M - - /system.slice/crond.service 1 - 1.8M - - /system.slice/cups.service 1 - 3.1M - - /system.slice/dev-hugepages.mount - - 244.0K - - /system.slice/dev-mapper-rhel\x2dswap.swap - - 912.0K - - /system.slice/dev-mqueue.mount - - 48.0K - - …28.9. 使用 systemd 单元文件为应用程序设置限制
- 要点:通过修改 systemd 单元文件为应用程序设置资源限值。配置内存、CPU 或其他资源限制以控制应用程序如何使用系统资源。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:编辑 /usr/lib/systemd/system/example.service 文件,来限制服务的内存使用: … [Service] MemoryMax=1500K … 配置限制控制组中的进程不能超过的最大内存。example.service 服务是此类控制组群的一部分,它有一定的限制。使用后缀 K、M、G 或 T 将 Kilobyte、Megabyte、Gigabyte 或 Terabyte 作为一个测量单位。
- 列表:重新载入所有单元配置文件: # systemctl daemon-reload
- 列表:重启服务: # systemctl restart example.service
- 列表:检查更改是否生效: # cat /sys/fs/cgroup/system.slice/example.service/memory.max 1536000 此输出显示内存消耗被限制在大约 1,500 KB。
- 列表:使用 systemctl 管理系统服务
- 命令/配置摘录:
… [Service] MemoryMax=1500K …
# systemctl daemon-reload28.10. 使用 systemctl 命令为应用程序设置 CPU 关联性
- 要点:CPU 关联性设置将特定进程的访问限制到某些 CPU。实际上,CPU 调度程序永远不会将进程调度到不在进程的关联性掩码中的 CPU 上运行。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:检查服务的 CPUAffinity 值: 默认 CPU 关联性掩码适用于所有 systemd 服务。要为一个服务设置关联性,请将 CPUAffinity= 单元文件选项与 systemctl set-property 一起使用。选项接受 systemd 合并到关联性掩码中的 CPU 或 CPU 范围列表。您还可以在 /etc/systemd/system.conf 的 [Manager] 部分中配置全局默认值。 $ systemctl show --property CPUAffinity <service name>
- 列表:以 root 用户身份,为用作关联性掩码的 CPU 范围设置 CPUAffinity 值: # systemctl set-property <service name> CPUAffinity=<value>
- 列表:重启服务以应用更改: # systemctl restart <service name>
- 列表:通过管理器配置设置全局默认 CPU 关联性
- 命令/配置摘录:
$ systemctl show --property CPUAffinity <service name>
# systemctl set-property <service name> CPUAffinity=<value>28.11. 通过管理器配置设置全局默认 CPU 关联性
- 要点:要设置全局默认 CPU 关联性,请在 /etc/systemd/system.conf 中配置 CPUAffinity 选项。这适用于 PID 1 及其子进程,但您可以覆盖每个服务的设置。
- 要点:使用 /etc/systemd/system.conf 文件为所有 systemd 服务设置默认 CPU 关联性掩码。
- 列表:在 /etc/systemd/system.conf 文件的 [Manager] 部分中设置 CPUAffinity= 选项的 CPU 号。
- 列表:保存编辑的文件并重新载入 systemd 服务: # systemctl daemon-reload
- 列表:重启服务器以应用更改。 详情请查看系统中的 systemd.resource-control (5) 手册页。
- 命令/配置摘录:
# systemctl daemon-reload28.12. 使用 systemd 配置 NUMA 策略
- 要点:要优化非统一内存访问(NUMA)系统上的应用程序的内存访问性能,请使用 systemd 单元文件为服务配置 NUMA 策略。
- 要点:在 NUMA 系统中,接近 CPU 的内存的延迟(本地内存)比不同 CPU 的本地内存低得多,或者在一组 CPU 之间共享。
- 列表:通过 NUMAPolicy 单元文件选项设置 NUMA 内存策略。 为您选择的服务检查 NUMAPolicy 单元文件选项的值: $ systemctl show --property <NUMA policy configuration option> <service name> 作为根目录,设置 NUMAPolicy 单元文件选项所需的策略类型: # systemctl set-property <service name> NUMAPolicy=<value>
- 列表:为您选择的服务检查 NUMAPolicy 单元文件选项的值: $ systemctl show --property <NUMA policy configuration option> <service name>
- 列表:作为根目录,设置 NUMAPolicy 单元文件选项所需的策略类型: # systemctl set-property <service name> NUMAPolicy=<value>
- 列表:重启服务以应用更改: # systemctl restart <service name>
- 列表:systemd 的 NUMA 策略配置选项
- 命令/配置摘录:
$ systemctl show --property <NUMA policy configuration option> <service name>
# systemctl set-property <service name> NUMAPolicy=<value>- 注意:重要 当您配置严格的 NUMA 策略时,例如 bind,请确保您也正确地设置了 CPUAffinity= 单元文件选项。
28.13. systemd 的 NUMA 策略配置选项
- 要点:进程的非统一内存访问(NUMA)策略包括 NUMAPolicy 和 NUMAMask。策略类型和节点列表决定了系统如何控制内存分配。
- 要点:NUMA 策略的 systemd 单元选项包括:
- 列表:default
- 列表:preferred
- 列表:bind
- 列表:interleave
- 列表:local
- 列表:local 对于首选策略,列表仅指定单个 NUMA 节点。
28.14. 使用 systemd-run 命令创建临时 cgroup
- 要点:要在运行时限制服务或范围消耗的资源,请使用临时控制组(cgroups)。
- 要点:流程
- 列表:要创建一个临时控制组群,使用以下格式的 systemd-run 命令: # systemd-run --unit=<name> --slice=<name>.slice <command> 此命令会创建并启动临时服务或范围单元,并在此类单元中运行自定义命令。 --unit=<name> 选项为单元取一个名称。如果未指定 --unit,则会自动生成名称。 --slice=<name>.slice 选项使您的服务或范围单元成为指定片段的成员。将 <name>.slice 替换为现有片段的名称(如 systemctl -t slice 输出中所示),或通过传递唯一名称来创建新片段。默认情况下,服务和范围作为 system.slice 的…
- 列表:--unit=<name> 选项为单元取一个名称。如果未指定 --unit,则会自动生成名称。
- 列表:--slice=<name>.slice 选项使您的服务或范围单元成为指定片段的成员。将 <name>.slice 替换为现有片段的名称(如 systemctl -t slice 输出中所示),或通过传递唯一名称来创建新片段。默认情况下,服务和范围作为 system.slice 的成员创建。
- 列表:使用您要在服务或范围单元中输入的命令替换 <command>。 此时会显示以下信息,以确认您已创建并启动了该服务,或者已成功启动范围: # Running as unit <name>.service
- 列表:可选 :在其进程完成后保持单元运行,以收集运行时信息: # systemd-run --unit=<name> --slice=<name>.slice --remain-after-exit <command> 命令会创建并启动临时服务单元,并在单元中运行自定义命令。--remain-after-exit 选项可确保服务在其进程完成后继续运行。
- 命令/配置摘录:
# systemd-run --unit=<name> --slice=<name>.slice <command>
# Running as unit <name>.service28.15. 删除临时控制组群
- 要点:要在不再需要时删除临时控制组(cgroups),请使用 systemd 系统和服务管理器。
- 要点:当服务或范围单元包含完成的所有进程时,临时 cgroup 会被自动释放。
- 列表:要停止带有所有进程的服务单元,请输入: # systemctl stop <name>.service
- 列表:要终止一个或多个单元进程,请输入: # systemctl kill <name>.service --kill-who=PID,… --signal=<signal> 命令使用 --kill-who 选项从您要终止的控制组中选择进程。要同时终止多个进程,请传递以逗号分隔的 PID 列表。--signal 决定要发送到指定进程的 POSIX 信号的类型。默认信号是 SIGTERM。
- 列表:控制组简介
- 列表:内核资源控制器简介
- 列表:使用 systemd 单元文件自定义和优化您的系统
- 命令/配置摘录:
# systemctl stop <name>.service
# systemctl kill <name>.service --kill-who=PID,… --signal=<signal>第 29 章 使用控制组群为应用程序设置系统资源限制
- 要点:使用控制组(cgroups)内核功能来控制应用资源使用情况。设置系统资源分配限制,确定特定进程的硬件资源优先级,并隔离进程获取硬件资源。
29.1. 控制组简介
- 要点:使用控制组 Linux 内核功能,您可以将进程组织为分层排序的组,称为 cgroups。您可以通过向 cgroups 虚拟文件系统提供结构来定义层次结构,并默认挂载到 /sys/fs/cgroup/ 目录中。
- 要点:systemd 服务管理器使用 cgroups 来组织它管理的所有单元和服务。手动,您可以通过创建和删除 /sys/fs/cgroup/ 目录中的子目录来管理 cgroup 层次结构。
- 列表:CPU 时间
- 列表:内存
- 列表:网络带宽
- 列表:这些资源的组合
- 列表:内核资源控制器简介
- 注意:重要 默认情况下,RHEL 10 挂载并使用 cgroups-v2。
29.2. 内核资源控制器简介
- 要点:内核资源控制器提供控制组群的功能。RHEL 10 支持用于 控制组版本 1 (cgroups-v1)和 控制组版本 2 (cgroups-v2)的各种控制器。
- 要点:资源控制器也称为控制组子系统,是一个代表单一资源的内核子系统,如 CPU 时间、内存、网络带宽或磁盘 I/O。Linux 内核提供由 systemd 服务管理器自动挂载的一组资源控制器。
- 列表:blkio :设置对块设备的输入/输出访问的限制。
- 列表:CPU :调整控制组任务的默认调度程序的参数。cpu 控制器与 cpuacct 控制器一起挂载在同一挂载上。
- 列表:cpuacct :创建控制组中任务使用的 CPU 资源自动报告。cpuacct 控制器与 cpu 控制器一起挂载在同一挂载上。
- 列表:cpuset:Restricts 控制组任务仅在指定 CPU 子集上运行,并指示任务仅在指定的内存节点上使用内存。
- 列表:设备 :控制对控制组中任务的访问。
- 列表:freezer :暂停或恢复控制组中的任务。
- 注意:重要 资源控制器可以在 cgroups-v1 层次结构或 cgroups-v2 层次结构中使用,不能同时在两者中使用。
29.3. 命名空间简介
- 要点:命名空间为组织和识别软件对象创建单独的空间。这使得它们不会相互影响。因此,每个软件对象都包含自己的一组资源,如挂载点、网络设备或主机名,即使它们共享相同的系统。
- 要点:使用命名空间的最常见技术是容器。
- 表格样本(共 8 行):
- Namespace | Isolates
- Mount | 挂载点
- UTS | 主机名和 NIS 域名
- IPC | SysV IPC, POSIX 消息队列
第 30 章 使用 cgroupfs 手动管理 cgroup
- 要点:通过在 cgroup fs 虚拟文件系统上创建目录来管理 cgroup 层次结构,该目录默认挂载到 /sys/fs/cgroup/。在专用控制文件中指定所需的配置。
- 注意:注意 cgroups-v1 支持被 systemd 弃用,因此 cgroup-v1 将从以后的 Red Hat Enterprise Linux 10 版本中删除。在以后的 RHEL 10 版本中必须使用 cgroups-v2。
- 注意:重要 您必须使用 systemd 来控制系统资源的使用。除非是特殊情况,否则不得手动配置 cgroups 虚拟文件系统。
30.1. 在 cgroups-v2 文件系统中创建 cgroup 和启用控制器
- 要点:要管理控制组(cgroups),请在 cgroups 虚拟文件系统中创建和删除目录,通常是位于 /sys/fs/cgroup/。要使用控制器设置,请为子 cgroups 启用它们。至少创建两级子 cgroup,以组织文件并优化控制器使用量。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:创建 /sys/fs/cgroup/Example/ 目录: # mkdir /sys/fs/cgroup/Example/ /sys/fs/cgroup/Example/ 目录定义一个子组。当您创建 /sys/fs/cgroup/Example/ 目录时,目录中会自动创建一些 cgroups-v2 接口文件。/sys/fs/cgroup/Example/ 目录还包含 memory 和 pids 控制器的特定于控制器的文件。
- 列表:可选:检查新创建的子控制组: # ll /sys/fs/cgroup/Example/ -r--r--r--. 1 root root 0 Jun 1 10:33 cgroup.controllers -r--r--r--. 1 root root 0 Jun 1 10:33 cgroup.events -rw-r--r--. 1 root root 0 Jun 1 10:33 cgroup.freeze -rw-r--r--. 1 root root 0 Jun 1 10:33 cgroup.procs ... -rw-r--r--. 1 root root 0 Jun 1 10:33 cgroup.subtree_contro…
- 列表:验证 /sys/fs/cgroup/cgroup.controllers 文件中是否有所需的控制器: # cat /sys/fs/cgroup/cgroup.controllers cpuset cpu io memory hugetlb pids rdma
- 列表:启用所需的控制器。在本例中是 cpu 和 cpuset 控制器: # echo "+cpu" >> /sys/fs/cgroup/cgroup.subtree_control # echo "+cpuset" >> /sys/fs/cgroup/cgroup.subtree_control 这些命令为 /sys/fs/cgroup/ root 控制组的直接子组启用 cpu 和 cpuset 控制器。这包括新创建的 Example 控制组。子组 是可以指定进程,并根据标准对每个进程应用控制检查的位置。 用户可以在任何级别上读取 cgroup.subtree_control 文件的内容,以了解哪些控制器可在直接子组中启用。 注意 默认…
- 列表:为 Example 控制组群的子 cgroup 启用所需的 控制器: # echo "+cpu +cpuset" >> /sys/fs/cgroup/Example/cgroup.subtree_control 这些命令可确保,直接的子组仅具有与 CPU 时间分发相关的控制器,而不是 memory 或 pids 控制器。
- 命令/配置摘录:
# mkdir /sys/fs/cgroup/Example/
# ll /sys/fs/cgroup/Example/- 注意:注意 默认情况下,根控制组中的 /sys/fs/cgroup/cgroup.subtree_control 文件包含 memory 和 pids 控制器。
- 注意:重要 cpu 控制器只有在相关子控制组至少有 2 个在单个 CPU 上竞争时间的进程时,才会被激活 。
30.2. 通过调整 CPU 权重来控制应用程序的 CPU 时间分布
- 要点:为了规范应用程序的 CPU 时间分布,请将权重分配给 cgroup 树中 cpu 控制器的相关文件。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:您有要控制 CPU 时间分布的应用程序。
- 列表:您已挂载了 cgroups-v2 文件系统。
- 列表:您在 /sys/fs/cgroup/ 根控制组 中创建了两级 子控制组,如下例所示: ... ├── Example │ ├── g1 │ ├── g2 │ └── g3 ...
- 列表:您已在父控制组和子控制组中启用 cpu 控制器,类似于在 cgroups-v2 文件系统中创建 cgroups 并启用控制器。
- 列表:配置所需的 CPU 权重,以便在控制组内实现资源限制: # echo "150" > /sys/fs/cgroup/Example/g1/cpu.weight # echo "100" > /sys/fs/cgroup/Example/g2/cpu.weight # echo "50" > /sys/fs/cgroup/Example/g3/cpu.weight
- 命令/配置摘录:
... ├── Example │ ├── g1 │ ├── g2 │ └── g3 ...
# echo "150" > /sys/fs/cgroup/Example/g1/cpu.weight # echo "100" > /sys/fs/cgroup/Example/g2/cpu.weight # echo "50" > /sys/fs/cgroup/Example/g3/cpu.weight- 注意:重要 如果子 cgroup 有多个正在运行的进程,则分配给 cgroup 的 CPU 时间会在其成员进程间平均分配。
- 注意:注意 为了清楚地说明,所有进程都在单个 CPU 上运行。当在多个 CPU 上使用时,CPU 权重应用相同的原则。
- 表格样本(共 4 行):
- 子 cgroup | cpu.weight 文件 | CPU 时间分配
- g1 | 150 | ~50% (150/300)
- g2 | 100 | ~33% (100/300)
- g3 | 50 | ~16% (50/300)
第 31 章 使用 eBPF 分析系统性能
- 要点:使用 bpftrace 和 BPF Compiler Collection (BCC)库创建用于分析 Linux 系统性能的工具,并收集难以通过其他接口获取的信息。
31.1. 使用 bpftrace 软件包
- 要点:bpftrace 是 Red Hat Enterprise Linux 系统的一个功能强大的追踪工具,它使用扩展 Berkeley Packet Filter (eBPF)技术。使用 bpftrace,您可以在不修改内核代码的情况下动态跟踪和分析内核和用户空间事件。
- 要点:流程
- 列表:安装 bpftrace 软件包: $ sudo dnf install bpftrace
- 列表:运行测试: $ sudo bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @ = count(); } interval:s:1 { print(@); clear(@); }' 此命令通过观察系统调用的速率来显示系统活动的高级概述。 您现在准备使用 bpftrace。您可以浏览 /usr/share/bpftrace/tools/ 处的示例脚本,在线学习脚本,或创建自己的脚本来跟踪事件并分析系统行为。
- 列表:bpftrace
- 列表:一行命令示例
- 列表:官方工具
- 列表:用户工具
- 命令/配置摘录:
$ sudo dnf install bpftrace
$ sudo bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @ = count(); } interval:s:1 { print(@); clear(@); }'31.2. 安装 bcc-tools 软件包
- 要点:安装 bcc-tools 软件包,该软件包还会将 BPF Compiler Collection (BCC)库作为依赖项安装。
- 要点:流程
- 列表:安装 bcc-tools : # dnf install bcc-tools BCC 工具安装在 /usr/share/bcc/tools/ 目录中。
- 列表:检查安装的工具: # ls -l /usr/share/bcc/tools/ ... -rwxr-xr-x. 1 root root 4198 Dec 14 17:53 dcsnoop -rwxr-xr-x. 1 root root 3931 Dec 14 17:53 dcstat -rwxr-xr-x. 1 root root 20040 Dec 14 17:53 deadlock_detector -rw-r--r--. 1 root root 7105 Dec 14 17:53 deadlock_detector.c drwxr-xr-x. 3 root root 8192 Mar 11 10:28 doc -rwxr-xr…
- 命令/配置摘录:
# dnf install bcc-tools
# ls -l /usr/share/bcc/tools/31.3. 使用所选 bcc-tools 进行性能调整
- 要点:使用 BPF Compiler Collection (BCC)库中预创建的程序来针对每个事件分析系统性能。您可以使用 BCC 库中的程序作为创建其他程序的示例。
- 要点:先决条件
- 列表:您在系统上具有 root 权限。
- 列表:您已安装了 bcc-tools 软件包。
- 列表:使用 execsnoop 检查新系统进程。 在一个命令行会话中运行 execsnoop 程序: # /usr/share/bcc/tools/execsnoop 要创建 ls 命令的简短进程,在另一个命令行会话中,请输入: $ ls /usr/share/bcc/tools/doc/ 运行 execsnoop 的命令行会话显示类似如下的输出: PCOMM PID PPID RET ARGS ls 8382 8287 0 /usr/bin/ls --color=auto /usr/share/bcc/tools/doc/ ... execsnoop 程序打印消耗系统资源的每个新进程的输出行。它甚至会检测很快运行的程序(如 ls )的…
- 列表:在一个命令行会话中运行 execsnoop 程序: # /usr/share/bcc/tools/execsnoop
- 列表:要创建 ls 命令的简短进程,在另一个命令行会话中,请输入: $ ls /usr/share/bcc/tools/doc/
- 列表:运行 execsnoop 的命令行会话显示类似如下的输出: PCOMM PID PPID RET ARGS ls 8382 8287 0 /usr/bin/ls --color=auto /usr/share/bcc/tools/doc/ ... execsnoop 程序打印消耗系统资源的每个新进程的输出行。它甚至会检测很快运行的程序(如 ls )的进程,大多数监控工具也不会进行注册。 execsnoop 输出显示以下字段: PCOMM 进程名称。(ls) PID 进程 ID。(8382) PPID 父进程 ID。(8287) RET exec() 系统调用的返回值(0),其将程序代码加载到新进程中。 ARGS 启动的程序的参数的…
- 命令/配置摘录:
# /usr/share/bcc/tools/execsnoop
$ ls /usr/share/bcc/tools/doc/- 注意:注意 如果未提供任何参数,则默认情况下输出屏幕会每 1 秒刷新一次。
- 注意:注意 如果未提供任何参数,xfsslower 默认会显示比 10 ms 慢的操作。
完整目录
- 在 Red Hat Enterprise Linux 10 上管理 Linux 内核的指南
- 对红帽文档提供反馈
- 第 1 章 Linux 内核
- 1.1. 内核是什么
- 1.2. 了解 RHEL 内核版本号
- 1.2.1. version 字符串的含义
- 1.2.2. RHEL 内核如何演变
- 1.2.3. RHEL 8、RHEL 9 和 RHEL 10 示例
- 1.2.4. 如何确定内核功能
- 1.3. RPM 软件包
- 1.4. Linux 内核 RPM 软件包概述
- 1.5. 显示内核软件包的内容
- 1.6. 安装特定的内核版本
- 1.7. 更新内核
- 1.8. 将内核设置为默认
- 第 2 章 64k 页大小内核
- 2.1. 按系统构架确定内核页大小
- 第 3 章 管理内核模块
- 3.1. 内核模块简介
- 3.2. 内核模块依赖关系
- 3.3. 列出安装的内核
- 3.4. 列出当前载入的内核模块
- 3.5. 显示内核模块信息
- 3.6. 在系统运行时载入内核模块
- 3.7. 在系统运行时卸载内核模块
- 3.8. 在启动过程早期卸载内核模块
- 3.9. 在系统引导时自动载入内核模块
- 3.10. 防止在系统引导时自动载入内核模块
- 3.11. 编译自定义的内核模块
- 第 4 章 配置内核命令行参数
- 4.1. 什么是内核命令行参数
- 4.2. 了解引导条目
- 4.3. 为所有引导条目更改内核命令行参数
- 4.4. 为单一引导条目更改内核命令行参数
- 4.5. 在引导时临时更改内核命令行参数
- 4.6. 配置 GRUB 设置以启用串行控制台连接
- 4.7. 使用 GRUB 配置文件更改引导条目
- 第 5 章 在运行时配置内核参数
- 5.1. 什么是内核参数
- 5.2. 使用 sysctl 临时配置内核参数
- 5.3. 使用 sysctl 永久配置内核参数
- 5.4. 使用 /etc/sysctl.d/ 中的配置文件调整内核参数
- 5.5. 通过 /proc/sys/ 临时配置内核参数
- 第 6 章 使用 RHEL 系统角色永久配置内核参数
- 6.1. 使用 kernel_settings RHEL 系统角色应用所选的内核参数
- 第 7 章 使用 UKI 管理内核命令行参数
- 7.1. 了解带有 UKI 的内核命令行参数
- 7.2. 了解引导条目
- 7.3. 获取 UKI 附加组件以添加内核命令行参数
- 7.4. 为所有引导条目更改内核命令行参数
- 7.5. 为单个 UKI 更改内核命令行参数
- 7.6. 创建 UKI 以包含自定义内核命令行参数
- 第 8 章 使用 RHEL 系统角色配置 GRUB 2 引导装载程序
- 8.1. 使用 bootloader RHEL 系统角色更新现有的引导装载程序条目
- 8.2. 使用 bootloader RHEL 系统角色,使用密码保护引导菜单
- 8.3. 使用 bootloader RHEL 系统角色为引导装载程序菜单设置超时
- 8.4. 使用 bootloader RHEL 系统角色收集引导装载程序配置信息
- 第 9 章 使用内核实时修补程序应用补丁
- 9.1. kpatch 的限制
- 9.2. 对第三方实时补丁的支持
- 9.3. 获得内核实时补丁
- 9.4. 实时对内核打补丁的过程
- 9.5. 在 web 控制台中使用内核实时补丁应用补丁
- 9.6. 将当前安装的内核订阅到实时补丁流
- 9.7. 自动订阅将来的内核到实时补丁流
- 9.8. 禁用实时补丁流的自动订阅
- 9.9. 更新内核补丁模块
- 9.10. 删除 live patching 软件包
- 9.11. 卸载内核补丁模块
- 9.12. 禁用 kpatch.service
- 第 10 章 在虚拟环境中保留内核 panic 参数
- 10.1. 什么是软锁定
- 10.2. 控制内核 panic 的参数
- 10.3. 在虚拟环境中有伪装的软锁定
- 第 11 章 为数据库服务器调整内核参数
- 11.1. 介绍
- 11.2. 影响数据库应用程序性能的参数
- 第 12 章 配置巨页
- 12.1. 可用的巨页功能
- 12.2. 在引导时保留 HugeTLB 页面的参数
- 12.3. 在引导时配置 HugeTLB
- 12.3.1. 使用内核命令行参数配置 HugeTLB
- 12.3.2. 使用 systemd 服务单元配置 HugeTLB
- 12.4. 在运行时保留 HugeTLB 页面的参数
- 12.5. 在运行时配置 HugeTLB
- 12.6. 管理透明巨页
- 12.6.1. 使用运行时配置管理透明巨页
- 12.6.2. 使用 TuneD 配置文件管理透明巨页
- 12.6.3. 使用内核命令行参数管理透明巨页
- 12.6.4. 使用 systemd 单元文件管理透明巨页
- 12.7. 页面大小对转换后备缓冲区大小的影响
- 12.8. 其他资源
- 第 13 章 管理内存设备
- 13.1. 使用 udev 进行自动内存
- 13.2. 为 GPGPU 和其他 CXL 加速器内存用例配置 ZONE_NORMAL
- 13.3. 在lining 上禁用自动内存
- 13.4. 手动显示内存
- 13.5. 管理 CXL 内存设备
- 13.5.1. CXL 内存设备状态级别
- 13.5.2. 安全离线热移动内存
- 13.5.3. 防止在热添加内存时触发 OOM Killer
- 13.5.4. 热插 CXL 内存设备
- 13.5.5. 热删除 CXL 内存设备
- 13.5.6. 验证 CXL 内存状态
- 13.5.7. 使用 CXL 内存作为服务器间共享内存
- 13.5.8. 热拔出内存设备的注意事项
- 第 14 章 内核日志记录入门
- 14.1. 什么是内核环缓冲
- 14.2. 日志级别和内核日志记录上的 printk 角色
- 第 15 章 重新安装 GRUB
- 15.1. 在基于 BIOS 的机器上重新安装 GRUB
- 15.2. 在基于 UEFI 的机器上重新安装 GRUB
- 15.3. 在 IBM Power 机器上重新安装 GRUB
- 15.4. 重置 GRUB
- 第 16 章 安装 kdump
- 16.1. kdump
- 16.2. 使用 Anaconda 安装 kdump
- 16.3. 在命令行中安装 kdump
- 第 17 章 在命令行中配置 kdump
- 17.1. 估算 kdump 大小
- 17.2. 配置 kdump 内存用量
- 17.3. 配置 kdump 目标
- 17.4. 了解 kdump 内核收集器
- 17.5. 配置 kdump 核心收集器
- 17.6. 配置 kdump 默认失败响应
- 17.7. kdump 的配置文件
- 17.8. 测试 kdump 配置
- 17.9. 系统崩溃后 kdump 生成的文件
- 17.10. 启用和禁用 kdump 服务
- 17.11. 防止内核驱动程序为 kdump 加载
- 17.12. 在使用加密磁盘的系统中运行 kdump
- 第 18 章 启用 kdump
- 18.1. 为所有安装的内核启用 kdump
- 18.2. 为特定安装的内核启用 kdump
- 18.3. 禁用 kdump 服务
- 第 19 章 支持的 kdump 配置和目标
- 19.1. kdump 的内存要求
- 19.2. 自动内存保留的最小阈值
- 19.3. 支持的 kdump 目标
- 19.4. 支持的 kdump 过滤等级
- 19.5. 支持的默认故障响应
- 19.6. 使用 final_action 参数
- 19.7. 使用 failure_action 参数
- 第 20 章 固件支持的转储机制
- 20.1. IBM PowerPC 硬件支持转储固件
- 20.2. 启用固件支持的转储机制
- 20.3. IBM Z 硬件支持的固件转储机制
- 20.4. 在 Fujitsu PRIMEQUEST 系统中使用 sadump
- 第 21 章 分析内核转储
- 21.1. 安装 crash 工具
- 21.2. 运行和退出 crash 工具
- 21.3. 在 crash 工具中显示各种指示符
- 21.4. 使用 Kernel Oops Analyzer
- 21.5. Kdump Helper 工具
- 第 22 章 使用早期 kdump 来捕获引导时间崩溃
- 22.1. 启用早期 kdump
- 第 23 章 为安全引导签名内核和模块
- 23.1. 先决条件
- 23.2. 什么是 UEFI 安全引导
- 23.3. UEFI 安全引导支持
- 23.4. 使用 X.509 密钥验证内核模块的要求
- 23.5. 公钥的源
- 23.6. 生成公钥和私钥对
- 23.7. 系统密钥环输出示例
- 23.8. 通过在 MOK 列表中添加公钥在目标系统中注册公钥
- 23.9. 使用私钥签名内核
- 23.10. 使用私钥签名 GRUB 构建
- 23.11. 使用私钥签名内核模块
- 23.12. 载入经过签名的内核模块
- 第 24 章 更新安全引导撤销列表
- 24.1. 安全引导撤销列表
- 24.2. 应用一个在线撤销列表更新
- 24.3. 应用一个离线撤销列表更新
- 第 25 章 启用 HTTPS 引导加密
- 25.1. RHEL 中的 HTTPS 引导加密
- 25.2. 在 TianoCore 固件上配置 HTTPS 引导加密
- 25.3. 在 QEMU 和 libvirt 上载入 HTTPS 引导加密的 CA 证书
- 第 26 章 使用内核完整性子系统提高安全性
- 26.1. 内核完整性子系统
- 26.2. 通过基于 IMA 的 appraisal 启用内核的运行时完整性监控
- 26.3. 使用 IMA 测量启用远程测试
- 第 27 章 扩展、自定义并故障排除内核完整性子系统
- 27.1. 为 IMA appraisal 生成良好的参考值
- 27.1.1. 添加 IMA 签名作为不可变文件的良好引用
- 27.1.2. 为可变文件生成良好的参考值
- 27.2. 编写自定义 IMA 策略
- 27.3. 使用 OpenSSL 创建自定义 IMA 密钥
- 27.4. 加载由自定义 IMA 密钥签名的 IMA 策略
- 27.5. 对 systemd 无法加载 IMA 策略的故障排除
- 27.5.1. 关闭安全引导
- 27.5.2. 使用 init=/bin/bash 内核参数引导系统
- 27.5.3. 使用 initcall_blacklist=init_ima 内核参数引导系统
- 27.6. 签名自定义构建的软件包
- 27.7. 在 IMA 和 fapolicyd 间选择
- 27.1. 为 IMA appraisal 生成良好的参考值
- 第 28 章 使用 systemd 管理应用程序使用的资源
- 28.1. 资源管理中的 systemd 角色
- 28.2. 系统源的分发模型
- 28.3. 使用 systemd 分配系统资源
- 28.4. cgroups 的 systemd 层次结构概述
- 28.5. 列出 systemd 单元
- 28.6. 查看 systemd cgroups 层次结构
- 28.7. 查看进程的 cgroup
- 28.8. 监控资源消耗
- 28.9. 使用 systemd 单元文件为应用程序设置限制
- 28.10. 使用 systemctl 命令为应用程序设置 CPU 关联性
- 28.11. 通过管理器配置设置全局默认 CPU 关联性
- 28.12. 使用 systemd 配置 NUMA 策略
- 28.13. systemd 的 NUMA 策略配置选项
- 28.14. 使用 systemd-run 命令创建临时 cgroup
- 28.15. 删除临时控制组群
- 第 29 章 使用控制组群为应用程序设置系统资源限制
- 29.1. 控制组简介
- 29.2. 内核资源控制器简介
- 29.3. 命名空间简介
- 第 30 章 使用 cgroupfs 手动管理 cgroup
- 30.1. 在 cgroups-v2 文件系统中创建 cgroup 和启用控制器
- 30.2. 通过调整 CPU 权重来控制应用程序的 CPU 时间分布
- 第 31 章 使用 eBPF 分析系统性能
- 31.1. 使用 bpftrace 软件包
- 31.2. 安装 bcc-tools 软件包
- 31.3. 使用所选 bcc-tools 进行性能调整
