Linux 内核记录崩溃分析的kdump服务

最佳<Coder
2026/5/10修改于 3天前

kdump是Linux内核崩溃转储服务,能在系统崩溃时保存内存信息用于事后分析。本文介绍kdump的安装配置、磁盘空间规划、以及如何分析vmcore崩溃日志。

简介

部分 Linux 系统镜像默认开启了 kdump 服务。Kdump 服务可捕获内核错误,方便对内核崩溃现象进行分析。当 Linux 内核出现了故障时,kdump 会协助产生一个 dump 文件,记录下此时的内存运行参数等信息。

内核启动选项 crashkernel 说明

Kdump 服务的开启依赖于内核运行时预留的一段内存地址空间,该内存地址空间的大小由内核命令行参数 /proc/cmdline 中的 crashkernel 选项指定。

查看方式:

vim /etc/default/grub

查看以下配置:

GRUB_CMDLINE_LINUX_DEFAULT="crashkernel=0M-2G:0M,2G-8G:192M,8G-:256M"
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 console=ttyS0,115200 console=tty0 panic=5 crashkernel=auto"

crashkernel= 后面的含义:

内存范围预留大小说明
\u2264 2 GiB0 MiB内存不足,无法使用 Kdump
2 ~ 8 GiB192 MiB预留 192 MiB
\u003e 8 GiB256 MiB预留 256 MiB

验证当前操作系统是否成功预留了相应大小的内存空间:

cat /sys/kernel/kexec_crash_size

返回结果中的 kexec crash size 单位为字节,例如 201326592

Kdump 系统服务的开启与关闭

仅有 crashkernel 内核启动选项是无法实现 Kdump 完整功能的,还需要配合 Kdump 服务。

查看服务运行状态:

systemctl status kdump.service

如果返回结果中 Active 的值为 inactive,则说明 Kdump 服务处于未激活状态。

也可查看内核接口提示的状态,如果返回结果为 0,则说明 Kdump 服务处于未激活状态:

cat /sys/kernel/kexec_crash_loaded

开启 Kdump 服务:

systemctl start kdump.service

部分云厂商 ECS 系统可能需要用:acs-plugin-manager --exec --plugin ecs_dump_config --params --enable

关闭 Kdump 服务:

systemctl stop kdump.service

部分云厂商 ECS 系统可能需要用:acs-plugin-manager --exec --plugin ecs_dump_config --params --disable

是否开机自启:

systemctl enable kdump.service   # 开机自启
systemctl disable kdump.service  # 禁止开机自启

彻底禁用并归还内存地址空间

如果无需启用 Kdump 服务,希望将系统预留的内存地址空间归还给操作系统本身:

sh -c 'echo 0 > /sys/kernel/kexec_crash_size'
systemctl disable kdump.service
systemctl stop kdump.service

验证内存地址空间不再为 Kdump 预留:

cat /sys/kernel/kexec_crash_size
# 返回值应为 0

Kdump 服务预留的内存地址空间归还给操作系统后,必须重启操作系统才可再次开启 Kdump 服务。

归还后彻底移除 crashkernel 参数

修改 GRUB 文件:

vim /etc/default/grub

找到下面的行,改成如下:

GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 console=ttyS0,115200 console=tty0 panic=5"

修改完之后执行:

update-grub2
# 然后重启服务器
reboot

评论

已显示全部评论