这个坑值得记一笔。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 目录漏一个就会在运行中途才报错。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
