Linux崩溃转储服务之kdump
简介
kdump
是提供崩溃转储机制的服务。该服务可让您保存系统内存内容已用于分析。kdump
使用 kexec
系统调用在没有重启的情况下引导至第二个内核( 捕获内核),然后捕获崩溃内核的内存( 崩溃转储 或 vmcore)并将其保存到文件中。这个第二个内核位于系统内存保留的一部分。
内核崩溃转储可能会是系统失败时唯一可用的信息(关键错误)。因此,在关键任务环境中运行
kdump
非常重要。红帽建议系统管理员在正常内核更新周期内定期更新和测试kexec-tools
。这在部署了新内核功能时尤为重要。
您可以为机器上的所有安装内核启用 kdump
,或只为指定内核启用 kdump。当计算机上有多个内核使用时,这非常有用,其中一些内核足够稳定,没有关注它们可以崩溃。
安装 kdump
时,会创建一个默认的 /etc/kdump.conf
文件。该文件包含默认最小 kdump
配置。您可以编辑此文件来自定义 kdump
配置,但这不是必需的。
安装
检查是否在系统上安装了
kdump
:1# rpm -q kexec-tools如果安装了该软件包,输出:
1# kexec-tools-2.0.22-13.el9.x86_64如果没有安装该软件包,输出:
1package kexec-tools is not installed通过以下方法安装
kdump
和其他必要的软件包:1# dnf install kexec-tools
启用和禁用 kdump 服务
要在引导时启动 kdump
服务,请按照以下步骤操作。
先决条件
- 实现了配置和目标的
kdump
要求。 - 安装
kdump
的所有配置都是根据您的需要设置的。
步骤
要启用
kdump
服务,请使用以下命令:1# systemctl enable kdump.service这为
multi-user.target
启用服务。要在当前会话中启动该服务,请使用以下命令:
1# systemctl start kdump.service要停止
kdump
服务,请输入以下命令:1# systemctl stop kdump.service要禁用
kdump
服务,请执行以下命令:1# 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
。
要确定 kdumpctl
服务载入崩溃内核,请验证:
sysctl.conf
文件中的内核kptr_restrict=1
。
在命令行中配置 kdump
在系统引导过程中为 kdump
保留内存。内存大小是在系统的 Grand Unified Bootloader (GRUB)配置文件中配置的。内存大小取决于配置文件中指定的 crashkernel=
值以及系统物理内存的大小。
配置 kdump 内存用量
kexec-tools
软件包维护默认的 crashkernel
内存保留值。kdump
服务使用默认值为每个内核保留 crashkernel
内存。
kdump
自动内存分配根据系统硬件架构和可用内存大小而有所不同。例如,在 64 位 ARM 架构中,只有可用内存超过 1 GB 时,crashkernel
默认参数才会正常工作。kexec-tools
默认情况下,在 64 位 ARM 架构中配置以下内存保留:
1 | crashkernel=1G-4G:256M,4G-64G:320M,64G:576M |
崩溃内核的内存要求可能会因硬件和机器规格而异。如果默认 crashkernel
值无法在您的系统中工作,您可以运行 kdumpctl estimate
命令并查询 rough estimate 的值,而不触发崩溃。估算的 crashkernel
值可能并不准确,可作为设置适当的 crashkernel
值的参考。
注意
RHEL 9 及更新的版本不再支持引导命令行中的 crashkernel=auto
选项。
先决条件
- 在系统中具有 root 权限。
- 实现了配置和目标的
kdump
要求。详情请查看支持的 kdump 配置和目标 - 在 IBM Z 系统中,确保安装了
zipl
工具。
流程
为
crashkernel
配置默认值:1# kdumpctl reset-crashkernel --kernel=ALL(可选)要使用自定义
crashkernel
值:配置所需的内存保留:
1crashkernel=1G-4G:192M,4G-:256M如果系统内存总量为 1 GB 或大于 4 GB,则示例保留 192 MB 内存。如果内存量大于 4 GB,则为
kdump
保留 256 MB。- (可选) 偏移保留内存:
因为崩溃内核保留非常早,所以有些系统需要保留具有一定固定偏移量的内存,并希望为特殊用途保留一些区域。如果设置了偏移,则保留内存从此偏移开始。要偏移保留的内存,请使用以下语法:
1crashkernel=192M@16M上面的示例保留以 16 MB 开始的 192 MB 内存(物理地址 0x01000000)。如果偏移参数设为 0 或完全省略,
kdump
会自动偏移保留内存。您还可以在设置变量内存保留时偏移内存,方法是将偏移指定为最后一个值。例如:crashkernel=1G-4G:192M,2G-64G:256M@16M
。更新引导装载程序配置:
1# grubby --update-kernel ALL --args "crashkernel=<CUSTOM-VALUE>”在使用 zIPL 引导装载程序的 IBM Z 系统中,该命令会为每个
/boot/loader/entries/<ENTRY>.conf
文件添加新内核参数。- 在 IBM Z 系统中,要更新引导菜单,在不指定选项的情况下执行
zipl
命令:
1# zipl- 在 IBM Z 系统中,要更新引导菜单,在不指定选项的情况下执行
重启以使更改生效:
1# reboot
验证
激活
sysrq
键以引导到kdump
内核:12# echo 1 > /proc/sys/kernel/sysrq# echo c > /proc/sysrq-trigger这会强制 Linux 内核崩溃,并将
address-YYYY-MM-DD-HH:MM:SS/vmcore
文件复制到配置文件中指定的目标位置。验证在
/etc/kdump.conf
文件中指定的目标中转储vmcore
文件:1234$ ls /var/crash/127.0.0.1-2022-01-18-0/var/crash/127.0.0.1-2022-01-18-05:23:10':kexec-dmesg.log vmcore vmcore-dmesg.txt在本例中,内核将
vmcore
保存在默认目标目录中(/var/crash/
)。
测试 kdump 配置
您可以在机器进入生产环境前测试崩溃转储过程是否正常工作。
警告
以下命令会导致内核崩溃。在按照这些步骤操作时要小心,且不要在活跃的生产环境中使用它们。
步骤
在启用了
kdump
的情况下重启系统。确保
kdump
正在运行:本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!