systemd-networkdを極める:Linuxネットワーキングのミニマリストガイド

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

無駄を削ぎ落とす:なぜミニマリストなネットワーキングが重要なのか

最近のほとんどのLinuxディストリビューションは、驚くほど重いネットワークスタックを搭載しています。NetplanのYAMLインデントエラーのデバッグに20分費やしたり、ヘッドレスサーバーでNetworkManagerの初期化を待ったりしたことがあるなら、その「肥大化」を実感しているはずです。NetworkManagerはWi-Fi信号を切り替えるラップトップには最適ですが、30MBから50MBのRAMを消費することが多く、小規模なIoTデバイスや軽量なVPSインスタンスにとっては大きな負担となります。

これらのハイレベルなツールは、本質的にはラッパーに過ぎません。接続が切れた際、実際のネットワークスタックではなく、ラッパーのトラブルシューティングをすることになってしまいます。systemd-networkdはそれを変えます。これは設定を直接管理するネイティブな組み込みサービスです。非常に軽量で、通常は8MB未満のメモリしか使用せず、一瞬で起動します。

高密度な環境において、systemd-networkdへの切り替えは決定的な違いをもたらすと私は確信しています。500台のRaspberry Piノード群において、この移行により1台あたりの起動時間が平均4秒短縮されました。これは、肥大化したマネージャーでは決して実現できないレベルの予測可能性を提供します。

3つの柱:systemd-networkdの仕組み

systemd-networkdのロジックを理解することは、複雑なCLIフラグを覚えるよりも簡単です。データベースや隠しスクリプトのことは忘れてください。このデーモンは、/etc/systemd/network/ に配置されたシンプルなテキストファイルに依存しています。

マスターする必要があるファイル形式は、以下の3つだけです:

  • .link: 低レベルのハードウェアマッチングを処理します。MACアドレスに基づいて eth0 を特定の名称に変更する場合などに使用します。
  • .netdev: 仮想デバイスを作成します。コンテナ用のブリッジやVLANタグが必要な場合は、ここから始めます。
  • .network: 日常的に使用するメインの設定ファイルです。DHCP、固定IP、ルーティングなど、インターフェースの実際の動作を定義します。

システムはこれらのファイルを辞書順で処理します。例えば、10-static.network という名前のファイルは 20-dhcp.network よりも優先されます。インターフェースがいずれかのファイル内のパターンに一致すると、システムはそれ以降のファイルの探索を停止します。このシンプルな階層構造により、設定の競合を防ぐことができます。

移行ガイド:システムの切り替え

理論から実践に移りましょう。現在のマネージャーを無効にし、クリーンで高性能なセットアップに移行します。

ステップ1:経路を確保する

systemd-networkd を起動する前に、他のサービスがハードウェアの制御を奪い合わないように停止させる必要があります。UbuntuやDebianでは、通常NetworkManagerが主な原因となります。

# 負荷の高いサービスを停止して無効化する
sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager

# Netplanユーザーへ:ネイティブなsystemd設定ファイルを記述することで、
# Netplanを完全にバイパスします。

ステップ2:ハードウェアを特定する

インターフェースの正確な名前が必要です。ip link を実行して、カーネルが何を検出しているかを確認してください。

ip link show

enp3s0eth0 といった名前を探します。以下の例では enp3s0 を使用します。

ステップ3:固定IPを設定する

新しい設定ファイルを作成します。数字のプレフィックス(接頭辞)を使用することで、後で複数のファイルの優先順位を制御できるようになります。

sudo nano /etc/systemd/network/10-static-enp3s0.network

以下の設定を挿入します:

[Match]
Name=enp3s0

[Network]
Address=192.168.1.50/24
Gateway=192.168.1.1
DNS=8.8.8.8
DNS=1.1.1.1

これはシステムに対し、enp3s0 を取得して固定IPを割り当て、GoogleとCloudflareのDNSサーバーを介してトラフィックをルーティングするよう指示するものです。

ステップ4:「設定したらお任せ」のDHCP構成

ルーターにIP割り当てを任せたい場合、設定はさらに短くなります。/etc/systemd/network/20-dhcp-wired.network を作成します:

[Match]
Name=enp*

[Network]
DHCP=yes

ワイルドカード enp* は強力なテクニックです。これにより、これらの文字で始まるすべてのイーサネットポートにこのルールが適用され、異なるハードウェアモデル間でも設定の移植性が高まります。

ステップ5:仮想化のためのブリッジ構築

LXCコンテナやKVM仮想マシンを実行する場合、ブリッジが必要です。従来、これには brctl ツールと複雑なスクリプトが必要でした。systemd-networkd を使えば、クリーンな2ステップの手順で完了します。

まず、/etc/systemd/network/25-br0.netdev でブリッジデバイスを定義します:

[NetDev]
Name=br0
Kind=bridge

次に、/etc/systemd/network/30-bind-br0.network で物理ポートをそのブリッジにバインドします:

[Match]
Name=enp3s0

[Network]
Bridge=br0

ステップ6:有効化

ここでデーモンを起動します。また、DNSロジックを適切に処理するために systemd-resolved も有効にする必要があります。

sudo systemctl enable --now systemd-networkd
sudo systemctl enable --now systemd-resolved

# レガシーアプリケーションをサポートするため、resolvedのスタブを /etc/resolv.conf にリンクします
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

検証とトラブルシューティング

networkctl を使用して作業内容を確認します。これは古い ifconfig よりもはるかに多くの情報を提供してくれます。

networkctl status
networkctl list

ステータスが「routable」および「configured」と表示されていれば、セットアップは正常です。問題が発生した場合は、ログを確認してください。これはネイティブなsystemdサービスであるため、すべてのネットワークイベントは中央のジャーナルに記録されます。

journalctl -u systemd-networkd -f

結論

GUIツールに慣れている場合、systemd-networkd への切り替えは大きな飛躍に感じるかもしれません。しかし、パフォーマンスの向上は疑いようがありません。ネットワーキングの「ブラックボックス」層を取り除き、直接的で予測可能な制御を可能にします。シンプルなテキストファイルとネイティブサービスを使用することで、起動が速く、自動化しやすく、長期的な保守が大幅に容易なシステムを構築できます。

Share: