- Ubuntu 20.04.4 LTS
- logrotate: 3.14.0-4ubuntu3
Apache httpdをソースからインストールして/usr/local/apache2に配置したあと、logrotateの設定を済ませた。ところがログのローテートが為されていないことに気が付いた。syslogを開くとエラーメッセージが現れている。
$ less /var/log/syslog May 29 00:00:00 wordpress logrotate[43538]: error: failed to rename /usr/local/apache2/logs/access_log to /usr/local/apache2/logs/access_log-20220529: Read-only file system
Read-onlyで思い当たるのはsystemdのProtectSystem=
である。解説を眺めるとtrueやfull、strictが設定されると/usrはread-onlyでマウントされるから本症状と一致する。
ProtectSystem=
ProtectSystem=
Takes a boolean argument or the special values “full” or “strict”. If true, mounts the /usr/ and the boot loader directories (/boot and /efi) read-only for processes invoked by this unit.
logrotate.serviceの設定を検めるとこういう具合である。
$ systemctl show logrotate.service --property ProtectSystem ProtectSystem=full
fullとなっているから/usrはread-onlyでマウントされてしまう。そこでlogrotate.serviceの[Service]セクションにReadWritePaths=
を設定してこの制御を躱すことにした。
ReadWritePaths=, ReadOnlyPaths=, InaccessiblePaths=, ExecPaths=, NoExecPaths=
ReadWritePaths=, ReadOnlyPaths=, InaccessiblePaths=, ExecPaths=, NoExecPaths=
(snip)
Paths listed in ReadWritePaths= are accessible from within the namespace with the same access modes as from outside of it.
$ sudo cp -av /lib/systemd/system/logrotate.service /etc/systemd/system/ '/lib/systemd/system/logrotate.service' -> '/etc/systemd/system/logrotate.service' $ sudo vi /etc/systemd/system/logrotate.service [Service] (snip) ProtectSystem=full ReadWritePaths=/usr/local/apache2/logs
あとはユニットファイルの再読み込みとlogrotateを再起動して、実行時間を待ち構えているとうまくローテートされることを確認できた。
$ sudo systemctl daemon-reload $ sudo systemctl restart logrotate.service