本文基于redhat系的操作系统,debian系不太一样,仅提供参考
1.kdump的部署
注:一般很多操作系统在安装时可默认启动kdump。
(1)需要的包
yum install kexec-tools crash kernel-debuginfo
(2)设置内核启动参数
确保内核参数有“crashkernel=auto”,crashkernel用于设置kdump需要的预留内存的大小,这里将会被kdump服务放入内核,系统崩溃后会启动此处的内核转储/proc/vmcore下的文件到磁盘路径/var/crash下,有如下格式:
crashkernel=X,high //强制使用高端内存,例:crashkernel=1024M,high
crashkernel=X,low //强制使用低端内存,例:crashkernel=256M,low
crashkernel=X@Y //让内核自行选择在X到Y之间大小的内存,例:crashkernel=128M@256M
crashkernel=ramsize-range:size[,...][@offset] //物理内存大小在ramsize到range范围内让内核选择size到offset大小的预留内存,例:crashkernel=1G-64G:160M@256M
内核参数修改方法可以参见其他博客
(3)开启kdump服务
systemctl enable kdump
systemctl start kdump
(4)测试kdump功能
linux内核提供了一个模拟触发的方法,开启kdump服务后,执行如下命令即可:
echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger
(5)分析转储文件
如果kdump工作正常,在/var/crash目录下会生成一个带有日期的文件夹,其中就存放了转储文件vmcore,可以使用crash解析:
crash /usr/lib/debug/lib/modules/‘对应转储文件的debuginfo内核’/vmlinux /var/crash/‘对应触发时间的文件夹’/vmcore
如果解析成功会出现交互界面,输入命令“bt”可以打印出栈,说明已经可以正常调试了。
2.一些常见kdump问题的处理
(1)kdump服务启动失败
首先查看“/proc/cmdline”中是否设置了crashkernel,如果有再检查kdump的报错:
systemctl status kdump
如果类似如下的日志,特别是“No memory reserved for crash kernel”,说明crashkernel设置的不对,可以尝试调整大小和格式,也可能是内核不支持某些上述格式。
[root@ai66 test_k8s_log]# systemctl status kdump.service
● kdump.service - Crash recovery kernel armingLoaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled)Active: failed (Result: exit-code) since Wed 2023-11-01 15:24:49 CST; 6 days agoProcess: 1070 ExecStart=/usr/bin/kdumpctl start (code=exited, status=1/FAILURE)Main PID: 1070 (code=exited, status=1/FAILURE)Nov 01 15:24:49 ai66 systemd[1]: Starting Crash recovery kernel arming...
Nov 01 15:24:49 ai66 kdumpctl[1070]: No memory reserved for crash kernel
Nov 01 15:24:49 ai66 kdumpctl[1070]: Starting kdump: [FAILED]
Nov 01 15:24:49 ai66 systemd[1]: kdump.service: main process exited, code=exited, status=1/FAILURE
Nov 01 15:24:49 ai66 systemd[1]: Failed to start Crash recovery kernel arming.
Nov 01 15:24:49 ai66 systemd[1]: Unit kdump.service entered failed state.
Nov 01 15:24:49 ai66 systemd[1]: kdump.service failed.