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
参数通过memblock
或ioremap
保留内存,捕获内核通过/proc/iomem
识别保留区域。 - 内核配置优化
捕获内核需精简(禁用模块、非必要驱动),避免资源竞争。例如,配置CONFIG_CRASH_DUMP
和CONFIG_PROC_VMCORE
支持转储功能。
7. 调试与配置
- 验证预留内存
dmesg | grep -i crash
或cat /proc/iomem | grep "Crash kernel"
。 - 手动触发测试
echo c > /proc/sysrq-trigger
主动引发崩溃,观察是否生成vmcore
。 - 常见问题:
- 预留内存不足:调整
crashkernel
大小。 - 捕获内核无法启动:检查
kexec -p
加载的镜像路径及参数。
- 预留内存不足:调整
作者:wanghongwei
版权声明:本作品遵循<CC BY-NC-ND 4.0>版权协议,商业转载请联系作者获得授权,非商业转载请附上原文出处链接及本声明。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统