目录
Linux 内核参数 kernel.core_pattern
详解
一、参数概述
kernel.core_pattern
是 Linux 内核的关键参数,用于控制系统在进程崩溃时生成的 core dump 文件 的存储位置和命名规则。Core dump 文件包含了进程崩溃时的内存映像和寄存器状态,是调试程序崩溃问题的重要依据。
二、参数功能与作用
2.1 核心功能
当进程因错误(如段错误、除零错误)崩溃时,内核会:
- 根据
kernel.core_pattern
的设置生成 core dump 文件 - 将文件存储到指定位置,并按指定格式命名
2.2 典型应用场景
- 开发环境:将 core dump 保存到当前目录,便于开发者分析
- 生产环境:
- 将 core dump 统一存储到特定目录(如
/var/crash
) - 通过管道将 core dump 发送给调试工具(如
abrt
、systemd-coredump
)
- 将 core dump 统一存储到特定目录(如
三、查看当前参数值
3.1 通过 sysctl
命令
sysctl kernel.core_pattern
# 输出示例:
# kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h
3.2 直接读取 /proc/sys
文件
cat /proc/sys/kernel/core_pattern
# 输出示例:
# |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h
四、修改参数值
4.1 临时修改(立即生效,重启后失效)
# 将 core dump 保存到 /var/crash 目录
sudo sysctl -w kernel.core_pattern="/var/crash/core.%e.%p.%h.%t"
# 验证修改结果
sysctl kernel.core_pattern
4.2 永久修改(推荐)
- 编辑系统配置文件:
sudo nano /etc/sysctl.conf
- 添加或修改参数:
# 将 core dump 保存到 /var/crash 目录,文件名包含进程名、PID、主机名和时间戳
kernel.core_pattern = /var/crash/core.%e.%p.%h.%t
- 使配置立即生效:
sudo sysctl -p
五、格式化占位符说明
kernel.core_pattern
支持以下常用占位符(需用 %
前缀):
占位符 | 含义 | 示例 |
---|---|---|
%p | 进程 ID (PID) | core.12345 |
%u | 进程所有者的 UID | core.1000 |
%g | 进程的 GID | core.100 |
%s | 导致崩溃的信号编号 | core.sig11 (段错误) |
%t | 崩溃时间戳(秒级) | core.1698234567 |
%h | 主机名 | core.server1 |
%e | 进程名 | core.myapp |
%E | 完整路径的可执行文件名(路径中的 / 会被替换为 ! ) | core.usr!bin!bash |
%% | 字面量 % | core.%percent |
示例配置:
# 格式:core.进程名.PID.主机名.时间戳
kernel.core_pattern = /var/crash/core.%e.%p.%h.%t
# 格式:core.PID_日期_时间
kernel.core_pattern = /data/core/core.%p_%Y%m%d_%H%M%S
六、高级用法:通过管道处理 core dump
6.1 使用管道符号 |
当 core_pattern
以 |
开头时,内核会将 core dump 作为标准输入传递给指定的程序。常见场景:
6.1.1 发送给 systemd-coredump(现代 Linux 系统默认)
kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h
- 优点:
- 自动压缩存储 core dump
- 支持日志聚合和分析工具
- 避免磁盘空间被大量 core 文件占满
6.1.2 自定义处理脚本
# 创建脚本
sudo nano /usr/local/bin/coredump-handler.sh
添加以下内容:
#!/bin/bash
# 参数说明:%P=%1, %u=%2, %g=%3, %s=%4, %t=%5, %c=%6, %h=%7
DEST_DIR="/data/coredumps/$(date +%Y%m%d)"
mkdir -p "$DEST_DIR"
OUTFILE="$DEST_DIR/core.$1.$(date +%H%M%S)"
# 保存 core dump 到文件
cat - > "$OUTFILE"
# 发送通知邮件
echo "程序崩溃: $(date)" | mail -s "Core Dump Alert: PID=$1" admin@example.com
设置执行权限并配置 core_pattern:
sudo chmod +x /usr/local/bin/coredump-handler.sh
sudo sysctl -w kernel.core_pattern="|/usr/local/bin/coredump-handler.sh %p %u %g %s %t %c %h"
七、注意事项与常见问题
7.1 磁盘空间管理
- 问题:大型程序的 core dump 文件可能占用大量磁盘空间
- 解决方案:
# 限制 core 文件大小为 100MB kernel.core_pattern = /var/crash/core.%e.%p fs.suid_dumpable = 2 # 允许 root 进程生成 core dump
7.2 SELinux/AppArmor 限制
- 现象:配置正确但无法生成 core dump
- 解决方法:
# 临时禁用 SELinux sudo setenforce 0 # 永久修改(编辑 /etc/selinux/config) SELINUX=permissive
7.3 验证 core dump 是否生效
# 测试程序(会触发段错误)
echo 'int main() { *((int*)0) = 0; }' > crash.c
gcc -o crash crash.c
# 设置 core 文件大小无限制
ulimit -c unlimited
# 运行程序触发崩溃
./crash
# 检查是否生成 core 文件
ls -l /var/crash/
八、相关参数补充
8.1 fs.suid_dumpable
控制特殊权限(SUID/SGID)程序的 core dump 行为:
# 0:不生成 core dump(默认)
# 1:生成 core dump,但会剥离敏感信息
# 2:强制生成完整 core dump(需 root 权限)
sudo sysctl -w fs.suid_dumpable=2
8.2 kernel.core_uses_pid
控制是否在 core 文件名中强制添加 PID:
# 0:不添加 PID(使用传统命名)
# 1:强制添加 PID(默认)
sudo sysctl -w kernel.core_uses_pid=1
九、总结
合理配置 kernel.core_pattern
可以:
- 提高程序崩溃问题的排查效率
- 避免核心系统信息泄露(通过权限控制)
- 优化服务器磁盘空间使用
建议生产环境采用 管道+压缩存储 的方案,并定期清理历史 core dump 文件。