systemd関連のメモ

systemd関連の雑多なメモ

設定ファイルの場所

| /etc/systemd/system/ | ユーザーが作成またはカスタマイズしたユニットファイルが置かれる場所。 | | /lib/systemd/system/ | システムのデフォルトのユニットファイルが置かれる場所。 | | /usr/lib/systemd/system/ | いくつかのディストリビューションでは、システムのデフォルトのユニットファイルがここに配置される場合がある。 |

起動シーケンスの確認

systemd-analyze critical-chain unitname

事前の処理を追加したい場合 ExecStartPre=

man systemd.service 日本語訳 #Linux - Qiita これが参考になった。

ntpdを使わずsystemd-timesyncdを使う

既存のntpdが起動しているとsystemd-timesyncdの設定があってもntpdが優先されるのでアンインストールしたほうが良い。

emerge –unmerge net-misc/ntp

その上で /etc/systemd/timesyncd.conf を参考に設定を行う。 /etc/systemd/timesyncd.confに書いてあるが、 /etc/systemd/配下にtimesyncd.conf.dというディレクトリを作成し配下にファイルをおいたほうが良い。

私は下記のシンプルな内容で設定した。

[Time]
NTP=ntp.nict.jp

logrotateがうまく行かない

/var/log/messagesがログローテートされていない。 –forceを付けて実行するとローテートされる。が、rsyslogdが再起動していない。

logrotate --force /etc/logrotate.conf

/etc/logrotate.d/rsyslog は下記の内容だった。

/var/log/auth.log
/var/log/cron.log
/var/log/daemon.log
/var/log/kern.log
/var/log/lpr.log
/var/log/mail.log
/var/log/news.log
/var/log/user.log
/var/log/debug.log
/var/log/messages
{
        rotate 4
        daily
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                if type -p systemctl 2>&1 1>/dev/null && systemctl is-system-running 2>&1 1>/dev/null ; then
                        systemctl kill -s HUP rsyslog.service
                else
                        test -r /run/rsyslogd.pid && kill -HUP $(cat /run/rsyslogd.pid) 2>&1 1>/dev/null
                fi
        endscript
}

postroteteの処理を追う。ifの条件が2つともtrueであればsystemctlで再起動、 falseであれば、/run/rsyslogd.pidにpidの番号がある事を期待し再起動を試みる。

systemctlが存在するかチェック

if type -p systemctl

systemctlの状態(running, degraded, maintenanceなど)を確認

systemctl is-system-running 2>&1 1>/dev/null ; then

試しに systemctl is-system-running を試すと degraded だった(エラーコードは1)。 なんにしてもdegradedは良くないが。

exampleuser@k3s-prd-server /e/logrotate.d> sudo systemctl is-system-running
degraded

また /run/rsyslog.pidは無い。のでrsyslogdの再起動は実行されない。 (logrotate –force とすると、ローテートは実行される)

exampleuser@k3s-prd-server /e/logrotate.d [1]> ls /run/
agetty.reload     chrony/       crond.pid  fsck/  mount/         rpcbind/       sm-notify.pid  systemd/     user/
autofs.cmd.fifo|  credentials/  dbus/      lock/  pppd/          rpcbind.lock   sshd.pid       tmpfiles.d/  utmp
blkid/            cron.reboot   faillock/  log/   rpc.statd.pid  rpcbind.sock=  sudo/          udev/

起動していないユニットは3つあった。

exampleuser@k3s-prd-server /e/logrotate.d> systemctl list-units --state=failed
  UNIT                        LOAD   ACTIVE SUB    DESCRIPTION
● systemd-growfs-root.service loaded failed failed Grow Root File System
● systemd-repart.service      loaded failed failed Repartition Root Disk
● systemd-oomd.socket         loaded failed failed Userspace Out-Of-Memory (OOM) Killer Socket

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.
3 loaded units listed.

上記3つのユニットは手動でrestartするとどれも正常に実行された。ラズパイの起動中のタイミングだとうまく動作しないようだ。

systemctl is-system-running も running を返すようになった。

直近でログローテートの検証をしているので–forceを付けてローテートの検証をしてみるがOK。ローテートされた。

logrotate –force /etc/logrotate.conf

systemctl is-system-running も running を返すようになり、rsyslogdの再起動もされるようになった。

起動しないユニットがある(起動後、手動でrestartすれば正常動作する)

起動直後、下記ユニットがfailedであった。 起動後、手動でrestartすると正常動作する。何か依存関係で失敗しているのだろうか? 確認し解消した。

$ systemctl list-units --state=failed
  UNIT                                      LOAD   ACTIVE SUB    DESCRIPTION
