Linux系统崩溃时保存完整内存快照必须用kdump,因其通过预留crashkernel内存加载捕获内核实现,而普通core dump仅限用户态进程且systemctl在panic后已不可用;需验证/proc/cmdline含crashkernel、/sys/kernel/kexec_crash_size非零、/proc/meminfo有CrashKernel行,并确保捕获内核已加载、initramfs含必要模块、转储路径空间充足且配置生效。

Linux 系统崩溃时保存完整内存快照,必须用 kdump,不是普通进程的 core dump,也不是 systemctl 能在 panic 后调用的工具——崩溃时 systemd 已终止,所有用户空间服务(包括 systemctl)都不可用。
确认内核支持并预留 crashkernel 内存
kdump 依赖主内核启动时预留一块专用内存来加载捕获内核。没预留,整个机制就无效。
- 检查是否已生效:运行
grep crashkernel /proc/cmdline,应有类似crashkernel=256M的输出 - 验证内存是否真实分配:读
/sys/kernel/kexec_crash_size,返回值必须是非零数字(单位字节),如268435456 - 再看
grep Crash /proc/meminfo,应显示类似CrashKernel: 256000 kB - 常见问题:ARM64 或云环境(如 Alibaba Cloud Linux 3)中
crashkernel=auto可能失败,建议改用分段式,例如crashkernel=0M-2G:0M,2G-8G:192M,8G-:256M - 改完
/etc/default/grub后,必须执行update-grub(Debian/Ubuntu)或grub2-mkconfig -o /boot/grub2/grub.cfg(RHEL/CentOS),然后重启
安装并启用 kdump 服务
不同发行版安装和启用方式略有差异,但核心目标一致:让捕获内核成功加载进内存。
- Ubuntu/Debian:
sudo apt install linux-crashdump,安装后服务通常自动启用 - RHEL/CentOS/Fedora:
sudo dnf install kexec-tools,再执行sudo systemctl enable --now kdump - 检查状态不能只看
systemctl status kdump显示 active (exited),要查日志末尾是否有Loaded kdump kernel:;也可用kdumpctl status,输出应为Kdump is operational. - 升级内核后必须重建 initramfs:
kdumpctl force-rebuild(RHEL系)或dracut -f --regenerate-all(部分系统) - 验证 initramfs 是否含必要模块:
lsinitrd /boot/initramfs-$(uname -r)kdump.img | grep -i "kdump\|crash\|makedumpfile",至少要有 makedumpfile 和对应平台驱动
配置转储路径与存储方式
/etc/kdump.conf 中的 path 不是“写哪儿就存哪儿”,它受底层条件严格限制。
- 本地路径(如
path /var/crash):确保该分区剩余空间 ≥ 物理内存大小;推荐单独挂载、不配 noatime/nobarrier 等可能影响写入稳定性的选项 - NFS/SSH 存储:需在
/etc/kdump.conf中配置net user@server:/path或net server:/export,修改后必须重建 initramfs,否则新配置不生效 - 若使用压缩(
core_collector makedumpfile -c --message-level 1 -d 31),可节省约 50–70% 空间,但会略微延长转储时间 - 避免静默失败:添加
default reboot(崩溃后自动重启)或default halt(停机便于手动取文件),方便确认是否真正触发了转储
验证与测试
配置完成后,别跳过实测。安全的方式是触发一次可控 panic:
- 先确保
sysctl kernel.sysrq = 1已启用 - 执行
echo c > /proc/sysrq-trigger(需 root 权限),系统将立即 panic 并启动 kdump 流程 - 重启后检查
/var/crash/下是否有以日期命名的新目录,内含vmcore或vmcore-dmesg.txt - 用
crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/crash/*/vmcore打开分析,输入bt查看崩溃时的内核堆栈


















