core dump 未生成 的 kernel.core_pattern 与 systemd-coredump 配置

2次阅读

需依次检查并配置 kernel.core_pattern、ulimit -c、systemd-coredump 服务、崩溃触发机制及 SElinux/挂载选项:一、设 core_pattern 为 /var/core/core.%e.%p 并确保目录可写;二、ulimit -c 设为 unlimited;三、启用 systemd-coredump 且 Storage≠none;四、用 SIGSEGV 测试并用 coredumpctl 验证;五、调整 SELinux 上下文和挂载参数。

core dump 未生成 的 kernel.core_pattern 与 systemd-coredump 配置

如果您在 Linux 系统中触发了进程崩溃,但未观察到 core dump 文件生成,则可能是内核核心转储路径配置异常或 systemd-coredump 服务未正确启用。以下是解决此问题的步骤:

一、检查并设置 kernel.core_pattern

kernel.core_pattern 决定了内核在进程崩溃时将 core dump 写入的位置与命名格式。若其值为空、被重定向至 /dev/NULL 或指向不可写路径,则 core dump 不会落盘。

1、执行 cat /proc/sys/kernel/core_pattern 查看当前值。

2、若输出为 /dev/null 或为空,需临时修改:运行 echo “/var/core/core.%e.%p” > /proc/sys/kernel/core_pattern

3、为永久生效,向 /etc/sysctl.conf 追加一行:kernel.core_pattern = /var/core/core.%e.%p,然后执行 sysctl -p

4、确保目标目录存在且具有写权限:执行 mkdir -p /var/core && chmod 777 /var/core

二、验证 ulimit 设置

用户级限制可能覆盖内核配置,若 ulimit -c 返回 0,则表示禁止生成 core dump,即使 kernel.core_pattern 正确也无法触发写入。

1、运行 ulimit -c 查看当前 soft limit 值。

2、若结果为 0,临时允许:执行 ulimit -c unlimited

3、为全局生效,在 /etc/security/limits.conf 中添加两行:
* soft core unlimited
* hard core unlimited

4、重启用户会话或重新登录以使 limits 生效。

三、启用并配置 systemd-coredump

现代 systemd 系统默认拦截 core dump 并交由 systemd-coredump 处理;若该服务未启用或配置禁用,则不会保存任何转储文件。

1、确认服务状态:运行 systemctl is-active systemd-coredump,非 active 状态需执行 systemctl enable –now systemd-coredump

2、检查配置文件是否存在:查看 /etc/systemd/coredump.conf/etc/systemd/coredump.conf.d/*.conf

3、确保其中包含 Storage=externalStorage=journal(避免设为 none)。

4、若存在 ProcessSizeMax=0ExternalSizeMax=0,需将其改为非零值(如 2G)。

5、重载配置并重启服务:执行 systemctl daemon-reload && systemctl restart systemd-coredump

四、验证 core dump 是否实际触发

仅配置正确不足以保证生成,还需确认崩溃信号确实被发送且未被进程自身捕获屏蔽。

1、编写测试程序(如 C 语言中调用 kill(getpid(), SIGSEGV))并编译运行。

2、运行后立即检查:ls -l /var/core/coredumpctl list

3、若使用 systemd-coredump,还可执行 coredumpctl info –all 查看所有已捕获记录。

4、若仍无输出,检查内核日志:dmesg | grep -i “core|dump”,确认是否出现 “Core dump to … failed” 类错误。

五、排查 SELinux 或文件系统挂载选项

SELinux 策略或 noexec/nodev/nosuid 挂载选项可能阻止 core dump 写入指定路径,尤其当 core_pattern 指向非根分区时。

1、检查当前上下文:运行 ls -Z /var/core/,确认目录类型为 corefile_t;否则执行 semanage fcontext -a -t corefile_t “/var/core(/.*)?”restorecon -Rv /var/core

2、检查挂载选项:运行 findmnt -D /var/core,确认输出中不含 noexecnosuidnodev

3、若 /var/core 所在文件系统挂载含 fs.protected_regular=2(常见于某些发行版默认),需临时调整:sysctl -w fs.protected_regular=0,或在 /etc/sysctl.conf 中持久化该设置。

text=ZqhQzanResources