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>版权协议,商业转载请联系作者获得授权,非商业转载请附上原文出处链接及本声明。

浙公网安备 33010602011771号