skip to content
鰭狀漏斗
目次

在先前的文章,我有提過可以讓 systemd 服務加上 After=network-online.target 使它在網路可以用(網路管理服務開始)的時候才啟動。但因為 network-online.target 是系統層級的 target unit,所以使用者層級的服務是無法直接依賴 network-online.target 的。

對於 Podman 的 rootless Quadlet 來說也會遇到一樣的問題,所以如果你在 user namespace 的 example.container 中寫 After=network-online.target 是沒有效果的。所以 Podman 引入了 podman-user-wait-network-online.service 以嘗試解決這個問題,這個檔案的全文是這樣的:

podman-user-wait-network-online.service
[Unit]
Description=Wait for system level network-online.target as user.
Documentation=https://github.com/containers/podman/issues/22197
Documentation=man:podman-systemd.unit(5)
[Service]
Type=oneshot
# Set a timeout as by default oneshot does not have one and in case network-online.target
# never comes online we do not want to block forever, 90s is the default systemd unit timeout.
TimeoutStartSec=90s
ExecStart=/bin/sh -c 'until systemctl is-active network-online.target; do sleep 0.5; done'
RemainAfterExit=yes

它用 systemctl is-active network-online.target 指令每 0.5 秒追蹤一次 network-online.target 的狀態,如果回傳 active 就代表 network-online.target 已經達到了。

但這個做法有個問題,如果沒有任何 systemd 服務依賴 network-online.target,network-online.target 就會一直維持 inactive,就算網路已經可以正常運作也一樣。對於全新安裝的 Arch Linux 來說,只有在每週的某個時候會執行一次的 archlinux-keyring-wkd-sync.service 會依賴 network-online.target,讓它變 active。

因為 Quadlet 預設會對使用者層級的 Quadlet 檔案加入 podman-user-wait-network-online.service 的依賴關係,所以每次用 Quadlet 開啟或重啟 Podman 容器時都要等一分半讓 podman-user-wait-network-online.service 超時終止後才能啟動。

這個問題到現在都還沒有解決,但在 issue 中有提到很多種變通方式。我覺得最簡單易懂的方式是 issue 原作者提出的,建立一個系統層級的 dummy systemd 服務,只是依賴 network-online.target,讓它能變 active。

參考資料