【内核】Linux 内核优化实战 - kernel.core_pattern

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 发送给调试工具(如 abrtsystemd-coredump

三、查看当前参数值

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 永久修改(推荐)

  1. 编辑系统配置文件:
sudo nano /etc/sysctl.conf
  1. 添加或修改参数:
# 将 core dump 保存到 /var/crash 目录,文件名包含进程名、PID、主机名和时间戳
kernel.core_pattern = /var/crash/core.%e.%p.%h.%t
  1. 使配置立即生效:
sudo sysctl -p

五、格式化占位符说明

kernel.core_pattern 支持以下常用占位符(需用 % 前缀):

占位符含义示例
%p进程 ID (PID)core.12345
%u进程所有者的 UIDcore.1000
%g进程的 GIDcore.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 文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值