systemd関連のメモ
Posted:
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 を有効にする
参考
Raspberry Pi を再起動するとシステム日時が狂う問題の解決法
- ラズパイにRTCが無い事に気づいてなくて焦った。ここを参考に systemd-timesyncdの設定を行った。
Systemctlサービスを使用してSystemdサービスとユニットを管理する方法 | DigitalOcean
- systemdのユニットの操作で参考になった。
systemd サービスユニット覚書 #Linux - Qiita
- 困ったら見る場所
systemd-networkdがオンラインにならないの - Gentoo metalog
- NFSマウントができない時に非常に参考になった
- ただインターフェースが有効になるまで待つ、ので時間がかかる。
- NFSマウントができない時に非常に参考になった
Linuxサーバ起動時のsystemd-networkd-wait-onlineの待機を解除する #Linux - Qiita
- 私の環境だと「wlan0はデバイスとして存在するが使用しない」という環境だったので –ignore の設定方法が参考になった。