内核 panic → 机器挂了 → 日志丢了 → 怎么分析?答案是 kdump:panic 时用预加载的捕获内核收集内存转储。
一、先看图
flowchart LR
PROD[生产内核<br/>正常运行] -->|panic| KEXEC[kexec<br/>跳转到捕获内核]
KEXEC --> CAPTURE[捕获内核<br/>最小化系统]
CAPTURE --> DUMP[读 /proc/vmcore<br/>保存到磁盘]
DUMP --> REBOOT[重启]
REBOOT --> ANALYZE[crash 工具<br/>分析 vmcore]
classDef normal fill:#3fb95022,stroke:#3fb950,color:#adbac7;
classDef panic fill:#f8514922,stroke:#f85149,color:#adbac7;
classDef capture fill:#388bfd22,stroke:#388bfd,color:#adbac7;
class PROD normal
class KEXEC,CAPTURE,DUMP panic
class REBOOT,ANALYZE capture
二、原理
2.1 预留内存
# 内核启动参数
crashkernel=256M在物理内存中预留一块区域 → 捕获内核使用。
2.2 预加载捕获内核
kexec -p /boot/vmlinuz --initrd=/boot/initramfs-kdump.img \
--append="root=/dev/sda2 irqpoll maxcpus=1"-p = panic 模式 → 只在 panic 时执行。
2.3 panic 触发
内核 panic → kexec 跳转到捕获内核 →
捕获内核启动(最小配置)→ 读
/proc/vmcore(生产内核的完整内存)。
三、配置
# 安装
dnf install kexec-tools # RHEL/Fedora
apt install kdump-tools # Debian/Ubuntu
# 启用服务
systemctl enable kdump
systemctl start kdump
# 验证
kdumpctl showmem
cat /sys/kernel/kexec_crash_loaded # 1 = 已加载四、vmcore 分析
crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux vmcorecrash 工具提供类似 GDB 的界面:
crash> bt # 当前栈回溯
crash> log # dmesg
crash> ps # 进程列表
crash> files <pid> # 打开的文件
crash> vm <pid> # 虚拟内存
crash> dis function_name # 反汇编
五、makedumpfile
makedumpfile -l --message-level 1 -d 31 /proc/vmcore /var/crash/vmcore过滤和压缩 → 只保留有用的页面 → 大内存机器(TB 级)的 dump 文件可控。
六、ramoops / pstore
不需要 kdump 的轻量级方案:
# 内核参数
ramoops.mem_address=0x100000000 ramoops.mem_size=0x200000panic 时写最后的 dmesg 到预留 RAM → 重启后从
/sys/fs/pstore/ 读取。
ls /sys/fs/pstore/
# dmesg-ramoops-0 console-ramoops-0七、NMI watchdog
sysctl kernel.nmi_watchdog=1硬件 NMI 中断 → 检测 CPU 硬锁死 → 触发 panic → kdump 捕获。
八、远程 dump
# kdump 配置:通过 SSH 保存
path /var/crash
core_collector makedumpfile -l -d 31
ssh user@remote-server适合无本地存储或存储可能损坏的场景。
九、观察
# kdump 状态
systemctl status kdump
kdumpctl status
# 测试触发(危险——会 panic)
# echo c > /proc/sysrq-trigger
# 查看 pstore
ls -la /sys/fs/pstore/
# crash 工具版本
crash --version十、小结
- kdump = panic 时用预加载的捕获内核收集内存转储
- crashkernel 参数预留内存
- crash 工具分析 vmcore
- makedumpfile 压缩和过滤
- ramoops/pstore 是轻量级替代
参考文献
Documentation/admin-guide/kdump/kdump.rstkernel/kexec.c- crash-utility documentation
Documentation/admin-guide/ramoops.rst
工具
kexec/kdumpctlcrashmakedumpfile/sys/fs/pstore/
上一篇:kprobe/uprobe 下一篇:lockdep
文章导航
读完这篇,下一步读什么
优先读同系列或同问题的下一篇,把单篇消费变成主题集群。
CPU 调度:CFS 的虚拟运行时间与 EEVDF 的虚拟截止期
从比例份额调度的论文谱系出发,对照 Linux v6.6 与 v6.12 fair.c 源码,解释 CFS 的 vruntime、EEVDF 的 lag/eligible/deadline,并用确定性模拟复现延迟与 lag 的差异。
I/O 调度:在寻道、队列深度与公平性之间取舍
从电梯算法到 blk-mq,解释 Linux I/O 调度器为何在 HDD 上排序、在共享设备上保公平、在 NVMe 上常选择 none,并用确定性模拟展示寻道距离与队列尾延迟的取舍。
用户态内存分配器:size class、线程缓存与碎片边界
从 Wilson 分配器综述到 jemalloc、gperftools tcmalloc 与 mimalloc 的源码路径,解释 size class、线程缓存、跨线程释放和 RSS 碎片;用可复现实验说明不能只凭 allocator 名字下结论。
伙伴系统与 SLUB:Linux 物理页和小对象分配的边界
以 Linux v6.6 源码和确定性模拟为准,解释伙伴系统的 split/coalesce、migratetype 反碎片策略,以及 SLUB 的 per-CPU freelist、partial list 与安全加固。