配置kdump服务
内核问题往往不能直接通过GDB等调试工具对程序进行调试,需要先生成vmcore文件,通过调试vmcore,进行问题的定位。
kdump是在系统崩溃、死锁或死机的时候用来转储内存运行参数的一个工具和服务。只有配置了kdump服务,vmcore文件才会生成。下面基于鲲鹏平台在openEuler 22.03 LTS和CentOS 7.6操作系统下介绍kdump的配置方法。
- 安装kdump。
- openEuler 22.03 LTS已经内置并启用了kdump,可以不用单独安装。
- CentOS 7.6在安装时可选是否启用kdump功能。如果未启用则需重新安装kdump所依赖的包。
1
yum install kexec-tools -y
- (可选)配置crashkernel大小。
kdump预留内存参数必须添加到内核启动参数中,配置文件路径为:
- UEFI引导模式:“/boot/efi/EFI/openEuler/grub.cfg”
- legacy引导模式:“/boot/grub2/grub.cfg”
openEuler发布版本中默认已经添加,可以根据实际使用情况调整。添加和修改启动参数后,重启系统使配置生效。
- 对于openEuler系统,“crashkernel”的参数值不支持配置为“auto”,kdump预留内存参数格式如表1所示。
表1 kdump预留内存参数(openEuler操作系统) 内核启动参数
描述
默认值
配置说明
crashkernel=x
在4G以下的物理内存预留x大小的内存给kdump使用。
x86版本默认配置512M
该配置方法只在4G以下内存预留,必须保证4G以下连续可用内存足够预留。
crashkernel=x@y
在y起始地址预留x大小的内存给kdump使用。
未使用
需要确保y起始地址的x大小的内存未被其他模块预留。
crashkernel=x,high
在4G以下的物理内存中预留256M内存,在4G以上预留x大小内存给kdump使用。
Arm64版本默认配置1024M,high
需要确保4G以下有256M连续可用的物理内存,4G以上有连续的x大小的连续物理内存。实际预留内存大小为256M+x。
crashkernel=x,low crashkernel=y,high
在4G以下的物理内存中预留x大小,在4G以上预留y大小内存给kdump使用。
未使用
需要确保4G以下有连续的x大小物理内存,4G以上有连续的y大小物理内存。
- 对于CentOS 7.6操作系统,“crashkernel”参数值可以配置为“auto”,表示可以根据系统内存来配置crashkernel大小。
- 如果系统的内存小于等于8GB,对kdump kernel不会保留任何内容(等同于关闭kdump)。
- 如果系统的内存大于8GB但小于等于16GB,crashkernel=auto会保留256M,等同于crashkernel=256M。
- 如果系统内存大于16GB,crashkernel=auto会保留512M,等同于crashkernel=512M。
crashkernel的大小一般为2的整数次幂大小,如128M,256M,512M,768M,1024M,2048M等。配置crashkernel大小有两种方式:
方式一:通过修改“/etc/default/grub”文件,此方法会使所有内核的配置都修改。- 打开grub文件。
vi /etc/default/grub
- 按“i”进入编辑模式,添加或修改GRUB_CMDLINE_LINUX中的“crashkernel”参数,此处以修改为“1024M,high”为例。
crashkernel=1024M,high
配置的crashkernel大小需要根据实际情况调整。太大可能导致内核无法分配crashkernel所需的空间,进而导致kdump服务启动失败,太小则可能导致捕获内核无法正常启动。
- 按“Esc”键退出编辑模式,输入:wq!并按“Enter”键保存退出文件。
- 使用grub2-mkconfig命令重新生成系统grub.cfg文件。
grub2-mkconfig -o /boot/efi/EFI/openEuler/grub.cfg
方式二:通过修改grub.cfg文件中相应内核的grub启动命令。
- 打开grub.cfg文件。
vi /boot/efi/EFI/openEuler/grub.cfg
- 按“i”进入编辑模式,找到目标内核的grub启动命令,添加或修改“crashkernel”参数。
例如下图中的“'openEuler (5.10.0-60.18.0.50.oe2203.aarch64) 22.03 LTS'”的配置项,找到linux命令中的“crashkernel”参数,如果没有则自行添加该参数。
crashkernel=1024M,high
- 按“Esc”键退出编辑模式,输入:wq!并按“Enter”键保存退出文件。
- 重启服务器,使配置生效。
- 验证kdump是否开启。
- 重启服务器,查看当前kdump的配置。
1 2 3
systemctl start kdump.service systemctl enable kdump.service systemctl status kdump.service
如出现“No memory reserved for crash kernel”报错信息如下图所示,则可能是因为crashkernel配置不当,预留空间不足以crashkernel使用,此时需要重新修改crashkernel参数。
- 验证kdump,输入下述命令会导致Linux内核崩溃,并且kdump文件生成到默认目录“/var/crash”下,若成功生成相关vmcore文件,则kdump已成功开启。
1 2
echo 1 > /proc/sys/kernel/sysrq echo c > /proc/sysrq-trigger
- 重启服务器,查看当前kdump的配置。