kdump 是唯一被主流发行版正式支持的内核崩溃转储机制,通过预加载捕获内核保存内存镜像(vmcore),供 crash 工具分析崩溃时内核态及服务状态,而非依赖已终止的 systemctl。

kdump 是唯一被主流发行版(RHEL、Fedora CoreOS、Ubuntu、SLES)正式支持的内核崩溃转储机制,“kdmp”是常见拼写错误,实际不存在该机制。
系统内核崩溃时,systemctl 本身无法导出运行期单元快照——因为崩溃后 systemd 主进程(PID 1)已终止,所有用户空间服务(包括 systemctl)均不可用。此时真正起作用的是 kdump 机制,它在崩溃前就已预加载独立的捕获内核(capture kernel),专用于安全转储内存镜像(vmcore)。
所以,问题本质不是“用 systemctl 在崩溃时导出快照”,而是:如何配置 kdump,使其在内核崩溃后自动保存系统状态(含内核内存、任务上下文、模块信息等),以便事后用 crash 工具分析当时所有活跃单元和内核态行为。
确保 crashkernel 内存预留生效
没有预留内存,kdump 根本无法启动,后续一切无效。 验证命令: ```bash grep crashkernel /proc/cmdline ``` 若无输出,说明未预留。需按架构设置并更新 grub:- x86_64 普通服务器(≥4GB 内存):
crashkernel=300M - ≥16GB 内存:
crashkernel=512M - ARM64 / 龙芯等:必须指定偏移,如
crashkernel=256M@32M
修改 /etc/default/grub 后,必须执行:
# BIOS 系统 sudo grub2-mkconfig -o /boot/grub2/grub.cfg # UEFI 系统 sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
Fedora CoreOS 等不可变系统请用:
sudo rpm-ostree kargs --append=crashkernel=300M && sudo systemctl reboot
重启后再次 grep crashkernel /proc/cmdline 确认生效。
启用并验证 kdump 服务
kdump 服务本身不管理“单元快照”,但它负责: - 启动捕获内核 - 将崩溃内存写入指定路径(如 `/var/crash/`) - 记录崩溃时刻的 dmesg 和基本系统元数据操作步骤:
sudo systemctl enable kdump sudo systemctl start kdump sudo systemctl status kdump # 应显示 active (exited),非 failed
若报 Failed to reserve crashkernel memory,说明上一步内存预留失败,需回溯排查。
崩溃后获取可分析的“运行期状态”
kdump 生成的 `vmcore` 文件包含崩溃瞬间完整的物理内存镜像。配合 `crash` 工具,可还原出: - 所有内核线程(`ps`)及其调用栈 - 加载的内核模块及状态 - 内存中残留的服务进程(如 systemd、sshd、nginx 的 task_struct) - 甚至部分用户空间堆栈(取决于内存保留完整性)典型分析流程:
# 安装 crash 工具(RHEL/Fedora) sudo dnf install crash kernel-debuginfo # 进入 vmcore 目录(如 /var/crash/$(hostname)-$(date)/) crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux vmcore # 在 crash shell 中查看: crash> ps # 类似 top,列出所有内核线程与关联进程 crash> kmem -i # 查看内存使用概况 crash> log # 输出崩溃前最后的 dmesg crash> bt -a # 显示所有 CPU 的完整调用栈(关键诊断依据)
这比“systemctl list-units”更底层、更真实——因为它来自内存快照,而非运行中的 systemd 实例。
补充:紧急模式(emergency.target)≠ 内核崩溃
注意区分两个场景: - **内核崩溃(kernel panic/Oops)** → 触发 kdump → 生成 vmcore → 用 crash 分析 - **启动失败卡在 emergency mode** → systemd 仍在运行 → 可直接用 `systemctl --failed`、`journalctl -xb`、`systemctl list-units --state=running` 查看当前活跃单元后者无需 kdump,前者完全绕过 systemd——崩溃时它已不存在。
不复杂但容易忽略:kdump 不是“systemctl 的一个功能”,而是独立于主内核的救援环境;它的价值不在“导出快照”,而在保全崩溃现场的原始内存证据。











