Raspberry Pi Zero 2のネットワークデーモンに関して
Raspberry Pi Zero 2 Wにおけるネットワークデーモンのシステム起動時間への影響について検証しました。
対象は、NetworkManager、systemd-networkd、networking.service (ifup/down)の三つの主要なネットワーク管理システムです。
テスト環境
- ボード: Raspberry Pi Zero 2 W Rev 1.0
- OS: Raspberry Pi OS Lite (64-bit) – 2023-10-10リリース
- microSD: SanDisk Extreme 32GB (UHS-I U30 V30)
- 有線LANアダプター: TP-Link UE300C
2023年10月10日のRaspberry Pi OSリリースに伴い、デフォルトのネットワークデーモンがdhcpcd1からNetworkManager2に変更されました3。
デフォルトで、network-online.target
4が、networking.service
とNetworkManager.service
を依存関係として指定しています。
測定結果は、systemd-analyzeコマンドで計測した10回の試行の平均値です。
NetworkManagerの概要
NetworkManagerはユーザーフレンドリーなインターフェースを提供し、複数のネットワークインターフェースを効率的に切り替えることを可能にするデーモンです。
NetworkManager.service
を有効にすることで、OS起動時に自動的にNetworkManagerが起動し、ネットワーク接続を管理します。NetworkManager.service
にはNetworkManager-wait-online.service
5とNetworkManager-dispatcher.service
がalsoとして登録されています。
NetworkManager-wait-online.service
は、特定のインターフェース(例: eth0)にキャリア(物理的接続)が存在するかを確認するサービスです。これにより、ネットワーク接続が必要な他のサービスやアプリケーションが適切なネットワーク接続完了後に起動することを保証します。
起動順序
NetworkManager.serviceに続き、NetworkManager-wait-online.serviceが起動し、適切なネットワーク接続が確立されるまで他のサービスの起動を待機します。以下はそのプロセスのイメージです。
起動時間の計測 1
以下の表は、有線LANアダプターとネットワークケーブルの接続状態に応じた、各サービスの起動時間を示しています。
eth adapter | Network Cable | NetworkManager.service [s] | NetworkManager-wait-online.service [s] | Kernel Time [s] | Userspace Time [s] | Total Time [s] |
---|---|---|---|---|---|---|
○ | ○ | 1.1182 | 1.6457 | 6.4387 | 12.0592 | 18.4982 |
× | × | 1.1508 | 1.5773 | 6.2877 | 11.5893 | 17.8774 |
○ | × | 1.1253 | 6.6318 | 6.4627 | 17.1111 | 23.5741 |
LANアダプターがない場合、ドライバが不要なためカーネルの起動時間が短縮されます。一方で、アダプターがありながらネットワークケーブルが未接続の場合、NetworkManager-wait-online.service
は約5秒間停止します。これはcarrier-wait-timeout
のデフォルト設定(5000ミリ秒)によるものです。NetworkManager.conf
6で変更可能です。
/etc/network/interfacesとの干渉
/etc/NetworkManager/NetworkManager.conf
に以下の記述があるので、/etc/network/interfaces
で定義されたインターフェースはNetworkManagerによって管理されないようです。
managed=false
/etc/network/interfaces
ファイルが基本的に空で、そして /etc/network/interfaces.d
ディレクトリも空であるため、networking.service
が起動時に実際に何も設定するインターフェースがない可能性があります。このため、networking.service
は何のエラーも発生せずにすぐに終了します。
networking.service
networking.service
は、伝統的なDebian系ネットワーク管理方法を提供するデーモンで、/etc/network/interfaces
ファイルに基づいたネットワーク設定をifup
コマンドを使用し適用します。
このデーモンは、特に静的IP設定や特定のネットワーク設定スクリプトに依存する環境に適しています。
Debianの特定の修正により、/etc/default/networking
の設定が--read-environment
オプションがなくても読み込まれるようになっていますが、これは推奨されている方法ではなさそうです7。
インターフェースの設定例
以下は、eth0インターフェースをDHCPを介して自動的に起動するための設定例です。
この設定により、ifupが実行されるとdhclient8プロセスが開始され、eth0インターフェースにIPアドレスが割り当てられます。
dhclientのデフォルトのタイムアウト設定は60秒ですが、これはdhclient.conf
でカスタマイズ可能です。
起動時間の計測 2
以下の表は、有線LANアダプターとネットワークケーブルの接続状態に応じた、networking.service
の起動時間を示しています。
eth adapter | Network Cable | networking.service [s] | Kernel Time [s] | Userspace Time [s] | Total Time [s] |
---|---|---|---|---|---|
○ | ○ | 10.7240 | 6.4660 | 19.6007 | 26.0674 |
× | × | 1.8900 | 6.2849 | 10.3421 | 16.6274 |
○ | × | 62.6896 | 6.4492 | 71.5641 | 78.0136 |
アダプターが接続されていてもネットワークケーブルが接続されていない場合、dhclientがタイムアウトするまでの長い待機時間が発生します。 アダプターが存在しない場合、起動時間が著しく短縮されることが確認できます。 これは、ネットワーク構成の自動探索が行われないためだと思われます。
systemd-networkd
systemd-networkdは、システムの起動と密接に統合されたネットワーク設定を提供するデーモンです。これを利用するためには、systemd-networkd.service
を起動し、通常このサービスを有効にするとsystemd-networkd-wait-online.service
も同時に有効になります。
systemd-networkd-wait-online.service
はネットワークが利用可能になるまで起動を待機するサービスで、デフォルトで120秒のタイムアウトが設定されています9。
インターフェースの設定例
systemd-networkdを使用するには、以下のような設定ファイルを/etc/systemd/network
に配置します。
ここでName=eth0
は対象のネットワークインターフェースを指定し、DHCP=yes
でDHCPを介して自動的にIPアドレスを取得するよう指示します。
networkctlコマンドでネットワークインターフェースを確認し、以下のように有効にします。
設定ファイルは/usr/lib/systemd/network
ディレクトリまたは/etc/systemd/network
ディレクトリに置きます。/etc/systemd/network
ディレクトリにある設定ファイルが優先されます。
# /etc/systemd/network/50-wired.network
[Match]
Name=eth0
[Network]
DHCP=yes
起動時間の計測 3
以下の表は、有線LANアダプターとネットワークケーブルの接続状態に応じた、systemd-networkd.service
とsystemd-networkd-wait-online.service
の起動時間を示しています。
eth adapter | Network Cable | systemd-networkd.service [s] | systemd-networkd-wait-online.service [s] | Kernel Time [s] | Userspace Time [s] | Total Time [s] |
---|---|---|---|---|---|---|
○ | ○ | 2.2073 | 2.7145 | 6.4470 | 10.8495 | 17.2969 |
× | × | 2.0444 | 120.3914 | 6.3001 | 126.4118 | 132.7122 |
○ | × | 2.0385 | 120.3782 | 6.4466 | 126.4923 | 132.9396 |
アダプターが接続されており、ネットワークケーブルが繋がっている場合には、systemd-networkd
及びsystemd-networkd-wait-online.service
の起動は迅速です。
しかし、ネットワークケーブルが接続されていない場合、systemd-networkd-wait-online.service
は設定されたタイムアウト値まで待機し、その結果として起動時間が大幅に増加します。
まとめ
Raspberry Pi Zero 2 Wでの異なるネットワークデーモンのパフォーマンスと特徴について検証しました。 NetworkManager、networking.service、systemd-networkdの三つのデーモンを対象に、それぞれの起動時間の影響と使用状況に適した環境を評価しました。
個人的には、特にLANアダプターなしで、ネットワークケーブルが接続されていない状態での起動速度が速い方が良いので、networking.service
がありです。
(ただ、そもそも、Bookworm
になってカーネルの起動時間が長くなったので、とりあえずはBullseye
ベースを使う気がします。最悪、自分でビルドしてどうにかしようと思います。)