Crash Kernel 是指系统崩溃时启动的一个小型内核,专门用于捕获系统崩溃时的内存状态(称为 crashdump)。在现代 Linux 系统中,通常通过 kexec
机制来实现 crash kernel。
- 用途:
- 当系统遇到致命错误或崩溃时,通常会重启系统。但在重启之前,我们希望捕获崩溃时的内存信息,以便后续分析。
- Crash kernel 提供一个简化的环境,可以在主内核崩溃时迅速启动,避免因为重启而丢失有价值的调试信息。
- 工作原理:
- 在正常系统运行时,预留一部分内存给 crash kernel。当主内核崩溃时,
kexec
机制会立即启动 crash kernel,而不是执行传统的引导过程。 - Crash kernel 启动后,会从主内核的内存中提取数据并保存为 crashdump 文件。
- 在正常系统运行时,预留一部分内存给 crash kernel。当主内核崩溃时,
一些常见发行版在下载时会顺便将 crashkernel 配置成默认值,下载相关工具后重启即可。
Crashdump 是指在系统崩溃时保存的内存映像文件,用于诊断和调试系统问题。
- 用途:
- 记录崩溃时系统的状态,包括内存、寄存器和其他关键数据。
- 提供详细的信息给开发者或系统管理员,以便分析崩溃原因和调试内核错误。
- 生成过程:
- 当系统崩溃时,crash kernel 启动并从主内核的内存中提取数据。
- 这些数据通常会保存到磁盘或通过网络传输到远程服务器。
- 常用的工具如
kdump
可以管理 crashdump 的生成和存储。
- 分析:
- 生成的 crashdump 文件可以使用调试工具如
crash
或gdb
来分析。 - 开发者可以通过这些工具检查内存状态、调用栈、进程信息等,找到导致崩溃的原因。
- 生成的 crashdump 文件可以使用调试工具如
下载 crashdump
Ubuntu
https://ubuntu.com/server/docs/kernel-crash-dump
apt install linux-crashdump
配置内核启动参数(可选)
如果重启后 /proc/cmdline
中未出现 crashkernel
的内核参数,表示自动配置失败,必须手动配置;亦或是想修正 crashkernel 的大小,可以在 /etc/default/grub.d/kdump-tools.cfg
里面加上:
GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT crashkernel=2G-16G:512M,16G-:768M"
上面的启动参数代表:
- 当 2g < 内存 < 16g 时,保留 512m 内存给 crashkernel
- 当 内存 >= 16g 时,保留 768m 内存给 crashkernel
重新生成 grub 配置文件
修改完内核启动参数后运行update-grub
验证
运行 cat /proc/cmdline
:
BOOT_IMAGE=/vmlinuz-5.15.0-107-generic root=/dev/mapper/ubuntu--vg-ubuntu--lv ro crashkernel=512M-:192M
输出中应该出现 crashkernel=xxxx