我が家では仮想化プラットフォームとしてProxmox VEを使用している。
LXCコンテナでDebianやUbuntuを作成すると起動に時間がかかったので原因を調べて改善した。
原因 🔗
原因はnetworking.serviceの起動に非常に時間がかかっていたことで、以下のコマンドを見ると5分かかっていることが分かった。
systemd-analyze blame
networking.serviceの一部を抜粋するとこのようになっており5分かかる理由とも合致する。
/lib/systemd/system/networking.service[Service]
ExecStart=/sbin/ifup -a --read-environment
TimeoutStartSec=5min
解決策 🔗
networking.serviceによるIPv6アドレスの割当を無効化する 🔗
今回作成したLXCコンテナが所属するネットワークにはIPv6アドレスを配布していないにも関わらず、Proxmox VE上ではネットデバイスのIPv6アドレスをDHCPとしていた。
そのため、IPv6アドレスを取得出来ないにも関わらずタイムアウトまで待ち続けていた。
Proxmox VEのUI上からIPv6を静的に変更することで解決した。
networking.serviceのタイムアウトを短くする 🔗
その他の比較的良い解決策としてはタイムアウトを短くすること。
DHCPサーバーの検証などをしている時はこちらのほうが良い。
/etc/systemd/system/networking.service.d/override.conf
ファイルを作成し、タイムアウトまでの時間を上書きする。
/etc/systemd/system/networking.service.d/override.conf[Service]
TimeoutStartSec=5sec
設定されたことを確認する。
systemctl daemon-reload
systemctl show networking.service | grep TimeoutStart
# => TimeoutStartUSec=5s
その他 🔗
systemd-network-wait-online.serviceも似たような話かも(未検証) 🔗
今回は無関係だったが、 systemd-network-wait-online.service
のせいで起動に時間がかかるという話もちらほら聞く。
原因はおそらく似たような話で、複数のネットワークインターフェイスを持つ場合にLANケーブルが繋がっていないインターフェイスの接続を待っているのではないかと思う。
systemd-network-wait-online.service
を無効化していることが多いが、以下のように設定してマッチしなかったネットワークインターフェイスについては RequiredForOnline=no
にするのが良いと思う。
/etc/systemd/network/10-eth0.network[Match]
Name=eth0
[Network]
DHCP=yes
IPv6AcceptRA=yes
/etc/systemd/network/99-ignore.network[Match]
Name=*
[Link]
RequiredForOnline=no
# systemd 248以降であれば以下の設定も可能
# ActivationPolicy=always-down
[Network]
DHCP=no
IPv6AcceptRA=no