什么是 kdump
kdump 是 Linux 的崩溃转储机制:系统启动时通过 crashkernel= 参数预留一块内核不使用的内存,并在其中常驻一个捕获内核;当主内核 panic 或触发 sysrq 崩溃时,捕获内核接管并把内存镜像写成 vmcore。与事后靠日志猜测相比,vmcore 能用 crash 工具还原调用栈,是定位内核态故障的可靠依据。
基本信息
| 内核参数 | crashkernel=(/etc/default/grub 或 grubby 配置) |
|---|---|
| 服务 | kdump.service(Debian 系为 kdump-tools) |
| 加载状态 | /sys/kernel/kexec_crash_loaded 为 1 表示就绪 |
| 默认产物 | /var/crash/<时间>/vmcore |
| 分析工具 | crash、drgn(需匹配版本的 vmlinux 与 debuginfo |
典型使用场景
- 生产机器内核 panic 后需要还原原因,而不是只看到重启记录
- 内核升级、驱动或文件系统上线前做验证,确保崩溃时可取证
- 排查疑似内核 bug:配合 sysrq-trigger 主动触发一次崩溃做演练
- 合规与审计要求保留系统崩溃证据链
- 容器宿主与虚拟化节点的稳定性分析
检查与验证
检查与验证
grep -o 'crashkernel=[^ ]*' /proc/cmdline # 是否预留了内存
cat /sys/kernel/kexec_crash_loaded # 1=捕获内核已加载
systemctl is-active kdump # 服务状态
ls -lh /var/crash/ 2>/dev/null | head # 已有转储与目标空间
systemctl status kdump | head -5 # 启动失败原因常在此
# 演练:echo c > /proc/sysrq-trigger(测试机专用,会立即宕机)状态判读与处置
| 检查项 | 正常值 | 异常时 |
|---|---|---|
| crashkernel | 形如 crashkernel=512M 或 auto | 为空说明未预留,配置后须重启生效 |
| kexec_crash_loaded | 1 | 为 0 说明服务未成功加载,看 kdump 服务日志 |
| kdump.service | active (exited) | failed 常见原因是预留不足或目标目录不可写 |
| /var/crash 剩余空间 | 大于 vmcore 估计大小 | 空间不足会转储失败,可改 dump_path 到独立分区 |
只做了配置从没验证过:需要实际触发一次或至少确认 kexec_crash_loaded=1,否则故障当天才发现转储不可用。
crashkernel 预留值需按内存规模与内核大小选:过小加载失败,过大白白占内存;部分发行版支持 crashkernel=auto 自动估算。
转储目标可以在配置文件里改(RHEL 系为 kdumpctl 与 /etc/kdump.conf,可指定本地路径、NFS、raw 设备或 ssh 目标);走 ssh 时需预置免密密钥,否则崩溃现场才发现写入失败。Debian 系由 kdump-tools 提供,配置文件路径以该发行版文档为准。