kexec/kdump/crash 组合是 Linux 内核故障排查中的黄金方案, kexec 能让系统在内核崩溃时无需 BIOS 重启,直接切换到预先加载的小内核(kdump kernel),该小内核负责将主内核崩溃时的内存(vmcore)转储到磁盘等介质。转储得到的 vmcore 文件包含了崩溃时的完整内核内存快照。随后,工程师可利用 crash 工具离线分析 vmcore,对内核数据结构、堆栈、寄存器等进行深入排查,定位产生崩溃的根因。这种方式的最大优势在于不影响主机硬件状态,大大提升了故障恢复与分析的速度和准确性,尤其适合生产环境和高可用系统的自动化故障处理。同时,crash 工具提供的丰富命令可辅助快速定位问题,让内核调试从”黑盒”变为”白盒”

crash 也支持 live 模式,即在未发生崩溃时直接分析正在运行的内核。此时 crash 通过解析带符号表的 vmlinux 和 /proc/kcore 文件,读取当前内核的内存与数据结构,实现对内核的实时调试和状态观察。Live 模式的优势在于无需等待或模拟系统崩溃,随时可以用于排查内核级别的问题,如内存泄漏、进程死锁、数据结构异常等。它为开发、测试和线上运维提供了极大便利,能够在不中断服务的前提下,获得类似 gdb 的强大分析能力。crash live 还支持多种内核版本,且仅以只读方式访问内存,保证系统安全稳定,是内核开发和高级运维不可或缺的工具。本文档介绍如何在 BiscuitOS 使用这些工具调试内核, 参考如下命令(在部署之前请确保已经部署 BiscuitOS 开发环境,如果未部署请参考 《BiscuitOS 用户手册 - 1.2》:

# 切换到 BiscuitOS 项目目录
cd */BiscuitOS
# 选择开发环境,如果已经选择过可以跳过,这里与 linux 6.10 X86 为例
make linux-6.10-x86_64_defconfig
make docker
# 通过 Kbuild 选择需要部署的应用程序
make menuconfig

  [*] DIY BiscuitOS/Broiler Hardware  --->
      (4096) Memory Size(MiB)
      (crashkernel=512M) CMDLINE on Kernel
  [*] Package  --->
      [*] BiscuitOS Debug Stub Set
          [*] BiscuitOS Linux CRASH Kernel

# 配置完毕保存,然后进行部署
make

# 切换到实践案例所在目录
cd /BiscuitOS/output/linux-6.10-x86_64/package/BiscuitOS-DEBUG-CRASH-default
# 编译实践案例
make download
# 安装基础工具
make
# 安装依赖组件
make prepare
# 安装到 BiscuitOS
make build

当系统启动之后,KEXEC 工具自动运行,此时可以使用 “echo c > /proc/sysrq-trigger” 命令验证一下 KDUMP 释放有效,如果生效,那么可以看到执行这个命令之后,系统会生成一个 PANIC,然后立即启动一个 KDUMP Kernel.

如上图,使用 “cat /proc/cmdline” 查看 CMDLINE,如何看到 “BiscuitOS-KDUMP” 字段,那么说明 KDUMP Kernel 启动成功. 接下来生成 COREDUMP, 使用如下命令:

# 将 COREDUMP 转储到指定目录
cp /proc/vmcore /mnt/HOST-BiscuitOS/Hardware/BiscuitOS-KDUMP.core

这样可以在 “/BiscuitOS/output/linux-6.10-x86_64/Hardware/BiscuitOS-KDUMP.core” 获得转储的 Coredump,接下来可以在系统外使用如下命令分析 CORE:

# 切换到 COREDUMP 目录
cd /BiscuitOS/output/linux-6.10-x86_64/Hardware/
# 使用 CRASH 分析
crash BiscuitOS-vmlinux BiscuitOS-KDUMP.core

接下来就是使用 CRASH 命令白盒分析 PANIC 现场,这里不做过多分析. 如果不想生成 COREDUMP,而是直接在 Kdump Kernel 里直接分析 PANIC,可以使用如下命令:

# 切换到 COREDUMP 目录
cd /mnt/HOST-BiscuitOS/Hardware/
# 使用 CRASH 分析
sudo crash BiscuitOS-vmlinux /proc/vmcore

这种方法可以节省存储空间,但由于 Kdump Kernel 资源有限,调试比较慢,这只适合无法转储到磁盘的场景.

CRASH LIVE 的场景是在系统没有发生 PANIC 启动 Kdump Kernel 的场景,可以使用 CRASH 直接在线调试内核,对分析一些卡死场景比较有效. 参考如下命令:

# 切换到 vmlinux 目录
cd /mnt/HOST-BiscuitOS/Hardware/
# 使用 CRASH 分析
crash BiscuitOS-vmlinux

可以使用 CRASH 相关命令在线调试内核,对分析类似死锁问题有很大的帮助.