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):
接下来运行(参考CentOS7配置kdump):
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
后,启用服务,但是服务无法启动:
这里报错:No memory reserved for crash kernel
2.1 错误定位
如果直接查看解决方案,请移步2.2节
好,现在就离谱了,我明明改了/etc/default/grub
的crashkernel
,但为啥仍然报错呢?
难道是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.cfg
,vim
打开文件查看,发现其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:
运行下述指令(首先确定你的机器用的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
查看:
OK,从现在开始,我们就可以起飞了🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