简述 Kernel 的 Kdump 机制并解决 No memory reserved for crash kernel
起因
有一台主机偶尔会莫名的崩溃,可 kdump.service 服务偏偏一直无法正常启动,查不到原因,systemctl 日志如下(仅保留关键信息):
● kdump.service - Crash recovery kernel arming
Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled)
Sep 20 01:51:43 systemd[1]: Starting Crash recovery kernel arming...
Sep 20 01:51:43 kdumpctl[3371]: No memory reserved for crash kernel
Sep 20 01:51:43 kdumpctl[3371]: Starting kdump: [FAILED]
Sep 20 01:51:43 systemd[1]: kdump.service: main process exited, code=exited, status=1/FAILURE
Sep 20 01:51:43 systemd[1]: Failed to start Crash recovery kernel arming.
Sep 20 01:51:43 systemd[1]: Unit kdump.service entered failed state.
Sep 20 01:51:43 systemd[1]: kdump.service failed.
**No memory reserved for crash kernel
没有为崩溃内核保留的内存**
关于 Kdump
在解决问题前有必要先了解一下 Kdump ,以下内容参考 Wikipedia - kdump 和 ArchWiki - Kdump
Kdump 基于 Kexec 是 Linux 内核的一个功能,在内核崩溃的情况下,Kdump 会引导另一个 Linux 内核 (捕获内核),再通过新内核导出和保存内存转储,之后就可以配合 crash 进行分析了。
在系统内核启动时,必须在将要装入捕获内核的地方保留一些物理内存,并且要提前加载转储捕获内核,因为在发生崩溃的那一刻,由于内核已损坏,无法从磁盘读取任何数据。
到这里,在开头所出现的问题原因就很明确了。
解决过程
查看内核启动参数
cat /proc/cmdline
输出:
BOOT_IMAGE=/boot/vmlinuz-5.8.10-1.el7.elrepo.x86_64 root=UUID=59d9ca7b-4f39-4c0c-9334-c56c182076b5 ro crashkernel=auto net.ifnames=0 console=tty0 console=ttyS0,115200n8
crashkernel=auto 意味着保留内存由系统自动分配,根据 Redhat Customer Portal 中 Memory requirements for kdump 可知 kdump 对内存大小有一定要求,在大多数平台中,若物理内存小于 2GB(并不是文章所谓的 8GB),是不会自动分配保留内存的。
这种情况下需要制定保留内存大小,如 crashkernel=128M
编辑引导配置修改内核启动参数
以下操作务必慎重
我所用的是 grub2 引导,因此编辑文件 /boot/grub2/grub.cfg 即可,其他引导程序可能在不同的位置
vi /boot/grub2/grub.cfg
修改后
linux16 /boot/vmlinuz-5.8.10-1.el7.elrepo.x86_64 root=UUID=59d9ca7b-4f39-4c0c-9334-c56c182076b5 ro crashkernel=128M net.ifnames=0 console=tty0 console=ttyS0,115200n8
使配置生效并重启
grub2-mkconfig -o /boot/grub2/grub.cfg&&reboot
查看服务状态
systemctl status kdump.service
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »