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.target4が、networking.serviceとNetworkManager.serviceを依存関係として指定しています。
測定結果は、systemd-analyzeコマンドで計測した10回の試行の平均値です。
NetworkManagerの概要
NetworkManagerはユーザーフレンドリーなインターフェースを提供し、複数のネットワークインターフェースを効率的に切り替えることを可能にするデーモンです。
NetworkManager.serviceを有効にすることで、OS起動時に自動的にNetworkManagerが起動し、ネットワーク接続を管理します。NetworkManager.serviceにはNetworkManager-wait-online.service5と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.conf6で変更可能です。
/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ベースを使う気がします。最悪、自分でビルドしてどうにかしようと思います。)