一、Kdump 简介
Kdump 是 Linux 系统中的一种内核崩溃转储机制(Kernel Crash Dump)。当内核发生 panic
或严重故障时,Kdump 会触发并使用 第二内核(crash kernel) 启动系统,并将主内核的内存快照(vmcore)转储至硬盘、网络或远程服务器,以供后续分析。
二、Kdump 工作原理
Kdump 依赖于 kexec
技术:
-
系统启动时,预留一部分内存加载备用的 crash kernel(第二内核)
-
如果主内核发生崩溃(如 Oops/Panic),系统通过
kexec -p
启动第二内核 -
第二内核运行后,通过
kdump-tools
将主内核的内存内容保存成vmcore
-
vmcore
可供后续使用crash
工具进行分析
三、常见术语解释
名称 | 说明 |
---|---|
Crash kernel | 第二内核,专用于在主系统崩溃后收集数据 |
vmcore | 主内核崩溃时的内存快照,通常保存在 /var/crash 下 |
kexec | 一种无需重启硬件就切换内核的机制 |
crash | 用于分析 vmcore 文件的命令行工具 |
Serial console | 串口输出设备,常用于输出崩溃日志 |
四、Kdump 安装与配置
1. 安装相关工具
Debian/Ubuntu:
sudo apt install kdump-tools
2. 编辑 grub 启动项
修改 /etc/default/grub
:
GRUB_CMDLINE_LINUX="crashkernel=8G-:2048M console=tty0 console=ttyS0,115200"
内核通过 crashkernel=
参数预留内存给 crash kernel,例如:
crashkernel=8G-:2048M
表示:
-
当系统内存大于等于 8GB 时,预留 2048MB 内存给 crash kernel
-
小于 8GB 时不分配
格式语法:
crashkernel=<min-mem>:<size>[,...]
串口部分 console=ttyS0,115200
可选,用于输出日志到串口。
更新 grub:
sudo update-grub
3. 启用 kdump
编辑配置文件 /etc/default/kdump-tools
(Ubuntu/Debian):
USE_KDUMP=1
KDUMP_COREDIR="/var/crash"
KDUMP_CMDLINE_APPEND="irqpoll maxcpus=1 reset_devices console=ttyS0,115200"
加载 crash kernel:
sudo kdump-config load
验证状态:
sudo kdump-config show
# current state: ready to kdump
五、测试与验证
1. 模拟内核崩溃(小心操作)
确保SysRQ启用
sudo sysctl -w kernel.sysrq=1
以下命令会触发 panic:
echo c | sudo tee /proc/sysrq-trigger
如果配置正确:
-
系统会重新启动到 crash kernel
-
crash kernel 会保存主内核的 vmcore 到
/var/crash/<time>/vmcore
2. 分析 vmcore(可选)
安装 crash 工具:
sudo apt install crash
分析:
sudo crash /usr/lib/debug/boot/vmlinux-<version> /var/crash/<time>/vmcore
六、常见问题排查
问题 | 原因 | 解决方案 |
---|---|---|
vmcore 未生成 | crashkernel 分配内存太小 | 增加内存,如 crashkernel=8G-:2048M |
vmcore未生成 | 第二内核缺少驱动 |
注释/etc/default/kdump-tools的KDUMP_KERNEL、KDUMP_INITRD使用当前的内核和initrd |
系统未进入 crash kernel | kexec -p 未加载成功 | 检查 kdump-config show 状态 |
日志缺失 | 串口未输出日志 | 加上 console=ttyS0,115200 |