完整解析 Linux Kdump Crash Kernel 工作原理和实操步骤
完整解析 Linux Kdump Crash Kernel 工作原理和实操步骤
一、前言
在使用 Linux 操作系统进行内核开发或者系统维护时,内核 panic 是最常见的系统崩溃环节。如果想要在内核崩溃后立即分析环境和输出内核内存 dump,Kdump + crashkernel 是最接近完美的解决方案。
二、基础概念
2.1 Kdump 是什么?
Kdump 是 Linux 封装的一套 Kernel crash dump 处理方案,它基于 kexec 技术,将一个备用内核 (crash kernel)
载入到内存中,当主内核发生 panic 时自动启动该内核,然后从原先内核剩余内存中抽取重要信息,保存为 vmcore dump 文件。
2.2 crashkernel 参数是什么?
crashkernel 是在内核启动参数中指定的内存块,用于载入备用内核,避免被主内核占用。如:
crashkernel=512M
表示为备用内核预留 512MB 内存地址空间。
三、工作原理
3.1 总体流程图
- 主内核启动
- 根据
crashkernel=512M
在 bootloader (u-boot/grub) 时期预留内存 - 主内核运行 kexec -p 载入备用内核
- 主内核发生 panic,启动 kdump kernel
- kdump kernel 通过 /proc/vmcore 读取主内核内存 dump
- 存储成 /var/crash/日期/vmcore
3.2 kexec 的角色
kexec 是 Linux 内核中的系统转换进程接口,用于在环境不重启情况下加载新内核,它支持两种模式:
- 正常模式:
kexec -l
加载新内核、kexec -e
执行 - panic 模式:
kexec -p
加载 crash kernel
四、实操步骤
4.1 启用 crashkernel 参数
- 修改 bootargs,添加
crashkernel=512M
- 重启系统,确认:
cat /proc/iomem | grep -i crash
应有类似输出:
88000000-8fffffff : Crash kernel
4.2 配置 kdump kernel
4.2.1 构建 initramfs 版本
Yocto/切换 initramfs 完全自启动的 kernel:
bitbake -c populate_initramfs kernel
会生成
/tmp/deploy/images/<machine>/Image-initramfs-<machine>.bin
4.2.2 载入 crash kernel
kexec -p /boot/Image-initramfs --append="root=/dev/mmcblk2p2 maxcpus=1 irqpoll nousb console=ttymxc1,115200"
4.2.3 检查是否载入
cat /sys/kernel/kexec_crash_loaded
输出 1
表示成功
4.3 启动 crash kernel 测试
4.3.1 切换到 crash kernel
echo c > /proc/sysrq-trigger
4.3.2 重点:设置内核自动 panic 后重启
echo 10 > /proc/sys/kernel/panic
4.3.3 输出观察
Starting crashdump kernel...
Bye!
4.4 删除后旧 dump
mkdir -p /var/crash
makedumpfile /proc/vmcore /var/crash/vmcore --dump-dmesg
五、常见问题
5.1 kexec: Can’t open (/proc/kcore)
- 这是 Warning,如果 kexec -p 成功,不影响使用
5.2 crash kernel 启动后卡死
- initramfs 未启动或 init 文件不存在
- 确保 /init 可执行,且 busybox 包含基本命令
5.3 没有 /proc/vmcore
- 不是用 initramfs 启动,或内核未启动 /proc/vmcore 配置
六、经典配置示例
Yocto kernel 展示
KERNEL_FEATURES:append = " features/kdump/kdump.scc"
initramfs kernel 本身启动
IMAGE_FSTYPES = "cpio.gz"
INITRAMFS_IMAGE = "kdump-initramfs"
七、结论
Kdump 是 Linux 内核系统常见敏感地段的重要分析工具,选择适合的 initramfs 和 crash kernel 就能在系统崩溃时提供重要和时效的调试信息,展示了 Linux 内核功能与系统办法的实力。