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

【操作系统百科】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-06-29 · linux / os

EEVDF 调度器:Linux 6.6 为什么换掉了 CFS

Linux 6.6 用 EEVDF 取代了 CFS 的 SCHED_NORMAL 选取逻辑。从 1995 年原始论文的 lag、eligibility、virtual deadline,到 commit 147f3ef 只重写 placement/pick/preempt,再到本机内核 6.6 上读 sched/debug 把每个任务的 vruntime、eligible 标志、deadline 一一对上 vd=ve+r/w,外加 nice 带宽与 base_slice 抢占两组实测,讲清换的是哪一块、延迟敏感任务凭什么先跑。

2026-07-05 · os

【操作系统百科】实时 OS 巡礼

硬实时与软实时的可调度性边界、VxWorks/QNX/Zephyr 机制对照、Linux PREEMPT_RT 与主线合入、DO-178C/ISO 26262 认证语境,以及选型决策树。

2026-07-06 · os

【操作系统百科】Unikernel

Unikernel 在云上为什么没成主流?MirageOS、IncludeOS、Unikraft、OSv 的设计取舍——库操作系统、启动时间、工具链、调试困难、POSIX 兼容。


By .