Linux 启用 kdump

2025-07-14 06:48:00
丁国栋
原创 8
摘要:本文记录如何启用Linux kdump功能。

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 内核调试的重要工具,通过合理配置可以高效捕获崩溃现场。建议在生产环境中提前测试配置,并确保有足够的磁盘空间存储转储文件。

发表评论
博客分类