需依次检查并配置 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 上下文和挂载参数。

如果您在 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=external 或 Storage=journal(避免设为 none)。
4、若存在 ProcessSizeMax=0 或 ExternalSizeMax=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,确认输出中不含 noexec、nosuid 或 nodev。
3、若 /var/core 所在文件系统挂载含 fs.protected_regular=2(常见于某些发行版默认),需临时调整:sysctl -w fs.protected_regular=0,或在 /etc/sysctl.conf 中持久化该设置。










