土法炼钢兴趣小组的算法知识备份

【操作系统百科】kdump 与故障转储

文章导航

分类入口
os
标签入口
#kdump#kexec#crash#vmcore#pstore

目录

内核 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 vmcore

crash 工具提供类似 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=0x200000

panic 时写最后的 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

十、小结


参考文献

工具


上一篇kprobe/uprobe 下一篇lockdep

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-05-06 · os

【操作系统百科】内核内存调试

内核内存 bug 是最难追的:UAF、OOB、double free、leak 都可能沉默数月。本文讲 KASAN 三种模式、KFENCE 生产采样、kmemleak、SLUB_DEBUG、UBSAN/KCSAN 联动。

2026-05-08 · os

【操作系统百科】VFS 四层抽象

Linux 的一切皆文件靠 VFS 实现——superblock、inode、dentry、file 四层抽象加 ops 表。本文讲 VFS 核心数据结构、dcache、inode cache、RCU lookup,以及文件系统如何插入 VFS。

2026-04-22 · os

操作系统百科

Linux 6.x 视角下的操作系统系列索引:110 篇覆盖调度、虚拟内存、文件系统与 I/O、并发、隔离、可观测性,按主题、阅读路径与关键问题三种入口组织。

2026-05-27 · os

【操作系统百科】用户态分配器:jemalloc vs tcmalloc

jemalloc 与 tcmalloc 都想解决多线程分配器的老问题:锁争抢、碎片、RSS 膨胀与回收抖动。但两者把优化重点放在了不同位置:tcmalloc 更激进地把热路径推到 per-CPU,jemalloc 则把 arena、extent、decay 和 profiling 做成了一套更完整的内存治理工具箱。


By .