41.2. 在命令行中配置 kdump
在系统引导过程中为 kdump
保留内存。您可以在系统的 Grand Unified Bootloader (GRUB)配置文件中配置内存大小。内存大小取决于配置文件中指定的 crashkernel=
值以及系统物理内存的大小。
41.2.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 pages KERN_DATA 1333192 no Dumpable kernel data
makedumpfile --mem-usage
命令会以页为单位报告所需的内存。这意味着您必须根据内核页面大小计算所使用的内存大小。
41.2.2. 配置 kdump 内存用量
为 kdump
的内存保留在系统引导过程中发生。内存大小是在系统的 Grand Unified Bootloader (GRUB)配置中设定的。内存大小取决于配置文件中指定的 crashkernel=
选项的值以及系统物理内存的大小。
您可以使用多种方式定义 crashkernel=
选项。您可以指定 crashkernel=
值或配置 auto
选项。crashkernel=auto
参数根据系统中的物理内存总量自动保留内存。配置后,内核将自动为捕获内核保留适当数量的所需内存。这有助于防止内存不足(OOM)错误。
kdump
的自动内存分配因系统硬件架构和可用内存大小而异。
如果系统自动分配低于最小内存阈值,您可以手动配置保留内存量。
先决条件
- 您在系统上具有 root 权限。
-
满足
kdump
配置和目标的要求。详情请查看 支持的 kdump 配置和目标。
流程
准备
crashkernel=
选项。例如:要保留 128 MB 内存,请使用:
crashkernel=128M
或者,您可以根据安装的内存总量将保留内存量设置为变量。变量中的内存保留语法为
crashkernel=<range1>:<size1>,<range2>:<size2>
。例如:crashkernel=512M-2G:64M,2G-:128M
如果系统内存总量为 512 MB 和 2 GB,则命令保留 64 MB 内存。如果内存量超过 2 GB,则内存保留为 128 MB。
保留内存的偏移。
有些系统需要保留具有特定固定偏移量的内存,因为
crashkernel
保留在早期发生,您可能需要为特殊用途保留更多内存。当您定义了一个偏移时,保留的内存将从这个偏移位置开始。要偏移保留的内存,请使用以下语法:crashkernel=128M@16M
在这个示例中,
kdump
从 16 MB 开始保留 128 MB 内存(物理地址0x01000000
)。如果将偏移参数设置为 0 或完全省略,kdump
会自动偏移保留内存。在设置变量内存保留时,也可以使用此语法。在这种情况下,偏移总是指定最后一个。例如:crashkernel=512M-2G:64M,2G-:128M@16M
将
crashkernel=
选项应用到引导装载程序配置:# grubby --update-kernel=ALL --args="crashkernel=<value>"
将
<value>
替换为您在上一步中准备的crashkernel=
选项的值。
其它资源
- kdump 的内存要求
- 配置内核命令行参数
- 如何在系统引导前手动修改 GRUB 中的引导参数 (红帽知识库)
- 如何在 Red Hat Enterprise Linux 8 中安装并引导自定义内核
-
grubby(8)
手册页
41.2.3. 配置 kdump 目标
崩溃转储通常以一个文件形式存储在本地文件系统中,直接写入设备。另外,您可以使用 NFS
或 SSH
协议通过网络发送崩溃转储。一次只能设置其中一个选项来保留崩溃转储文件。默认行为是将其存储在本地文件系统的 /var/crash/
目录中。
先决条件
- 您在系统上具有 root 权限。
-
满足
kdump
配置和目标的要求。详情请查看 支持的 kdump 配置和目标。
流程
要将崩溃转储文件保存在本地文件系统的
/var/crash/
目录中,请编辑/etc/kdump.conf
文件并指定路径:path /var/crash
选项
path /var/crash
代表kdump
在其中保存崩溃转储文件的文件系统的路径。注意-
当您在
/etc/kdump.conf
文件中指定转储目标时,路径是相对于指定的转储目标。 -
当您没有在
/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/crash
目录中。
要更改保存崩溃转储的本地目录,以
root
用户身份编辑/etc/kdump.conf
配置文件:-
从
#path /var/crash
行的开头删除哈希符号(#
)。 使用预期的目录路径替换该值。例如:
path /usr/local/cores
重要在 Red Hat Enterprise Linux 8 中,当
kdump
systemd
服务启动时,必须存在使用path
指令定义为kdump
目标的目录,以避免失败。与早期版本的 RHEL 不同,如果服务启动时不存在目录,则该目录将不再自动创建。
-
从
要将文件写入不同的分区,请编辑
/etc/kdump.conf
配置文件:根据您的选择,从
#ext4
行的开头删除哈希符号(#
)。-
设备名称(
#ext4 /dev/vg/lv_kdump
行) -
文件系统标签(
#ext4 LABEL=/boot
行) -
UUID(
#ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
行)
-
设备名称(
将文件系统类型和设备名称、标签或 UUID 改为所需的值。指定 UUID 值的正确语法是
UUID="correct-uuid"
和UUID=correct-uuid
。例如:ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
重要建议您使用
LABEL=
或UUID=
指定存储设备。无法保证/dev/sda3
等磁盘设备名称在重启后保持一致。当您在 IBM Z 硬件中使用 Direct Access Storage Device (DASD)时,请确保在
/etc/dasd.conf
中正确指定转储设备,然后再使用kdump
。
要将崩溃转储直接写入设备,请编辑
/etc/kdump.conf
配置文件:-
从
#raw /dev/vg/lv_kdump
行的开头删除哈希符号(#
)。 使用预期的设备名称替换该值。例如:
raw /dev/sdb1
-
从
使用
NFS
协议将崩溃转储保存到远程机器中:-
从
#nfs my.server.com:/export/tmp
行的开头删除哈希符号(#
)。 使用有效的主机名和目录路径替换该值。例如:
nfs penguin.example.com:/export/cores
重启
kdump
服务以使更改生效:sudo systemctl restart kdump.service
注意当使用 NFS 指令指定 NFS 目标时,
kdump.service
会自动尝试挂载 NFS 目标来检查磁盘空间。不需要提前挂载 NFS 目标。要防止kdump.service
挂载目标,请在kdump.conf
中使用dracut_args --mount
指令。这将启用kdump.service
使用-mount
参数调用dracut
工具来指定 NFS 目标。
-
从
使用 SSH 协议将崩溃转储保存到远程机器中:
-
从
#ssh user@my.server.com
行的开头删除哈希符号(#
)。 - 使用有效的用户名和密码替换该值。
在配置中包含您的 SSH 密钥。
-
从
#sshkey /root/.ssh/kdump_id_rsa
行的开头删除哈希符号。 将该值改为您要转储的服务器中有效密钥的位置。例如:
ssh john@penguin.example.com sshkey /root/.ssh/mykey
-
从
-
从
其它资源
系统崩溃后 kdump 生成的文件。
41.2.4. 配置 kdump 核心收集器
kdump
服务使用 core_collector
程序捕获崩溃转储镜像。在 RHEL 中,makedumpfile
工具是默认的内核收集器。它通过以下方式帮助缩小转储文件:
- 压缩崩溃转储文件的大小,并使用各种转储级别仅复制必要的页面。
- 排除不必要的崩溃转储页。
- 过滤崩溃转储中包含的页面类型。
RHEL 7 及更高版本中默认启用崩溃转储文件压缩。
如果您需要自定义崩溃转储文件压缩,请按照以下步骤执行。
语法
core_collector makedumpfile -l --message-level 1 -d 31
选项
-
-c
、-l
或-p
:指定每个页的压缩 dump 文件的格式,使用zlib
用于-c
选项、使用lzo
用于-l
新选项,或snappy
用于-p
选项。 -
-d
(dump_level)
:排除页面,它们不会复制到转储文件中。 -
--message-level
:指定消息类型。您可以通过使用这个选项指定message_level
来限制打印的输出。例如,把message_level
设置为 7 可打印常见消息和错误消息。message_level
的最大值为 31。
先决条件
- 您在系统上具有 root 权限。
-
满足
kdump
配置和目标的要求。详情请查看 支持的 kdump 配置和目标。
流程
-
作为
root
用户,编辑/etc/kdump.conf
配置文件并从#core_collector makedumpfile -l --message-level 1 -d 31
的开头删除 hash 符号("#")。 - 输入以下命令启用崩溃转储文件压缩:
core_collector makedumpfile -l --message-level 1 -d 31
-l
选项指定 转储
压缩的文件格式。-d
选项将转储级别指定为 31。message-level
选项将消息级别指定为 1。
另外,请考虑使用 -c
和 -p
选项的示例:
使用
-c
压缩崩溃转储文件:core_collector makedumpfile -c -d 31 --message-level 1
使用
-p
压缩崩溃转储文件:core_collector makedumpfile -p -d 31 --message-level 1
其它资源
-
系统中
makedumpfile (8)
手册页 - kdump 的配置文件
41.2.5. 配置 kdump 默认失败响应
默认情况下,当 kdump
不能在配置的目标位置创建崩溃转储文件时,系统会重启,转储在此过程中会丢失。您可以更改默认失败响应,并将 kdump
配置为在将内核转储保存到主目标时执行不同的操作。额外的操作是:
dump_to_rootfs
-
将内核转储保存到
root
文件系统。 reboot
- 重启系统,在此过程中会丢失内核转储。
halt
- 停止系统,在此过程中会丢失内核转储。
poweroff
- 关闭系统,在此过程中会丢失内核转储。
shell
-
从
initramfs
中运行 shell 会话,您可以手动记录内核转储。 final_action
-
在
kdump
成功或在 shell 或dump_to_rootfs
失败操作完成后,启用额外的操作,如reboot
、halt
和poweroff
。默认为reboot
。 failure_action
-
指定在内核崩溃中转储可能失败时要执行的操作。默认为
reboot
。
先决条件
- root 权限。
-
满足
kdump
配置和目标的要求。详情请查看 支持的 kdump 配置和目标。
流程
-
作为
root
用户,从/etc/kdump.conf
配置文件中的
行的开头删除 hash 符号(#)。#
failure_action 将值替换为所需操作。
failure_action poweroff
其它资源
41.2.6. kdump 的配置文件
kdump
内核的配置文件是 /etc/sysconfig/kdump
。此文件控制 kdump
内核命令行参数。对于大多数配置,请使用默认选项。然而,在某些情况下,您可能需要修改某些参数来控制 kdump
内核行为。例如:修改 KDUMP_COMMANDLINE_APPEND
选项,以附加 kdump
内核命令行来获取详细的调试输出或修改 KDUMP_COMMANDLINE_REMOVE
选项,以从 kdump
命令行中删除参数。
KDUMP_COMMANDLINE_REMOVE
这个选项从当前
kdump
命令行中删除参数。它删除了可能导致kdump
错误或kdump
内核引导失败的参数。这些参数可能已从之前的KDUMP_COMMANDLINE
进程解析,或者继承自/proc/cmdline
文件。如果未配置此变量,它将继承
/proc/cmdline
文件中的所有值。配置此选项还提供了有助于调试问题的信息。要删除某些参数,请将其添加到
KDUMP_COMMANDLINE_REMOVE
中,如下所示:
# KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swiotlb"
KDUMP_COMMANDLINE_APPEND
此选项将参数附加到当前命令行。这些参数可能已被之前的
KDUMP_COMMANDLINE_REMOVE
变量解析。对于
kdump
内核,禁用某些模块,如mce
、cgroup
、numa
,hest_disable
有助于防止内核错误。这些模块可能会消耗为 kdump 保留的内核内存的重要部分,或者
导致kdump
内核引导失败。要在
kdump
内核命令行中禁用内存cgroups
,请运行以下命令:
KDUMP_COMMANDLINE_APPEND="cgroup_disable=memory"
其它资源
-
Documentation/admin-guide/kernel-parameters.txt
文件 -
/etc/sysconfig/kdump
文件
41.2.7. 测试 kdump 配置
配置 kdump
后,您必须手动测试系统崩溃,并确保在定义的 kdump
目标中生成了 vmcore
文件。vmcore
文件是从新引导的内核上下文中捕获的。因此,vmcore
具有用于调试内核崩溃的重要信息。
不要对活动状态的生产环境系统测试 kdump
。测试 kdump
的命令将导致内核崩溃,且数据丢失。根据您的系统架构,确保您安排了充足的维护时间,因为 kdump
测试可能需要多次重启,且启动时间很长。
如果 vmcore
文件在 kdump
测试过程中没有生成 ,请在再次运行测试前识别并修复问题,以使 kdump
测试成功。
如果进行任何手动系统修改,您必须在任何系统修改的最后测试 kdump
配置。例如,如果您进行以下任何更改,请确保测试 kdump
配置以获取最佳 kdump
性能:
- 软件包升级。
- 硬件级别的更改,如存储或网络更改。
- 固件升级。
- 包括第三方模块的新安装和应用程序升级。
- 如果您使用热插拔机制在支持此机制的硬件上添加更多内存。
-
在
/etc/kdump.conf
或/etc/sysconfig/kdump
文件中进行更改后。
先决条件
- 您在系统上具有 root 权限。
-
您已保存了所有重要数据。测试
kdump
的命令导致内核崩溃及数据丢失。 - 您已根据系统架构安排了大量机器维护时间。
流程
启用
kdump
服务:# kdumpctl restart
使用
kdump
ctl# kdumpctl status kdump:Kdump is operational
另外,如果您使用
systemctl
命令,输出会在systemd
日志中打印。启动内核崩溃来测试
kdump
配置。sysrq-trigger
组合键导致内核崩溃,并在需要时可能重启系统。# echo c > /proc/sysrq-trigger
在内核重启时,
address-YYYY-MM-DD-HH:MM:SS/vmcore
文件在您在/etc/kdump.conf
文件中指定的位置创建。默认值为/var/crash/
。
其它资源
41.2.8. 系统崩溃后 kdump 生成的文件
系统崩溃后,kdump
服务会在转储文件(vmcore
)中捕获内核内存,并生成额外的诊断文件,以帮助故障排除和事后分析。
kdump
生成的文件:
-
vmcore
- 崩溃时包含系统内存的主内核内存转储文件。它包含根据kdump
配置中指定的core_collector
程序配置的数据。默认情况下,包含内核数据结构、进程信息、堆栈跟踪和其他诊断信息。 -
vmcore-dmesg.txt
- panic 的主内核中的内核环缓冲区日志的内容(dmesg
)。 -
kexec-dmesg.log
- 从收集vmcore
数据的二级kexec
内核中执行内核和系统日志消息。
其它资源
41.2.9. 启用和禁用 kdump 服务
您可以配置,以对特定的内核或所有安装的内核启用或禁用 kdump
功能。您必须定期测试 kdump
功能并验证其运行正常。
先决条件
- 您在系统上具有 root 权限。
-
您已为配置和目标完成了
kdump
要求。请参阅 支持的 kdump 配置和目标。 -
用于安装
kdump
的所有配置都是根据需要设置的。
流程
为
multi-user.target
启用kdump
服务:# systemctl enable kdump.service
在当前会话中启动服务:
# systemctl start kdump.service
停止
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
。验证 sysctl.conf
文件中的以下内容,以确保 kdumpctl
服务加载崩溃内核:
-
sysctl.conf
文件中的内核kptr_restrict=1
。
41.2.10. 防止内核驱动程序为 kdump 加载
您可以通过在 /etc/sysconfig/kdump
配置文件中添加 KDUMP_COMMANDLINE_APPEND=
变量来从加载某些内核驱动程序中控制捕获内核。使用这个方法,您可以防止来自加载指定的内核模块中的 kdump
初始 RAM 磁盘镜像 initramfs
。这有助于防止内存不足(OOM) killer 错误或其他崩溃内核失败。
您可以使用以下配置选项之一附加 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.blacklist=fcoe"
重启
kdump
服务:# systemctl restart kdump
其它资源
-
系统中
dracut.cmdline
手册页。
41.2.11. 在使用加密磁盘的系统中运行 kdump
当您运行 LUKS 加密的分区时,系统需要一定数量的可用内存。如果系统可用内存量小于所需的可用内存量,则 cryptsetup
实用程序无法挂载分区。因此,在第二个内核(捕获内核)中将 vmcore
文件捕获到加密的目标位置会失败。
kdumpctl estimate
命令帮助您估计 kdump
所需的内存量。kdumpctl estimate
打印推荐的 crashkernel
值,这是 kdump
所需的最合适的内存大小。
推荐的 crashkernel
值是根据当前的内核大小、内核模块、initramfs 和 LUKS 加密的目标内存要求计算的。
如果您使用自定义 crashkernel=
选项,kdumpctl estimate
会输出 LUKS 所需的大小值
。值是 LUKS 加密目标所需的内存大小。
流程
输出估计的
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.
-
通过增加
crashkernel=
值来配置所需的内存量。 - 重启系统。
如果 kdump
服务仍无法将转储文件保存到加密的目标,请根据需要增大 crashkernel=
值。