概述

kdump是Linux内核发生崩溃时转储内存的一种机制,当内核发生错误时,kdump会将当前内核使用的内存导出为镜像文件(通常为vmcore)保存到硬盘上,之后可以使用crash等工具对内核错误原因进行分析。

kdump基本原理

kdump工作时有两个内核,一个是生产内核,即系统正常运行时使用的内核;另一个称为捕获内核。当生产内核在运行过程中出现crash的时候,kdump会切换到捕获内核运行,此时捕获内核会捕获生产内核crash时产生的crash dump信息并保存到磁盘上,用于后续分析。

kdump工作流程

kdump的工作流程如下图:

linux写脚本关闭zookeeper linux关闭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,则表示:
  1. 若内存小于512M,则不预留内存;
  2. 若内存介于512M和2G之间,预留64M内存;
  3. 内存2G以上,预留128M内存。

修改/etc/default/grub文件中GRUB_CMDLINE_LINUX选项:

linux写脚本关闭zookeeper linux关闭kdump功能_配置参数_02


然后,使用grub2-mkconfig工具重新生成grub启动选项:

linux写脚本关闭zookeeper linux关闭kdump功能_配置参数_03


重启等待系统起来后,通过cat /proc/cmdline确认内核选项是否配置成功:

linux写脚本关闭zookeeper linux关闭kdump功能_配置参数_04

配置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进行分析了。