Linux 启用 kdump
- 2025-07-14 06:48:00
- 丁国栋
- 原创 8
kdump
是 Linux 内核的崩溃转储机制,用于在内核崩溃时捕获内核信息(dmesg)和内存镜像(vmcore
),以便后续分析崩溃原因。
dmesg 是 Linux 系统中用于 查看和控制内核环形缓冲区(kernel ring buffer) 的命令行工具。它主要用于显示内核启动时的日志、硬件检测信息、设备驱动状态以及运行时的内核错误或警告信息。dmesg 是 实时诊断内核问题 的核心工具,适合排查硬件、驱动或内核崩溃问题。
1. 基本原理
- kexec 机制:
kdump
依赖kexec
快速引导一个备用内核(称为 捕获内核),绕过 BIOS 初始化,直接从崩溃的内核中保留内存。 - 双内核配置:
- 主内核:正常工作的内核,崩溃时触发
kexec
。 - 捕获内核:预留的内存中加载的轻量级内核,专用于转储主内核的内存。
- 主内核:正常工作的内核,崩溃时触发
2. 配置步骤
2.1 安装必要工具
# RHEL/CentOS/Fedora
sudo yum install kexec-tools crash
# Debian/Ubuntu
sudo apt install kdump-tools crash
2.2 修改内核启动参数
编辑 /etc/default/grub
,添加或修改以下参数:
GRUB_CMDLINE_LINUX="... crashkernel=256M"
更新 GRUB 并重启:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg # BIOS 系统
sudo reboot
2.3 启用 kdump 服务
sudo systemctl enable kdump
sudo systemctl start kdump
2.4 验证配置
检查捕获内核是否预留:
cat /proc/cmdline | grep crashkernel
检查服务状态:
sudo kdumpctl status
可以使用 kdump-config show
查看内核转储的配置。
输出示例:
DUMP_MODE: kdump
USE_KDUMP: 1
KDUMP_SYSCTL: kernel.panic_on_oops=1
KDUMP_COREDIR: /var/crash
crashkernel addr: 0x2d000000
current state: ready to kdump
kexec command:
/sbin/kexec -p --command-line="BOOT_IMAGE=/boot/vmlinuz-3.13.0-24-generic root=UUID=fe5d9ef3-0382-4b4d-9057-f09962f7d00d ro video=800x600 apparmor=0 irqpoll maxcpus=1 nousb" --initrd=/boot/initrd.img-3.13.0-24-generic /boot/vmlinuz-3.13.0-24-generic
其中 kernel.panic_on_oops=1
当内核触发 "oops"(一种非致命错误,如空指针解引用、内存访问越界等)时,强制系统进入内核恐慌(panic)状态,进而触发 kdump 机制生成崩溃转储文件(vmcore)。
3. 高级配置
3.1 调整 crashkernel 大小
- 自动估算:
crashkernel=auto
(需内核支持)。 - 灵活分配:
crashkernel=512M-2G:64M,2G-:128M
(根据内存动态调整)。
3.2 指定转储目标
编辑 /etc/kdump.conf
定义转储位置:
-
本地存储:
path /var/crash
-
远程存储(NFS/SSH):
net my.nfs.server:/export/crash
3.3 触发测试崩溃
手动触发内核崩溃(慎用!):
echo c > /proc/sysrq-trigger
系统将重启并生成 /var/crash/<timestamp>/vmcore
。
4. 分析 vmcore
使用 crash
工具分析转储文件:
crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/crash/<timestamp>/vmcore
常用命令:
bt
:查看崩溃时的调用栈。log
:查看内核日志。ps
:查看崩溃时的进程状态。
5. 常见问题
5.1 捕获内核无法启动
- 原因:
crashkernel
预留内存不足或冲突。 - 解决:增加预留值(如
crashkernel=512M
)。
5.2 转储文件过大
-
压缩转储:在
/etc/kdump.conf
中添加:core_collector makedumpfile -l --message-level 1 -d 31
仅转储有效内存页(
-d 31
表示过滤策略)。
5.3 服务启动失败
检查日志:
journalctl -u kdump
确保 kdump
内核镜像已正确加载:
ls /boot/initramfs-$(uname -r)kdump.img
6. 性能优化
- 减少捕获内核体积:禁用不必要的模块。
- 使用 SSH/NFS 转储:避免本地磁盘 I/O 瓶颈。
总结
kdump
是 Linux 内核调试的重要工具,通过合理配置可以高效捕获崩溃现场。建议在生产环境中提前测试配置,并确保有足够的磁盘空间存储转储文件。
发表评论