● etc-portage-package.accept_keywords.mount loaded failed failed /etc/portage/package.accept_keywords
● etc-portage-package.env.mount             loaded failed failed /etc/portage/package.env
● etc-portage-package.mask.mount            loaded failed failed /etc/portage/package.mask
● etc-portage-package.use.mount             loaded failed failed /etc/portage/package.use
● var-cache-binpkgs.mount                   loaded failed failed /var/cache/binpkgs
● systemd-growfs-root.service               loaded failed failed Grow Root File System
● systemd-repart.service                    loaded failed failed Repartition Root Disk
● systemd-oomd.socket                       loaded failed failed Userspace Out-Of-Memory (OOM) Killer Socket

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.
8 loaded units listed.

例えば etc-portage-package.accept_keywords.mount の依存関係を確認する。

systemctl list-dependencies etc-portage-package.accept_keywords.mount
etc-portage-package.accept_keywords.mount
● ├─-.mount
● ├─system.slice
● └─network-online.target

クリティカルパスを確認する

$ systemd-analyze critical-chain etc-portage-package.accept_keywords.mount
The time when unit became active or started is printed after the "@" character.
The time the unit took to start is printed after the "+" character.

etc-portage-package.accept_keywords.mount +256ms
└─network-online.target @8.982s
  └─network.target @8.982s
    └─systemd-resolved.service @8.657s +324ms
      └─systemd-tmpfiles-setup.service @8.288s +330ms
        └─systemd-journal-flush.service @2.777s +5.483s
          └─systemd-remount-fs.service @2.486s +191ms
            └─systemd-journald.socket @2.180s
              └─-.mount @1.969s
                └─-.slice @1.969s

上記のうち下記が赤字だった。

  • systemd-resolved.service
  • systemd-tmpfiles-setup.service
  • systemd-journal-flush.service
  • systemd-remount-fs.service

mountするサービスの確認をするとNFSサーバへの疎通が取れていないログがあった

 sudo systemctl status etc-portage-package.accept_keywords.mount
× etc-portage-package.accept_keywords.mount - /etc/portage/package.accept_keywords
     Loaded: loaded (/etc/fstab; generated)
     Active: failed (Result: exit-code) since Tue 2024-01-16 22:44:37 JST; 47min ago
      Where: /etc/portage/package.accept_keywords
       What: 192.0.2.10:/Public/Gentoo/raspi64/etc/portage/package.accept_keywords
       Docs: man:fstab(5)
             man:systemd-fstab-generator(8)
        CPU: 93ms

 1月 16 22:45:25 k3s-prd-server mount[369]: mount.nfs: Network is unreachable for 192.0.2.10:/Public/Gentoo/raspi64/etc/portage/package.accept>
 1月 16 22:44:36 k3s-prd-server systemd[1]: etc-portage-package.accept_keywords.mount: Directory /etc/portage/package.accept_keywords to mount o>
 1月 16 22:44:36 k3s-prd-server systemd[1]: Mounting etc-portage-package.accept_keywords.mount...
 1月 16 22:44:37 k3s-prd-server systemd[1]: etc-portage-package.accept_keywords.mount: Mount process exited, code=exited, status=32/n/a
 1月 16 22:44:37 k3s-prd-server systemd[1]: etc-portage-package.accept_keywords.mount: Failed with result 'exit-code'.
 1月 16 22:44:37 k3s-prd-server systemd[1]: Failed to mount etc-portage-package.accept_keywords.mount.

検索してみると/etc/fstabのNFSマウントオプションに _netdev を追加すると良い、という話もあったが、私の環境ではマウントできなかった。 vers=3としてみても駄目。

systemd かつ mount.nfs: Network is unreachable で検索して見ると NFS - ArchWiki という情報が見つかった。

解決方法は簡単です。systemd-networkd-wait-online.service を有効化して、ネットワークが完全に設定されるまで待機するように systemd を設定してください。サービスが平行して起動しなくなるので起動時間は多少長くなります。

有効にしてみる。

$ sudo systemctl enable systemd-networkd-wait-online.service
Created symlink /etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service → /usr/lib/systemd/system/systemd-networkd-wait-online.service.

再起動後、NFSマウントができるようになった!

systemd-networkd-wait-online.service の処理を確認すると

/usr/lib/systemd/systemd-networkd-wait-online を起動している。

[Unit]
Description=Wait for Network to be Configured
Documentation=man:systemd-networkd-wait-online.service(8)
ConditionCapability=CAP_NET_ADMIN
DefaultDependencies=no
Conflicts=shutdown.target
BindsTo=systemd-networkd.service
After=systemd-networkd.service
Before=network-online.target shutdown.target

[Service]
Type=oneshot
ExecStart=/usr/lib/systemd/systemd-networkd-wait-online
RemainAfterExit=yes

[Install]
WantedBy=network-online.target

/usr/lib/systemd/systemd-networkd-wait-online はインターフェースが有効になるまで待つ。

$ /usr/lib/systemd/systemd-networkd-wait-online -h
systemd-networkd-wait-online [OPTIONS...]

