本文基于redhat系的操作系统,debian系不太一样,仅供参考
kdump是一种内核崩溃转储机制,简单来说就是在内存中留出一块单独的区域放置一个内核,当现在运行中的系统发生不可恢复的崩溃后,会立即切换到此内核上,将内存中所有的数据保存到磁盘中,方便开发者之后分析内核崩溃的原因。其中,原始的内核叫做第一内核,也叫生产内核,崩溃后进入的内核是第二内核,也叫捕获内核。有几点要说明:
注:一般很多操作系统在安装时可默认启动kdump。
yum install kexec-tools crash kernel-debuginfo
确保内核参数有“crashkernel=auto”,crashkernel用于设置kdump需要的预留内存的大小,这里将会被kdump服务放入内核,系统崩溃后会启动此处的内核转储/proc/vmcore下的文件到磁盘路径/var/crash下,有如下格式:
建议默认使用“crashkernel=auto”,除非kdump有问题,否则不建议手动修改。由于机型、系统环境、物理内存对预留均有影响,无法给出一个肯定的计算kdump预留空间范围的方法,只能提供如下建议:
注:内核参数修改方法可以参见其他网络教程。
systemctl enable kdump
systemctl start kdump
linux内核提供了一个模拟触发的方法,开启kdump服务后,执行如下命令即可:
echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger
如果kdump工作正常,在/var/crash目录下会生成一个带有日期的文件夹,其中就存放了转储文件vmcore,可以使用crash解析:
crash /usr/lib/debug/lib/modules/‘对应转储文件的debuginfo内核’/vmlinux /var/crash/‘对应触发时间的文件夹’/vmcore
如果解析成功会出现交互界面,输入命令“bt”可以打印出栈,说明已经可以正常调试了。
分析方法一般是复现同时查看日志,在内核启动参数中加入“console=ttyS0,115200 loglevel=9”,其中ttyS0为串口设备,可以修改为确定能使用的串口,最好使用主板上的串口,不要使用pcie转接的串口,那会需要驱动模块支持,可能会在进入kdump以后没有输出。
接上串口后,使用2.4的命令触发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 arming
Loaded: 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 ago
Process: 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.
发现kdump卡死一般有以下几个原因:
还是要查看进入第二内核后串口输出的日志,其中可能会有以下情况:
kdump: saving vmcore-dmesg.txt
Missing the log_buf symbol
kdump: saving vmcore-dmesg.txt failed
kdump: saving vmcore
kdump: saving vmcore failed
[FAILED] Failed to start Kdump Vmcore Save Service.
其实不只是kexec-tools包,这些包都与内核关联度比较高,系统中要保证这些包和当前运行的内核版本一致:crash linux-sgx-driver prefetch_tuning txgbe vdo dracut dpdk kpatch kmod-kvdo kae_driver kmod kexec-tools