内核 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
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【操作系统百科】内存回收
Linux 内存回收是 VM 最复杂的子系统之一。本文讲 active/inactive LRU、kswapd 与 direct reclaim、watermark 三线、swappiness 的真实含义、MGLRU 改造、memcg 回收与 PSI。
【操作系统百科】交换
swap 还值得开吗?本文讲 swap area 基础、swap cache、zram 压缩内存、zswap 前端压缩池、swappiness 的真实含义、容器里的 swap 策略,以及为什么现代 Android 全靠 zram 不靠磁盘。
【操作系统百科】Slab/SLUB 分配器
buddy 只管页粒度(4K+),内核大多数对象只有几十到几百字节。slab/SLUB 在 buddy 之上做对象级缓存。本文讲 slab 历史、SLUB 接手、SLOB 退场、kmem_cache、per-CPU cache、KASAN 集成。
【操作系统百科】用户态分配器
glibc malloc、tcmalloc、jemalloc、mimalloc 各有哲学。本文讲 arena、thread cache、size class、madvise 返还策略、碎片与 RSS 膨胀、如何根据负载选分配器。