概述
kdump是Linux内核发生崩溃时转储内存的一种机制,当内核发生错误时,kdump会将当前内核使用的内存导出为镜像文件(通常为vmcore)保存到硬盘上,之后可以使用crash等工具对内核错误原因进行分析。
kdump基本原理
kdump工作时有两个内核,一个是生产内核,即系统正常运行时使用的内核;另一个称为捕获内核。当生产内核在运行过程中出现crash的时候,kdump会切换到捕获内核运行,此时捕获内核会捕获生产内核crash时产生的crash dump信息并保存到磁盘上,用于后续分析。
kdump工作流程
kdump的工作流程如下图:
系统如果配置了kdump服务,则在启动的时候生产内核会为捕获内核预留一部分内存。系统起来后,kdump服务程序会通过kexec系统调用将initframs和捕获内核加载进预留内存中。当系统崩溃时,kdump通过kexec自动启动进入到捕获内核中运行。捕获内核将发生crash的内核的内存镜像保存到/proc/vmcore下,然后使用用户态工具makedumpfile将镜像拷贝到磁盘上,完成后重启系统。
kdump配置与使用
本文说明的配置操作基于Centos-Stream-9
,使用内核版本为5.14.0-160.el9.aarch64
。
配置内核启动参数
在系统启动时,需要为内核传递crashkernel=
参数,来告知系统如何为捕获内核预留内存。crashkernel参数常用的两种配置形式如下:
- crashkernel=size[@offset] :offset指定内存起始地址,size指定预留内存大小。举例说明
crashkernel=256M@16M
,则表示系统为捕获内核预留256M的内存空间,起始地址为16M; - crashkernel=range1:size1[,range2:size2,…][@offset]:这里
range=start-[end]
与系统内存大小有关。举例说明crashkernel=512M-2G:64M,2G-:128M
,则表示:- 若内存小于512M,则不预留内存;
- 若内存介于512M和2G之间,预留64M内存;
- 内存2G以上,预留128M内存。
修改/etc/default/grub
文件中GRUB_CMDLINE_LINUX选项:
然后,使用grub2-mkconfig工具重新生成grub启动选项:
重启等待系统起来后,通过cat /proc/cmdline
确认内核选项是否配置成功:
配置kdump服务
kdump在使用时,支持对一些配置参数进行调整,配置文件路径为/etc/kdump.conf
。这里对用户比较关心的两个配置参数进行一下说明:
- 保存路径参数
path <path>
:可以指定vmcore文件保存的路径,默认使用路径/var/crash
; - 导出内存级别参数:可以指定vmcore包含的内存页面,以控制vmcore的大小,其级别从0-31。
通常情况下,使用默认的配置参数就可以了。最后,配置启动kdump服务:
systemctl enable kdump // 配置kdump服务开机自启动
systemctl start kdump // 启动kdump服务
测试配置是否生效
通过执行下面的命令,可以主动触发系统panic复位:
echo c > /proc/sysrq-trigger
等待系统重新启动后,可以在/var/crash目录下查看是否成功生成了vmcore文件,之后就可以使用crash工具对vmcore进行分析了。