我想对我的 mail.log(Ubuntu 20.04 LTS 上的 postfix 3.2.13)运行一些分析,包括更新无法送达电子邮件的数据库,因此我编写了脚本,从通用 /var/log logrotate 脚本中排除了 mail.log 并创建了一个新的 /etc/lorotate.d/mail_log 在后旋转部分运行脚本。尽管脚本被调用,但它无法生成 db 文件:
postfix/postmap[540039]: fatal: open /etc/postfix/bad_recipients.db: Read-only file system
考虑到这实际上可能是一个权限问题,我为 syslog 用户添加了 sudoers 规则(/var/log/mail 文件由 syslog 用户拥有)并修改了 logrotate 脚本:
/var/log/mail.log
{
rotate 30
daily
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
sudo /usr/local/sbin/mailfail.sh
endscript
}
但我仍然在每个 mail.log ( ) 的顶部报告相同的错误,Read-only file system
并且数据库未更新。
该脚本正在执行表明它不是脚本上的 chroot 或权限或 sudo 配置错误问题。正在写入的其他文件具有 syslog 用户(拥有日志文件的用户)的权限。
Rsyslogd 似乎是链中唯一受 apparmor 配置文件约束的可执行文件 - 但将路径 /etc/postfix* (rwk) 添加到配置文件并从强制切换到抱怨对错误没有影响。
(从命令运行脚本按预期工作)
答案1
这可能是由 systemd 的保护功能引起的,该功能是为logrotate
Postfix 启用的。尤其,ProtectSystem
,如果设置为“完整”或“严格”,将导致/etc
只读。
您应该将任何您想要修改的内容移至var
,或者如果您无法避免更改/etc
,请覆盖相关单位 ( systemctl edit
) 以更改ProtectSystem
为“true”,这会保护/usr
但不会/etc
。