logrotateができない

Arch Linuxで次のようなエラーが出てうまくいかなかった

error: failed to rename /usr/local/var/log/mirakurun.stderr.log to /usr/local/var/log/mirakurun.stderr.log-20190517: Read-only file system

しかし、普通にsudo logrotate /etc/logrotate.d/mirakurunとか実行するとうまくいく。ちなみに /etc/logrotate.d/mirakurun は次のような感じ

/usr/local/var/log/mirakurun.std*.log
{
  su root root
  weekly
  compress
  rotate 52
  missingok
  notifempty
  compresscmd /usr/bin/xz
  uncompresscmd /usr/bin/unxz
  compressext .xz
  dateext
  postrotate
    pm2 reloadLogs
  endscript
}

何気なくlogrotate.serviceを眺めてみたら原因っぽいことが分かった

$ cat /usr/lib/systemd/system/logrotate.service
[Unit]
Description=Rotate log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
RequiresMountsFor=/var/log
ConditionACPower=true

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf

# performance options
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7

# hardening options
#  details: https://www.freedesktop.org/software/systemd/man/systemd.exec.html
#  no ProtectHome for userdir logs
#  no PrivateNetwork for mail deliviery
#  no ProtectKernelTunables for working SELinux with systemd older than 235
MemoryDenyWriteExecute=true
PrivateDevices=true
PrivateTmp=true
ProtectControlGroups=true
ProtectKernelModules=true
ProtectSystem=full
RestrictRealtime=true

ProtectSystemが怪しい。説明を見てみると、次のようなことが書いてあった。

If true, mounts the /usr and /boot directories read-only for processes invoked by this unit.

https://www.freedesktop.org/software/systemd/man/systemd.exec.htm

どうやら/usrがread-onlyになるようだ。ReadWritePaths=/usr/local/var/logでも指定すればいいのだろうか。後ほど試すことにする。

追記:試したがpm2 reloadLogsがコアダンプを起こして終了していた。MemoryDenyWriteExecuteが怪しい気がするが、あきらめる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です