通过crash_kexec_post_notifiers参数配置解决系统未生成vmcore文件的问题

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文以Alibaba Cloud Linux 3系统为例,介绍了通过配置crash_kexec_post_notifiers参数来解决系统未生成vmcore文件的问题。

操作系统限制

  • Alibaba Cloud Linux 3

  • Anolis OS 8.x

问题现象

当系统发生Panic且crash_kexec_post_notifiers参数值为Y时,没有生成vmcore文件。

问题原因

当系统发生Panic且crash_kexec_post_notifiers参数值为Y时,当前Panic内核跳转到kdump内核之前将执行Panic Notifiers,这些Notifiers函数出现错误导致无法生成vmcore(例如Notifiers引发了死锁)。

说明
  • Panic

    指操作系统遇到一个严重的、无法安全恢复的错误时所采取的一种紧急措施。

  • Panic Notifiers

    Linux内核中的一个机制,它允许注册的模块或者系统组件在内核发生严重错误(导致Panic)并即将重启或跳转到kdump内核前执行特定的回调函数用来执行一些资源清理、故障信息记录(比如写入日志)、系统状态收集等操作。

  • kdump

    Linux系统中用于提高系统可靠性和故障排查能力的重要组件。

  • vmcore

    Linux系统中,内核崩溃时通过内核的崩溃转储机制生成的一个内存映像文件。

解决方案

  1. 查看kdump服务状态。

    sudo kdumpctl status

    回显信息说明如下:

    • 回显信息为kdump: Kdump is operational,表示服务正常运行。

    • 回显信息为kdump: Kdump is not operational,表示服务未运行,启动kdump服务。

      sudo kdumpctl start
  2. 系统Panic后,查看是否生成vmcore

    <ip-time>需替换为存放vmcore的文件夹名,例如127.0.0.1-2024-10-11-15:46:52

    ls /var/crash/<ip-time>

    未生成vmcore:关闭crash_kexec_post_notifiers观察是否生成vmcore

    • 临时关闭crash_kexec_post_notifiers配置。

      sudo sh -c 'echo N > /sys/module/kernel/parameters/crash_kexec_post_notifiers'
    • 持久化关闭crash_kexec_post_notifiers配置。

      1. 关闭crash_kexec_post_notifiers配置。

        sudo grubby --update-kernel="/boot/vmlinuz-$(uname -r)" --args="crash_kexec_post_notifiers=N"
      2. 重启ECS实例,使配置生效。

        警告

        重启实例将导致您的实例暂停运行,这可能引发业务中断和数据丢失。因此,建议您在执行此操作之前备份关键数据,并选择在非业务高峰期进行。

        sudo reboot
  3. 若关闭crash_kexec_post_notifiers还未生成vmcore,则可能由于其他原因导致该问题,需要通过kdumpctl工具排查具体原因。具体操作,请参见使用kdumpctl工具查看内核崩溃转储的启动日志