Linux服务器远程崩溃查看dmesg实践及踩坑(No memory reserved for crash kernel及Memory for crashkernel is not reserved)

  • 1. 基本方法
  • 2. Cent OS 8 Kdump配置实践与踩坑
  • 2.1 错误定位
  • 2.2 解决方案


在进行内核开发的时候,性能测试必须将内核模块部署到远程服务器上,一旦崩溃,难以定位错误。本文介绍配置kdump工具进行崩溃记录的方法。话不多说,直接开始

1. 基本方法

一般来说我们利用kdump工具进行崩溃后记录,kdump的主要原理就是在内核崩溃后,启动一个小内核来转储内存dmesg的信息。其基本配置方法已经有多篇文章进行介绍,我们这里不再赘述,仅给出链接:

  • Linux内核崩溃重启后查看上次的dmesg
  • Linux内核panic后查看dmesg
  • CentOS7配置kdump

2. Cent OS 8 Kdump配置实践与踩坑

博主使用Cent OS 8服务器,在完成上面操作配置过程后,一直报错,这是/etc/default/grub的配置(参考Linux内核panic后查看dmesg):

dmesg查看按照时间 查看dmesg日志_服务器


接下来运行(参考CentOS7配置kdump):

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

reboot后,启用服务,但是服务无法启动

dmesg查看按照时间 查看dmesg日志_linux_02


这里报错:No memory reserved for crash kernel

2.1 错误定位

如果直接查看解决方案,请移步2.2节

好,现在就离谱了,我明明改了/etc/default/grubcrashkernel,但为啥仍然报错呢?

难道是grub没生效?运行下述命令:

[deadpool@localhost hunter-kernel]$ cat /proc/cmdline

BOOT_IMAGE=(hd0,gpt4)/vmlinuz-5.1.0 
root=/dev/mapper/cl-root ro crashkernel=auto 
resume=/dev/mapper/cl-swap 
rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet

可以看到,这里的crashkernel纹丝不动,还是auto,开始疑惑了……无意间想到可能除了grub之外还有其他bootloader,运行下述命令:

[deadpool@localhost hunter-kernel]$ ls /boot/
...
efi                                                  
grub2 
...

好家伙,除了有个grub2,那里还有个efi,顺着efi目录找下去,找到了另一个grub.cfg/boot/efi/EFI/centos/grub.cfgvim打开文件查看,发现其kernelopts正是:

root=/dev/mapper/cl-root ro crashkernel=auto 
resume=/dev/mapper/cl-swap 
rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet

破案了,接下来的任务就是修改/boot/efi/EFI/centos/grub.cfg

重新运行命令:

sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

重启后仍然报错,要崩溃了,怎么回事呢?难道是也不是这个grub.cfg,验证一下(下面的crashkernel博主修改为了768M):

[deadpool@localhost hunter-kernel]$ cat /proc/cmdline

BOOT_IMAGE=(hd0,gpt4)/vmlinuz-5.1.0 
root=/dev/mapper/cl-root ro crashkernel=768M 
resume=/dev/mapper/cl-swap 
rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet

这说明grub.cfg修改正确……到底是怎么回事呢?我决定查看一下内核日志

[deadpool@localhost hunter-kernel]$ dmesg | grep crashkernel
...
[    0.014088] Memory for crashkernel is not reserved
...

原来如此,这就可能是crashkernel的内存设置大小不对,可以参考这里
于是博主修改为512M(博主机器有128GB内存),重新进行配置步骤,成功了,Working Like a Charm。

2.2 解决方案

重新修改crashkernel大小为512M:

dmesg查看按照时间 查看dmesg日志_运维_03


运行下述指令(首先确定你的机器用的grub.cfg文件到底是哪个,博主的应该是/boot/efi/EFI/centos/grub.cfg,见2.1节):

sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

接下来重启机器

sudo reboot

dmesg确认crashkernel内存已经保留:

[deadpool@localhost hunter-kernel]$ dmesg | grep crash
...
[    0.014088] Reserving 512MB of memory at 128MB for crashkernel (System RAM: 130690MB)
...

开启kdump服务

systemctl start kdump.service

查看:

dmesg查看按照时间 查看dmesg日志_服务器_04


OK,从现在开始,我们就可以起飞了🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