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

【操作系统百科】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-04-27 · os

【操作系统百科】内存回收

Linux 内存回收是 VM 最复杂的子系统之一。本文讲 active/inactive LRU、kswapd 与 direct reclaim、watermark 三线、swappiness 的真实含义、MGLRU 改造、memcg 回收与 PSI。

2026-04-28 · os

【操作系统百科】交换

swap 还值得开吗?本文讲 swap area 基础、swap cache、zram 压缩内存、zswap 前端压缩池、swappiness 的真实含义、容器里的 swap 策略,以及为什么现代 Android 全靠 zram 不靠磁盘。

2026-05-03 · os

【操作系统百科】Slab/SLUB 分配器

buddy 只管页粒度(4K+),内核大多数对象只有几十到几百字节。slab/SLUB 在 buddy 之上做对象级缓存。本文讲 slab 历史、SLUB 接手、SLOB 退场、kmem_cache、per-CPU cache、KASAN 集成。

2026-05-07 · os

【操作系统百科】用户态分配器

glibc malloc、tcmalloc、jemalloc、mimalloc 各有哲学。本文讲 arena、thread cache、size class、madvise 返还策略、碎片与 RSS 膨胀、如何根据负载选分配器。


By .