Kdump 收集器及使用方式
以下是 Linux 系统中 Kdump 转储收集器的详细说明及其使用方法,涵盖核心工具、配置方法及实际示例:
一、Kdump 收集器分类及作用
Kdump 的核心功能是通过 捕获内核 生成内存转储文件(vmcore
),其核心收集器包括:
收集器/工具 | 作用 | 适用场景 |
---|---|---|
makedumpfile | 默认核心工具,过滤和压缩内存页生成 vmcore | 生产环境(节省存储空间) |
kexec-tools | 管理内核快速启动(kexec ),加载捕获内核 | 所有 Kdump 场景(基础依赖) |
crashkernel 参数 | 预留内存供捕获内核使用 | 内核启动配置(必需) |
自定义脚本 | 通过 pre /post 钩子扩展功能(如加密、上传云存储) | 高级场景(自动化处理) |
二、核心收集器配置与使用
1. makedumpfile
作用:生成转储文件时过滤无关内存页(如零页、缓存),并支持压缩。
配置方法(/etc/kdump.conf
):
# 指定过滤掩码(-d)和压缩算法(-c/-l)
core_collector makedumpfile -l --message-level 1 -d 31
过滤掩码(-d
):
-
1
: 过滤零页 -
2
: 过滤缓存页 -
4
: 过滤私有缓存页 -
8
: 过滤用户进程页 -
16
: 过滤空闲页
示例:
-d 31
(1+2+4+8+16)过滤所有非关键页。
压缩选项:
-
-c
: zlib 压缩 -
-l
: lzo 压缩(更快,压缩率较低) -
-p
: snappy 压缩(需内核支持)
手动执行:
# 直接生成转储文件(需指定内存设备)
makedumpfile -l -d 31 /proc/vmcore /path/to/vmcore
2. kexec-tools
作用:快速加载捕获内核,绕过 BIOS 初始化,确保内存保留。
安装与验证:
# 安装(各发行版通用)
sudo apt install kexec-tools # Debian/Ubuntu
sudo yum install kexec-tools # CentOS/RHEL# 验证 kexec 是否可用
kexec --version
手动加载捕获内核(调试用):
# 加载捕获内核(需指定内核镜像和初始化内存盘)
kexec -p /boot/vmlinuz-$(uname -r) \
--initrd=/boot/initramfs-$(uname -r).img \
--append="root=/dev/sda1 crashkernel=256M"
3. crashkernel 参数
作用:为捕获内核预留内存,必须在内核启动参数中配置。
修改 GRUB 配置:
# 编辑 GRUB 文件(路径因发行版而异)
sudo vim /etc/default/grub# 添加 crashkernel 参数(示例为预留 256MB)
GRUB_CMDLINE_LINUX="... crashkernel=256M quiet"# 更新 GRUB 并重启
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot
动态调整(无需重启):
# 调整预留内存(需内核支持)
echo 512M > /sys/kernel/kexec_crash_size
三、存储目标配置示例
通过 /etc/kdump.conf
定义转储文件存储位置:
1. 本地磁盘
# 保存到 ext4 分区
ext4 /dev/sdb1
path /var/crash
core_collector makedumpfile -l -d 17
2. NFS 服务器
# 保存到 NFS 共享目录
nfs 192.168.1.100:/shared/kdump
path /crash_dumps
core_collector makedumpfile -c -d 31
3. SSH 远程存储
# 通过 SSH 传输到远程主机
ssh root@192.168.1.100
sshkey /root/.ssh/kdump_id_rsa
path /remote/crash
4. 加密存储
# 使用加密转储(需内核支持)
core_collector makedumpfile --encrypt AES256 --passphrase-file /etc/kdump.pass
四、触发与验证
1. 手动触发转储
# 触发内核崩溃(立即重启)
echo c > /proc/sysrq-trigger# 或使用专用工具(需安装)
sudo crashme
2. 验证转储文件
# 检查 vmcore 是否生成
ls -lh /var/crash/*/vmcore# 使用 crash 工具解析
crash /usr/lib/debug/boot/vmlinux-$(uname -r) /var/crash/*/vmcore
五、高级用法与最佳实践
1. 自动化钩子脚本
在转储前后执行自定义操作:
# 转储前清理旧文件
pre /usr/local/bin/kdump_clean.sh# 转储后上传到云存储
post /usr/local/bin/kdump_upload_s3.sh
2. 多级过滤策略
按需调整过滤规则:
最小转储(仅保留关键数据):
core_collector makedumpfile -d 31 -c
完整转储(调试复杂问题):
core_collector makedumpfile -d 0
3. 资源受限环境优化
-
小内存系统:减少
crashkernel
预留(最低 128M)。 -
无持久存储:保存到临时内存盘(
raw /dev/ram0
)。
六、故障排查
1. 转储失败常见原因
-
预留内存不足:增大
crashkernel
值(如 512M)。 -
存储路径权限问题:
chmod 700 /var/crash
-
服务未启动:
systemctl enable --now kdump
2. 日志分析
# 查看 Kdump 服务日志
journalctl -u kdump# 检查内核日志
dmesg | grep -i kdump
七、总结
工具/配置 | 核心功能 | 关键命令/参数 |
---|---|---|
makedumpfile | 过滤和压缩转储文件 | -d <掩码> 、-c /-l |
kexec-tools | 快速加载捕获内核 | kexec -p |
crashkernel | 预留内存 | crashkernel=256M |
/etc/kdump.conf | 定义存储路径、过滤规则和钩子脚本 | ext4/nfs/ssh 、core_collector |
通过合理配置收集器和存储目标,Kdump 可以高效捕获内核崩溃现场,为故障分析提供可靠数据。建议定期测试转储流程,确保其可用性。