Linux 内核记录崩溃分析的kdump服务
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 GiB | 0 MiB | 内存不足,无法使用 Kdump |
| 2 ~ 8 GiB | 192 MiB | 预留 192 MiB |
| \u003e 8 GiB | 256 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