crash 工具进行离线分析。kexec-tools 并按内存大小自动预留 crashkernel(如 crashkernel=3G-16G:256M,16G-64G:384M,... 分档策略),kdump 服务开机自启;您可通过 cat /sys/kernel/kexec_crash_loaded 快速确认(输出 1 表示已就绪)。自建机房或自定义镜像环境可能未配置,未正确配置 kdump 的机器在 panic 后仅会重启,不保留任何现场信息,此时需按本文完成安装与配置。建议所有生产环境在初始化阶段确认 kdump 开启。uname -m 确认当前架构。crashkernel=256M(≤16GB 内存)或 256M,high(>16GB 内存)。腾讯云 CVM 公共镜像默认已按内存分档自动预留,无需手动配置crashkernel=512M,high,因 ARM 捕获内核初始化需要更多内存,预留不足会导致 kdump 加载失败。sudo -i 切换到 root。kexec-tools、crash 需要系统默认 dnf 源可访问;安装 kernel-debuginfo 需额外配置 debuginfo 源(默认源不含此包,配置方法见操作步骤 1)。crashkernel 内存预留参数修改后必须重启系统才能生效,请您提前规划重启窗口。# 确认系统架构uname -m # 预期输出:x86_64 或 aarch64# 确认当前用户为 rootwhoami # 预期输出:root# 确认磁盘空间(转储目录所在分区,默认 /var/crash)df -h /var/crash # 预期输出:可用空间不低于物理内存的 20%# 确认内核版本uname -r # 预期输出:<kernel-version>,例如 6.6.79-25.8.tl4.x86_64# 确认 dnf 源可用dnf repolist # 预期输出:列出已配置的软件源
参数 | 位置 | 取值 | 说明 |
crashkernel | kernel 启动参数 | 256M / 256M,high / 128M@64M | 为捕获内核预留内存 |
KDUMP_KERNEL | /etc/sysconfig/kdump | 内核镜像路径 | 捕获内核 vmlinuz 路径 |
KDUMP_INITRD | /etc/sysconfig/kdump | initramfs 路径 | 捕获内核 initramfs 路径 |
KDUMP_COMMANDLINE_APPEND | /etc/sysconfig/kdump | 内核参数字符串 | 追加到捕获内核的启动参数 |
path | /etc/kdump.conf | 目录路径 | 转储文件保存目录 |
core_collector | /etc/kdump.conf | makedumpfile 参数 | 转储文件过滤和压缩策略 |
参数 | 含义 | 转储大小 |
-d 0 | 不过滤,完整转储 | 100% |
-d 1 | 排除零页 | ~70-80% |
-d 31 | 排除零页+缓存页+用户数据页(推荐) | ~10-20% |
-d 31 -c | 排除零页+缓存页+用户数据页 + 压缩输出 | 最小 |
参数 | 说明 |
-l | 压缩转储文件(LZO 压缩) |
--message-level <n> | 控制输出日志详细级别, 1 表示仅打印进度信息 |
-d <bitmask> | 过滤掩码,按位过滤不必要页面:bit0=零页、bit1=缓存页、bit2=用户数据页、bit3=空闲页; 31 = 0b11111 表示排除以上所有 |
-c | 对过滤后的数据进行压缩 |
# 安装 kexec-tools(kdump 核心)和 crash(分析工具)dnf install kexec-tools crash# 安装 kernel-debuginfo(crash 工具分析 vmcore 必需,提供 vmlinux 调试符号)# 注意:kernel-debuginfo 不在默认源中,需先添加 debuginfo 源:cat > /etc/yum.repos.d/tl4-debuginfo.repo << 'EOF'[tl4-debuginfo]name=TencentOS Server 4 - Debuginfobaseurl=https://mirrors.tencent.com/tlinux/4.0/BaseOS/x86_64/debug/tree/enabled=1gpgcheck=0EOF# debuginfo 包版本必须与运行内核完全一致(uname -r 查看);若源中暂无对应版本,请等待源更新dnf install kernel-debuginfo-$(uname -r)# 验证 kernel-debuginfo 安装结果:vmlinux 调试符号文件应存在ls /usr/lib/debug/lib/modules/$(uname -r)/vmlinux# 预期输出:/usr/lib/debug/lib/modules/<kernel-version>/vmlinux
# 查看当前 crashkernel 配置cat /proc/cmdline | grep crashkernel# 使用 grubby 设置 crashkernel# x86_64 架构:建议 256M(≤16GB 内存)或 256M,high(>16GB 内存)grubby --update-kernel=ALL --args="crashkernel=256M"# aarch64(ARM)架构:建议使用 512M,high,因 ARM 捕获内核需要更多内存# grubby --update-kernel=ALL --args="crashkernel=512M,high"# 重启使配置生效reboot
# 查看 kdump 是否已加载cat /sys/kernel/kexec_crash_loaded# 预期输出:1(1 表示 kdump 已加载,0 表示未加载)# 查看内核日志中 crashkernel 预留信息dmesg | grep -i crash# 预期输出:包含 "Reserving XXXMB of memory for crashkernel" 等行
vim /etc/sysconfig/kdump 编辑主配置文件。以下示例中 <kernel-version> 为占位符,实际使用时请替换为 uname -r 的输出值(例如 6.6.79-25.8.tl4.x86_64):# 捕获内核镜像路径KDUMP_KERNEL="/boot/vmlinuz-<kernel-version>"# 捕获内核 initramfs 路径KDUMP_INITRD="/boot/initramfs-<kernel-version>kdump.img"# KDUMP_COMMANDLINE_APPEND 用于追加自定义参数(避免与默认参数重复)KDUMP_COMMANDLINE_APPEND="panic=1 swiotlb=noforce novmcoredd"
vim /etc/kdump.conf 编辑转储目标配置文件:# 本地文件系统转储path /var/crash# core_collector 使用 makedumpfile 过滤并压缩# -l:LZO 压缩;--message-level 1:仅打印进度;-d 31:排除零页+缓存页+用户数据页core_collector makedumpfile -l --message-level 1 -d 31# NFS 转储(可选)# nfs my.server.com:/export/crash# path /var/crash# core_collector makedumpfile -l --message-level 1 -d 31
# 设置开机自启systemctl enable kdump# 启动 kdump 服务systemctl start kdump# 查看服务状态systemctl status kdump# 预期输出:Active: active (exited) 且无报错
# 重建 kdump initramfs(修改配置后或内核升级后执行)kdumpctl rebuild# 预期输出:提示 rebuild 成功,无报错# 验证 kdump 服务状态kdumpctl status# 预期输出:kdump is operational
# 启用 sysrqecho 1 > /proc/sys/kernel/sysrq# 触发内核崩溃(仅在测试环境执行)echo c > /proc/sysrq-trigger
/var/crash/ 目录下。# 查看转储文件ls -la /var/crash/# 预期输出:列出以 IP-日期时间 命名的目录,例如 127.0.0.1-2026-08-09-14:30ls /var/crash/127.0.0.1-$(date +%Y-%m-%d-%H:%M)/# 预期输出:包含 vmcore 文件# 使用 crash 工具分析(需提前安装 kernel-debuginfo 提供 vmlinux)# 将 <dump-dir> 替换为实际的转储目录名,<kernel-version> 替换为 uname -r 输出crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/crash/<dump-dir>/vmcore
crash> bt # 查看崩溃调用栈(backtrace)crash> ps # 查看崩溃时进程列表crash> log # 查看内核日志(dmesg)crash> sys # 查看系统信息crash> quit # 退出 crash
操作步骤 | 预期输出 | 验证方法 |
安装软件包 | dnf install 成功,无报错 | rpm -q kexec-tools crash kernel-debuginfo 列出已安装 |
配置 crashkernel 并重启 | cat /sys/kernel/kexec_crash_loaded 输出 1 | dmesg | grep crash 显示预留内存 |
启动 kdump 服务 | Active: active (exited) | systemctl status kdump |
kdumpctl rebuild | rebuild 成功提示 | kdumpctl status 输出 operational |
触发 panic(测试) | 系统重启后 /var/crash/ 下生成 vmcore | ls /var/crash/ 存在转储目录 |
crash 分析 | 进入 crash 交互界面 | 进入 crash 交互界面后可正常执行 bt、ps、log 等命令 |
# 1. 手动重建 kdump initramfskdumpctl rebuild# 2. 检查 /etc/sysconfig/kdump 中 KDUMP_INITRD 路径是否正确# 将 <kernel-version> 替换为 uname -r 输出值grep KDUMP_INITRD /etc/sysconfig/kdump# 预期输出:KDUMP_INITRD="/boot/initramfs-<kernel-version>kdump.img"# 3. 确认 initramfs 文件存在ls -la /boot/initramfs-$(uname -r)kdump.img# 4. 重启服务systemctl restart kdump
crashkernel 内存预留失败或预留不足,导致捕获内核无法启动。# 1. 确认 crashkernel 已预留cat /proc/cmdline | grep crashkernel# 预期输出:包含 crashkernel=256M 或类似参数# 2. 确认 kdump 已加载cat /sys/kernel/kexec_crash_loaded# 预期输出:1# 3. 查看 dmesg 确认预留是否成功dmesg | grep -i "crashkernel"# 预期输出:Reserving XXXMB of memory for crashkernel# 4. 如果预留失败,增大 crashkernel 值后重启# x86_64:grubby --update-kernel=ALL --args="crashkernel=256M,high"# aarch64:grubby --update-kernel=ALL --args="crashkernel=512M,high"
/var/crash 所在分区可用空间不足以容纳 vmcore。# 1. 查看当前可用空间df -h /var/crash# 2. 清理旧的转储文件(请先确认旧转储已完成分析或归档——vmcore 是不可再生的故障现场,删除后无法恢复)rm -rf /var/crash/127.0.0.1-*# 3. 增大 makedumpfile 过滤级别,减小转储文件大小# 编辑 /etc/kdump.conf,将 core_collector 改为:# core_collector makedumpfile -l --message-level 1 -d 31 -c# 4. 或将转储目标改为空间更大的分区或 NFS 挂载点
# 1. 更新 /etc/sysconfig/kdump 中的 KDUMP_KERNEL 和 KDUMP_INITRD 路径# 将 <kernel-version> 替换为新内核版本(uname -r 输出)# KDUMP_KERNEL="/boot/vmlinuz-<kernel-version>"# KDUMP_INITRD="/boot/initramfs-<kernel-version>kdump.img"# 2. 安装新内核对应的 kernel-debuginfodnf install kernel-debuginfo-$(uname -r)# 3. 重建 kdump initramfskdumpctl rebuild# 4. 重启 kdump 服务systemctl restart kdump# 5. 验证kdumpctl status
kernel-debuginfo 或版本不匹配。# 1. 安装与当前内核版本匹配的 kernel-debuginfodnf install kernel-debuginfo# 2. 确认 vmlinux 文件存在ls /usr/lib/debug/lib/modules/$(uname -r)/vmlinux# 3. 如果版本不匹配,安装对应版本dnf install kernel-debuginfo-$(uname -r)
文档反馈