Block until network is configured.

  -h --help                 Show this help
     --version              Print version string
  -q --quiet                Do not show status information
  -i --interface=INTERFACE[:MIN_OPERSTATE[:MAX_OPERSTATE]]
                            Block until at least these interfaces have appeared
     --ignore=INTERFACE     Don't take these interfaces into account
  -o --operational-state=MIN_OPERSTATE[:MAX_OPERSTATE]
                            Required operational state
  -4 --ipv4                 Requires at least one IPv4 address
  -6 --ipv6                 Requires at least one IPv6 address
     --any                  Wait until at least one of the interfaces is online
     --timeout=SECS         Maximum time to wait for network connectivity

See the systemd-networkd-wait-online.service(8) man page for details.

例えば下記のようにend0をチェックするとすぐ帰ってくる。

/usr/lib/systemd/systemd-networkd-wait-online --interface=end0

wlan0をチェックすると私の環境ではwlan0は設定していないので帰ってこない。

/usr/lib/systemd/systemd-networkd-wait-online --interface=end0

どのネットワークインターフェースを管理しているか?は

/run/systemd/netif/links/ 配下のファイルで確認できる。

私の環境だと 2 がイーサネットで、3がwifiだった。

cat /run/systemd/netif/links/3
# This is private data. Do not parse.
ADMIN_STATE=configuring
OPER_STATE=no-carrier
CARRIER_STATE=no-carrier
ADDRESS_STATE=off
IPV4_ADDRESS_STATE=off
IPV6_ADDRESS_STATE=off
ONLINE_STATE=offline
REQUIRED_FOR_ONLINE=yes
REQUIRED_OPER_STATE_FOR_ONLINE=degraded
REQUIRED_FAMILY_FOR_ONLINE=any
ACTIVATION_POLICY=up
NETWORK_FILE=/etc/systemd/network/dhcp.network
NETWORK_FILE_DROPINS=""
DNS=
NTP=
SIP=
DOMAINS=
ROUTE_DOMAINS=
LLMNR=yes
MDNS=yes

私はwifiは設定していないし、タイムアウトするまで2分程度、時間がかかっているようだ。

systemd-analyze critical-chain etc-portage-package.accept_keywords.mount
The time when unit became active or started is printed after the "@" character.
The time the unit took to start is printed after the "+" character.

etc-portage-package.accept_keywords.mount +267ms
└─network-online.target @2min 6.564s
  └─network.target @9.090s
    └─systemd-resolved.service @8.736s +353ms
      └─systemd-tmpfiles-setup.service @8.404s +298ms
        └─systemd-journal-flush.service @2.695s +5.669s
          └─systemd-remount-fs.service @2.439s +212ms
            └─systemd-journald.socket @2.184s
              └─system.slice @1.993s
                └─-.slice @1.992s

状況としてユニットがタイムアウトするまで時間をかけて失敗している(気持ち悪いな…)

$ sudo systemctl status systemd-networkd-wait-online.service
× systemd-networkd-wait-online.service - Wait for Network to be Configured
     Loaded: loaded (/usr/lib/systemd/system/systemd-networkd-wait-online.service; enabled; preset: disabled)
     Active: failed (Result: exit-code) since Tue 2024-01-16 23:39:20 JST; 16min ago
       Docs: man:systemd-networkd-wait-online.service(8)
    Process: 358 ExecStart=/usr/lib/systemd/systemd-networkd-wait-online (code=exited, status=1/FAILURE)
   Main PID: 358 (code=exited, status=1/FAILURE)
        CPU: 32ms

 4月 04 05:58:43 k3s-prd-server systemd[1]: Starting systemd-networkd-wait-online.service...
 1月 16 23:39:20 k3s-prd-server systemd-networkd-wait-online[358]: Timeout occurred while waiting for network connectivity.
 1月 16 23:39:20 k3s-prd-server systemd[1]: systemd-networkd-wait-online.service: Main process exited, code=exited, status=1/FAILURE
 1月 16 23:39:20 k3s-prd-server systemd[1]: systemd-networkd-wait-online.service: Failed with result 'exit-code'.
 1月 16 23:39:20 k3s-prd-server systemd[1]: Failed to start systemd-networkd-wait-online.service.

/usr/lib/systemd/systemd-networkd-wait-online このコマンドには –ignore オプションで無視するインターフェースをしていできる。 下記ファイルのExecStartに –ignore=wlan0 を追加すると、 systemd-networkd-wait-online.service が正常終了するようになった。

sudo vi /usr/lib/systemd/system/systemd-networkd-wait-online.service

結論としては私の環境では下記2点の変更が必要だった。

  • /usr/lib/systemd/system/systemd-networkd-wait-online.service の ExecStart に –ignore=wlan0 を追加する
  • systemd-networkd-wait-online.service を有効にする

参考