这个坑值得记一笔。Ubuntu 22.04 上给自研 agent 写 systemd unit,加了 ProtectSystem=strict 和 ProtectHome=true,服务启动后日志报 open /var/lib/agent/state.db: read-only file system,手工在 shell 里写同一个路径却正常。

刚开始盯着「StateDirectory 没配,systemd 不会自动创建可写目录」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。ProtectSystem=strict 把整个文件系统挂成只读,只有少数目录例外;没有用 ReadWritePaths 给数据目录开白名单;PrivateTmp 让 /tmp 变成独立命名空间,临时文件路径对不上。

先确认 unit 里的沙箱相关配置

systemctl cat agent | grep -E 'Protect|ReadWrite|StateDirectory'

再往下打开 unit 的覆盖编辑

systemctl edit agent --force --full

补上可写目录白名单

ReadWritePaths=/var/lib/agent /var/log/agent

剩下的就是重载并验证写入

systemctl daemon-reload && systemctl restart agent && systemctl show agent -p ProtectSystem

这次没动代码,只在配置和运行环境上找原因。

隔了一天再看,现象没变,说明不是偶发。

别只看报错消失,验证要多做一步。服务日志不再报 read-only file system,state.db 能正常写入,systemctl show 里 ProtectSystem 仍是 strict。

提醒一点。沙箱限制是好事,但白名单要一次配全,日志、缓存、PID 目录漏一个就会在运行中途才报错。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189