内核问题往往不能直接通过GDB等调试工具对程序进行调试,需要先生成vmcore文件,通过调试vmcore,进行问题的定位。
kdump是在系统崩溃、死锁或死机的时候用来转储内存运行参数的一个工具和服务。只有配置了kdump服务,vmcore文件才会生成。下面基于鲲鹏平台在openEuler 22.03 LTS和CentOS 7.6操作系统下介绍kdump的配置方法。
1 | yum install kexec-tools -y |
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大小物理内存。 |
crashkernel的大小一般为2的整数次幂大小,如128M,256M,512M,768M,1024M,2048M等。配置crashkernel大小有两种方式:
vi /etc/default/grub
crashkernel=1024M,high
配置的crashkernel大小需要根据实际情况调整。太大可能导致内核无法分配crashkernel所需的空间,进而导致kdump服务启动失败,太小则可能导致捕获内核无法正常启动。
grub2-mkconfig -o /boot/efi/EFI/openEuler/grub.cfg
方式二:通过修改grub.cfg文件中相应内核的grub启动命令。
vi /boot/efi/EFI/openEuler/grub.cfg
例如下图中的“'openEuler (5.10.0-60.18.0.50.oe2203.aarch64) 22.03 LTS'”的配置项,找到linux命令中的“crashkernel”参数,如果没有则自行添加该参数。
crashkernel=1024M,high
1 2 3 | systemctl start kdump.service systemctl enable kdump.service systemctl status kdump.service |
如出现“No memory reserved for crash kernel”报错信息如下图所示,则可能是因为crashkernel配置不当,预留空间不足以crashkernel使用,此时需要重新修改crashkernel参数。
1 2 | echo 1 > /proc/sys/kernel/sysrq echo c > /proc/sysrq-trigger |