Linux systemd-coredump 的 coredump.conf 与 /var/lib/systemd/coredump 清理策略

3次阅读

storage=、maxuse=、maxage=、compress=、zstdlevel=、processsizemax=、systemmaxuse=、runtimemaxuse= 等配置影响 core 文件生成与管理,但需重载 systemd 且仅对新进程生效。

Linux systemd-coredump 的 coredump.conf 与 /var/lib/systemd/coredump 清理策略

coredump.conf 里哪些配置真会影响 core 文件生成

默认情况下,systemd-coredump 不会丢弃 core 文件,但很多人改了 /etc/systemd/coredump.conf 却发现没生效——根本原因是:修改后必须重载 systemd 配置,且部分选项只在新进程启动时起作用。

  • Storage= 决定存哪:external(默认,存到 /var/lib/systemd/coredump)、none(完全禁用)、journal(只记日志不存文件),设成 none 后旧进程已触发的 dump 不会消失,但新崩溃不会再落盘
  • MaxUse=MaxAge= 是清理开关,但它们**只对 Storage=external 生效**;设成 journalnone 后这两个参数就彻底被忽略
  • Compress=yes 默认开启,压缩后文件名带 .zst 后缀,coredumpctl 能自动解压,但手动用 gdb 打开前得先解压,否则报错 No such file or Directory

手动清理 /var/lib/systemd/coredump 的安全方式

直接 rm -rf /var/lib/systemd/coredump 看似快,但可能破坏 systemd-coredump 的内部索引,导致 coredumpctl list 显示异常或漏掉条目。真正安全的做法是走 systemd 自带的清理路径。

  • systemd-tmpfiles --clean 触发配置驱动的清理:它读取 /usr/lib/tmpfiles.d/coredump.conf(或 /etc/tmpfiles.d/coredump.conf),按 MaxUse=/MaxAge= 执行裁剪
  • 临时清空所有:运行 coredumpctl --all --quiet --no-pager --no-legend --output= cat | xargs -r rm -f,但注意这绕过 tmpfiles 逻辑,适合紧急释放空间,不建议定期用
  • 查大文件再删更稳妥:find /var/lib/systemd/coredump -name "*.core*" -size +100M -ls | head -20,确认不是正在被 coredumpctl debug 持有锁的文件再删

coredumpctl list 显示不全或时间错乱的常见原因

coredumpctl list 依赖文件 mtime 和 coredump 文件头里的元数据,这两者不一致就会出现排序错乱、日期显示为 1970 年,甚至同一进程多次崩溃只显示一条。

  • 系统时间跳变(如 NTP 校正、虚拟机休眠唤醒)会导致写入的 mtime 错乱,coredumpctl 优先信任文件 mtime,而非 core 头里的崩溃时间戳
  • 使用 cprsync -a 复制 core 文件会保留原 mtime,但新位置没有对应元数据,coredumpctl 就无法关联到原始服务名和 PID
  • 如果 /var/lib/systemd/coredump 所在分区是 noatime 挂载,不影响 list,但若误配为 relatime 或 strictatime,频繁访问会拖慢列表速度,实际影响不大

core 文件太大又不想关 Storage=external 怎么办

有些服务(比如 Java、Chromium)崩溃一次生成几个 GB 的 core,占满磁盘,但你又需要保留分析能力——这时靠压缩和过滤比直接禁用更实用。

  • 启用 ZstdLevel=3(默认是 3,可设到 12,但 >6 后压缩率提升极小,CPU 开销明显上升)
  • ProcessSizeMax= 限制单个 core 文件大小,单位是字节,设成 500M 后超限的 dump 会被截断,coredumpctl debug 仍能启动,但可能不完整
  • 配合 SystemMaxUse=(全局)和 RuntimeMaxUse=(仅 runtime 目录)双控,避免 /var/lib/systemd/coredump 占满根分区

真正难处理的是 core 文件被其他进程 mmap 锁住导致删不掉,这时候 lsof +D /var/lib/systemd/coredump 比猜更有用。另外,coredump.conf 的改动不会 retroactively 影响已存在的文件,这点很容易被忽略。

text=ZqhQzanResources