预留 crash kernel 内存是前提,需通过 crashkernel 参数在 grub 中配置自动或手动预留,并更新重启;安装 kdump 工具、配置 /etc/kdump.conf、启用服务后,用 sysrq 触发崩溃验证 vmcore 生成;分析需匹配 vmlinux 和 debuginfo,用 crash 工具执行 bt -a、log 等命令定位根因。

预留 crash kernel 内存是前提
系统必须为捕获内核提前保留一块专用内存,否则崩溃时无法启动第二个内核。这个动作由内核启动参数 crashkernel 控制,写在 GRUB 配置中。
常见配置方式有两类:
-
自动分配:设为
crashkernel=auto,内核根据总内存大小按策略预留(例如 2GB 以上内存通常预留 128MB) -
手动指定:如
crashkernel=256M@16M,表示从物理地址 16MB 起预留 256MB;注意起始地址需 2MB 对齐,且不能与已保留内存重叠
配置后必须更新 GRUB 并重启生效。验证是否成功:运行 cat /proc/cmdline 确认参数存在,再查 dmesg | grep -i crash 看到类似 crashkernel reserved: 0x0000000001000000 - 0x0000000002000000 (256 MB) 即表示预留成功。
kdump 服务安装与转储路径配置
安装 kdump 工具包是基础步骤,不同发行版命令略有差异:
- RHEL/CentOS/AlmaLinux:
yum install kexec-tools或dnf install kexec-tools - Debian/Ubuntu:
apt install linux-crashdump(会自动启用并配置基本项)
核心配置文件是 /etc/kdump.conf,关键设置包括:
-
path /var/crash:指定 vmcore 存放目录(默认,可改为 NFS、SSH 或本地其他路径) -
core_collector makedumpfile -c --message-level 1 -d 31:启用压缩和过滤,减小文件体积 - 若用 NFS:
net my-nfs-server:/export/crash,需确保网络可达且导出权限正确
启用并启动服务:systemctl enable kdump && systemctl start kdump。检查状态:systemctl status kdump 应显示 active (exited),同时 kdumpctl status 可确认捕获内核已加载。
触发与定位 vmcore 文件
为验证整套流程是否就绪,可用 sysrq 主动触发一次可控崩溃:
- 先确保
kernel.sysrq = 1(sysctl kernel.sysrq查看,未启用则echo 1 > /proc/sys/kernel/sysrq) - 执行
echo c > /proc/sysrq-trigger—— 系统将立即 panic 并切换至 crash 内核 - 重启后进入正常系统,查看
/var/crash/下是否生成以时间戳或 IP 命名的子目录,内含vmcore和vmcore-dmesg.txt
若目录为空或报错“no dump target”,需回头检查 kdump.service 是否运行、/etc/kdump.conf 路径是否可写、NFS 挂载是否就绪等。
用 crash 工具分析 vmcore 的关键操作
分析 vmcore 必须配套对应版本的 vmlinux(带调试符号的内核镜像)和 kernel-debuginfo 包。缺一不可:
- 查当前内核:
uname -r - RHEL/CentOS:
yum debuginfo-install kernel-$(uname -r)(或手动下载匹配的 rpm 安装) - Ubuntu:
apt install linux-image-$(uname -r)-dbgsym,符号文件通常位于/usr/lib/debug/boot/vmlinux-$(uname -r)
启动分析会话:
crash /usr/lib/debug/boot/vmlinux-$(uname -r) /var/crash/*/vmcore
常用命令快速定位问题:
-
bt -a:显示所有 CPU 的完整调用栈,找最顶层的 panic 函数或异常地址 -
log:输出内核环形缓冲区日志,常含 panic 前最后几条错误信息 -
ps -A:列出所有进程状态,识别是否有 D 状态(不可中断睡眠)进程卡死 -
mod:查看模块加载情况,结合bt输出判断是否由某驱动引发 -
dis -l <address></address>或sym <symbol></symbol>:反汇编或查符号,用于深入追踪
若看到栈中频繁出现 nf_queue、ipt_do_table 或某硬件驱动名,基本可锁定问题模块。










