Kdump工作原理介绍

1. 系统启动与内存预留

  • 预留内存

    通过内核启动参数 crashkernel=Y@X(如 crashkernel=256M)预留一块内存区域。该区域在系统启动时由主内核保留,不被常规内存管理分配,专供捕获内核使用。

  • 加载捕获内核

    主内核启动后,用户空间工具(如 kexec-tools)通过 kexec -p 命令将捕获内核的镜像(vmlinuz)和初始 RAM 磁盘(initrd)加载到预留内存中。此过程绕过 BIOS,直接由内核完成。

2. 主内核崩溃触发机制

  • 触发条件

    当主内核遇到严重错误(如 panic、oops、硬件故障)时,触发崩溃流程。此时,内核调用 crash_smp_send_stop() 停止其他 CPU,确保单线程执行崩溃处理。

  • 切换至捕获内核

    主内核通过 kexec 机制跳转到预留内存中的捕获内核入口点,避免常规重启(否则内存内容会丢失)。

3. 捕获内核启动

  • 独立运行环境

    捕获内核在预留内存中启动,其启动参数通过 append 指定(如 nr_cpus=1 限制 CPU 数量,disable_mtrr_trim 禁用可能破坏内存的操作)。

  • 内存保护机制

    捕获内核将主内核的内存标记为 保留区域(通过 elfcorehdr 结构描述),确保自身初始化时不会覆盖这些区域。

4. 内存转储生成

  • 收集内存数据

    捕获内核启动后,用户空间脚本(如 /usr/bin/makedumpfile)读取主内核的物理内存,过滤无用页(如空页、缓存页),生成压缩的 vmcore 文件。

  • 存储转储文件

    vmcore 通常保存到本地磁盘(如 /var/crash/)或远程服务器(通过 NFS/SSH)。此过程需捕获内核挂载文件系统,依赖相关驱动。

5. 系统恢复

  • 自动重启

    转储完成后,捕获内核触发系统重启,恢复至正常状态。用户可通过 crash 工具分析 vmcore,诊断崩溃原因。

6. 关键技术点

  • kexec 机制
    分为 冷启动(冷重启)和 热启动(直接跳转)。Kdump 使用热启动,通过 kexec_load() 系统调用预加载捕获内核。
  • 内存保留
    主内核的 crashkernel 参数通过 memblockioremap 保留内存,捕获内核通过 /proc/iomem 识别保留区域。
  • 内核配置优化
    捕获内核需精简(禁用模块、非必要驱动),避免资源竞争。例如,配置 CONFIG_CRASH_DUMPCONFIG_PROC_VMCORE 支持转储功能。

7. 调试与配置

  • 验证预留内存
    dmesg | grep -i crashcat /proc/iomem | grep "Crash kernel"
  • 手动触发测试
    echo c > /proc/sysrq-trigger 主动引发崩溃,观察是否生成 vmcore
  • 常见问题
    • 预留内存不足:调整 crashkernel 大小。
    • 捕获内核无法启动:检查 kexec -p 加载的镜像路径及参数。
posted @   wanghongwei-dev  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示