Read-only file systemでログローテートが失敗する

  • 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=
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.

ProtectSystem=

logrotate.serviceの設定を検めるとこういう具合である。

$ systemctl show logrotate.service --property ProtectSystem
ProtectSystem=full

fullとなっているから/usrはread-onlyでマウントされてしまう。そこでlogrotate.serviceの[Service]セクションにReadWritePaths=を設定してこの制御を躱すことにした。

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.

ReadWritePaths=, ReadOnlyPaths=, InaccessiblePaths=, ExecPaths=, NoExecPaths=
$ 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

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください