「Systemd-networkd」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(リンクを修正)
149行目: 149行目:
 
==== インターフェイスの名前を変更 ====
 
==== インターフェイスの名前を変更 ====
   
[[ネットワーク設定#デバイス名の変更|udev ルールを編集]]するかわりに {{ic|.link}} ファイルを使ってインターフェイスの名前を変更できます。MAC アドレスに基づいて USB-to-Ethernet アダプタに予測可能なインターフェイス名を設定する例 (通常は接続された USB 端子によって名前が変わってしまいます):
+
[[ネットワーク設定#インターフェイス名の変更|udev ルールを編集]]するかわりに {{ic|.link}} ファイルを使ってインターフェイスの名前を変更できます。MAC アドレスに基づいて USB-to-Ethernet アダプタに予測可能なインターフェイス名を設定する例 (通常は接続された USB 端子によって名前が変わってしまいます):
   
 
{{hc|head=/etc/systemd/network/10-ethusb0.link|output=
 
{{hc|head=/etc/systemd/network/10-ethusb0.link|output=

2022年6月4日 (土) 08:06時点における版

この記事あるいはセクションは翻訳の途中です。
ノート: 内容が古くなっています。翻訳にご協力または英語版を参照してください。 (議論: トーク:Systemd-networkd#)

関連記事

systemd-networkd はネットワーク設定を管理するシステムデーモンです。ネットワークデバイスが立ち上がるとそれを検出して設定を行います。また、仮想ネットワークデバイスを作成することもできます。このサービスは systemd-nspawn で管理されるコンテナまたは仮想マシンの複雑なネットワークを設定する場合にとても役に立ちます。また、単純な接続でも正常に動作します。

基本的な使い方

systemd パッケージは Arch ではデフォルトでインストールされており、有線ネットワークに接続するために必要なファイルは全て揃っています。後で述べているように、wpa_supplicantiwd など他のサービスを使うことで無線アダプタを設定することもできます。

必要なサービスと設定

systemd-networkd を使用するには、systemd-networkd.service 起動/有効化します。

ノート: ネットワークを設定したい他のサービスが起動していないことを確認する必要があります。実際、複数のネットワークサービスが競合してしまいます。現在動作しているサービスの一覧は systemctl --type=service で確認でき、それらを 停止 して下さい。

また、ネットワーク名前解決サービスである systemd-resolved は,以下の点を考慮して任意に設定して下さい。

  • 使用する DNS を適切に設定するためには、resolv.confsystemd-resolved の相互作用を理解することが重要です。 systemd-resolved にいくつかの解説があります。
  • DNS エントリーが .network ファイルで指定されている場合は systemd-resolved が必要です。
  • systemd-resolved は、DHCP サーバーまたは IPv6 ルーターから DNS アドレスを取得する場合にも必要です。

(DHCP= および IPv6AcceptRA= セクションの [Network] および UseDNS=yes (デフォルト) 、[DHCPv4][DHCPv6][IPv6AcceptRA]systemd.network(5) を参照してください。) を設定します。

  • systemd-networkd 無しでも systemd-resolved を使うことができることに注意してください。

system-networkd-wait-online

systemd-networkd.service を有効にすると、 systemd-networkd-wait-online.service も有効になります。これは、ネットワークが構成されるのを待つワンショット・システム・サービスです。後者は WantedBy=network-online.target を持っているので、 network-online.target 自身が有効になっているか、他のユニットに引き寄せられた時にのみ起動します。 Systemd#ネットワークが稼働した後にサービスを実行するも参照してください。

デフォルトでは、 systemd-networkd-wait-online.service は、認識され systemd-networkd によって管理されているすべてのリンクが完全に設定されるか、または失敗しても、少なくとも1つのリンクがオンラインになるまで待機します。

システムに複数のネットワークインタフェースがあるが、常時接続されているとは想定されていないものもある場合 (例えば、 dual-port Ethernet を使用しているが、ケーブルが1本しか接続されていない場合)、 system-networkd-wait-online.service の起動は、デフォルトのタイムアウトである2分後に失敗します。これにより、起動プロセスに不要な遅延が発生する可能性があります。すべての インターフェイスではなく 任意の インターフェイスがオンラインになるまで待機する動作に変更するには、サービスを編集し、--any パラメータを ExecStart 行に追加します。

/etc/systemd/system/systemd-networkd-wait-online.service.d/wait-for-only-one-interface.conf
[Service]
ExecStart=
ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --any

無視されたインターフェイスや動作状態など、その他の動作も設定できます。使用可能なパラメータについては、 systemd-networkd-wait-online(8) を参照してください。

設定ファイルの例

このセクションにおける設定はすべて /etc/systemd/network の中に foo.network として保存します。利用できるオプションや処理の順番については、#設定ファイルsystemd.network(5) の man ページを見て下さい。

まずシステムのデバイス名を知る必要があります。昔は、eth0 がシステム上の1番目の NIC に付けられていましたが、現在 udev は別の名前を使用するようになっています。networkctl list を使ってシステム上のデバイスを確認してください。

設定ファイルに変更を加えたら、networkd デーモンをリロードしてください:

# systemctl restart systemd-networkd 
ノート:
  • 以下の例では、enp1s0 が有線アダプタ、wlp2s0 が無線アダプタです。環境によって名前は変わります。Name=en* のようにワイルドカードを使うこともできます。
  • IPv6 を無効化したい場合、ルーターが IPv6 を喧伝しているときは [Network] セクションに IPv6AcceptRA=false を追加する必要があります。

有線アダプタで DHCP を使用

/etc/systemd/network/20-wired.network
[Match]
Name=enp1s0

[Network]
DHCP=ipv4

有線アダプタで固定 IP を使用

/etc/systemd/network/20-wired.network
[Match]
Name=enp1s0

[Network]
Address=10.1.10.9/24
Gateway=10.1.10.1
DNS=10.1.10.1
#DNS=8.8.8.8

IP アドレスを複数指定することもできます。Address= 行を追加して IPv6 アドレスを指定してください。DNS サーバーやブロードキャストアドレスを指定するネットワークオプションは systemd.network(5) の man ページを見て下さい。

無線アダプタ

systemd-networkd で無線ネットワークに接続するには、wpa_supplicantiwd などの別のアプリケーションで設定された無線アダプタが必要です。

/etc/systemd/network/25-wireless.network
[Match]
Name=wlp2s0

[Network]
DHCP=ipv4

無線アダプタで固定 IP アドレスを使っている場合、設定は (インターフェイス名を除いて) 有線アダプタと同じになります。

無線スネットワークへの認証には、wpa_supplicantiwd などを使用します。

同一マシンで有線アダプタと無線アダプタ両方を使用

以下の設定では、Metric ディレクティブを使用して、有線と無線両方の接続で DHCP IP を有効にしており、カーネルがオンザフライでどちらを使うか決定します。有線接続が切断されると、即座に無線に切り替わります。接続が途切れることはありません。

システム上の無線・有線どちらのデバイスも有効な接続がある場合、カーネルのルートメトリック (ip で設定するのと同一) がパケットを送るのにどちらのルートを使用するか決定します。均衡状態を破るために、カーネルはメトリックを使います。メトリックの良い所は、どちらかが使えなくなったときに、自動的にもう片方が有効になることです。

ノート: Metric オプションはスタティックルーティングの設定を行います。RouteMetric オプションはスタティックルーティングの設定をしないセットアップ用です。詳細については systemd.network(5) を参照して下さい
/etc/systemd/network/20-wired.network
[Match]
Name=enp1s0

[Network]
DHCP=ipv4

[DHCP]
RouteMetric=10
/etc/systemd/network/25-wireless.network
[Match]
Name=wlp2s0

[Network]
DHCP=ipv4

[DHCP]
RouteMetric=20

IPv6 を使用している場合は、次のように IPv6 ルートのメトリックも個別に設定する必要があります。

/etc/systemd/network/20-wired.network
...

[IPv6AcceptRA]
RouteMetric=10
/etc/systemd/network/25-wireless.network
...

[IPv6AcceptRA]
RouteMetric=20

インターフェイスの名前を変更

udev ルールを編集するかわりに .link ファイルを使ってインターフェイスの名前を変更できます。MAC アドレスに基づいて USB-to-Ethernet アダプタに予測可能なインターフェイス名を設定する例 (通常は接続された USB 端子によって名前が変わってしまいます):

/etc/systemd/network/10-ethusb0.link
[Match]
MACAddress=12:34:56:78:90:ab

[Link]
Description=USB to Ethernet Adapter
Name=ethusb0
ノート: ユーザーが作成した .link ファイルが先に有効になるように、デフォルト設定の 99-default.link よりも辞書的に早い順番になるような名前を付けてください。例えば、ethusb0.link という名前を付けたい場合は 10-ethusb0.link としてください。

設定ファイル

設定ファイルは /usr/lib/systemd/network から、そして一時的な実行時のネットワークディレクトリ /run/systemd/network とローカルのネットワーク管理ディレクトリ /etc/systemd/network から読み込まれます。/etc/systemd/network 内のファイルが一番優先されます。

3つのタイプの設定ファイルが存在します。ファイルのフォーマットは systemd のユニットファイルと似ています。

  • .network ファイル。マッチするデバイスにネットワーク設定を適用します。
  • .netdev ファイル。マッチする環境に仮想ネットワークデバイスを作成します。
  • .link ファイル。ネットワークデバイスが作られた時、udev は最初にマッチする .link ファイルを探します。

これらの設定ファイルは同じルールに従っています:

  • [Match] セクションの全ての条件がマッチすれば、プロファイルが有効になります。
  • 空の [Match] セクションはどんな場合でもそのセクションを適用することを示します (いわば * ジョーカーのようなものです)。
  • 全ての設定ファイルは辞書順でまとめてソートされ処理されます。ファイルがどのディレクトリにあるかは関係ありません。
  • 同じ名前のファイルは互いを置き換えます。
ヒント:
  • /usr/lib/systemd/network にあるシステムによって提供されたファイルを上書きする (アップグレードしても変わらないようにする) には、/etc/systemd/network に同じ名前のファイルを配置して /dev/null にシンボリックリンクを張って下さい。
  • VALUE には * ジョーカーを使うことができます (例: en* は全ての Ethernet デバイスにマッチします)。
  • Arch-general スレッドによれば、特定のコンテナのネットワーク設定は networkd 設定ファイルを使ってコンテナの中で設定するのがベストプラクティスです。

network ファイル

このファイルはネットワーク設定の変数の設定、特にサーバーとコンテナの設定のために存在します。

.network ファイルには次のセクションを記述できます: [Match], [Link], [Network], [Address], [Route], [DHCP]。以下ではそれぞれのセクションでよく使われる設定キーを説明します。詳しくは systemd.network(5) を見てください。

[Match]

  • Name= デバイスの名前
  • Host= マシンのホストネーム
  • Virtualization= システムが仮想化環境で起動されているかどうかをチェックします。Virtualization=no キーはホストマシンでのみ適用され、逆に Virtualization=yes はコンテナや VM で適用されます。

[Link]

  • MACAddress= MAC アドレスを偽装することができます。
  • MTUBytes= 最大転送単位をバイトで指定 (K, M, G を後ろに付けることができ、1024の倍数として認識されます)。MTU の値を大きくすることでネットワークの転送速度を速くすることが可能です (ジャンボフレーム)。

[Network]

  • DHCP= DHCP クライアントを有効にします。
  • DHCPServer= DHCP サーバーを有効にします。
  • DNS= DNS サーバーのアドレス
  • Bridge= ブリッジの名前
  • IPForward= IP パケットの転送を有効にします。
  • Domains= DNS によるホスト名解決に使用するドメインのリスト。

[Address]

  • Address= 固定の IPv4 または IPv6 アドレスとそのプレフィックス長で、/ を使って区切ります (例: 192.168.1.90/24)。DHCP を使用しない場合このオプションは必須です。

[Route]

  • Gateway= はマシンのゲートウェイのアドレスです。DHCP を使用しない場合このオプションは必須です。
  • Destination= はルートの宛先プリフィックスです。スラッシュとプリフィックス長を後ろに付けることができます。

[Route] セクションに Destination が存在しない場合、デフォルトルートとして扱われます。

ヒント: [Address] が Address キーだけを含み [Route] セクションが Gateway キーだけを含む場合、略式表記として [Network] セクションに Address=Gateway= キーを記述することができます。

[DHCP]

  • UseDomains=true systemd-resolved を使用する場合にローカル名の解決を修正します。

[DHCPServer]

これは、無線ホットスポットを作成するために hostapd とうまく連動する DHCP サーバーの設定例です。IPMasqueradeNATを有効にする ためのファイアウォールルールを追加し、IPForward=ipv4 パケット転送 を有効にしています。

この記事またはセクションの正確性には問題があります。
理由: IPMasquerade=truefilter テーブルのルールを追加しません、それらは手動で追加する必要があります。systemd-nspawn#仮想イーサネットリンクを使用する を参照してください (議論: トーク:Systemd-networkd#)

/etc/systemd/network/wlan0.network
[Match]
Name=wlan0
​
[Network]
Address=10.1.1.1/24
DHCPServer=true
IPMasquerade=true
​
[DHCPServer]
PoolOffset=100
PoolSize=20
EmitDNS=yes
DNS=9.9.9.9

netdev ファイル

このファイルは仮想ネットワークデバイスを作成します。.netdev ファイルには次のセクションを記述できます: [Match][NetDev]。以下ではそれぞれのセクションでよく使われる設定キーを説明します。詳しくは systemd.netdev(5) を見てください。

[Match]

  • Host= ホストネーム
  • Virtualization= VM の中で実行されているかどうか確認する。

[NetDev]

  • Name= は netdev を作成するときに使うインターフェイスの名前です。このオプションは必須です。
  • Kind= は netdev の種類になります。現在 bridge, bond, vlan, veth, sit などがサポートされています。このオプションは必須です。

link ファイル

このファイルはカスタム udev ルールの代わりとなりデバイスが現れた時に udev によって適用されます。2つのセクションを記述します: [Match][Link]。以下ではそれぞれのセクションでよく使われる設定キーを説明しています。詳しくは systemd.link(5) を参照してください。

ヒント: .link ファイルの問題を診断したいときは udevadm test-builtin net_setup_link /sys/path/to/network/device を使ってください。

[Match]

  • MACAddress= MAC アドレス
  • Host= ホストネーム
  • Virtualization=
  • Type= デバイスのタイプ (例: vlan)

[Link]

  • MACAddressPolicy= は永続的な MAC アドレスをハードウェアに設定する persistent (ほとんどのハードウェアはこちらにするべきです) またはデバイスが現れた時にランダムな MAC アドレスを与える random を指定します。
  • MACAddress= 特定のアドレス。
ノート: ほとんどの場合システムの /usr/lib/systemd/network/99-default.link で基本的に問題ありません。

コンテナでの使用方法

systemd 210 以上でサービスが利用可能です。ホストやコンテナで systemd-networkd.service有効化・起動することができます。

デバッグするときのために bridge-utils, net-tools, iproute2 パッケージをインストールすることが強く推奨されます。

systemd-nspawn を使用する場合、ネットワーク設定によっては、systemd-nspawn@.service を編集して ExecStart 行にブートオプションを追加する必要があります。オプションの完全なリストは systemd-nspawn(1) を参照してください。

DHCP による自動 DNS 設定を利用したい場合は、systemd-resolved を有効にして /run/systemd/resolve/resolv.conf から /etc/resolv.conf にシンボリックリンクを張る必要があります。詳しくは systemd-resolved.service(8) を見て下さい。

ヒント: コンテナネットワークの設定を始める前に:
  • netctl サービスを全て無効にしてください。無効にすることで systemd-networkd との危険な衝突を回避することができ設定のテストが楽になります。さらに、有効な netctl プロファイルが残ったまま終了する可能性が少なくなります。$ netctl list コマンドは全てのプロファイルのリストを表示し、有効になっているプロファイルには星印が付きます。
  • systemd-nspawn@.service を無効にしてコンテナを起動するときは # systemd-nspawn -bnD /path_to/your_container/ コマンドとオプションを使ってください。ログオフやシャットダウンをするには、コンテナの中で # systemctl poweroff を実行してください。ネットワーク設定が要求を満たすようになったら、systemd-nspawn@.service有効化・起動してください。
  • dhcpcd.service が有効になっている場合は無効にしてください。このサービスは全てのインターフェイスに dhcpcd を使わせます。
  • コンテナで netctl プロファイルや、systemd-networkd.service が有効になっていないことを確認してください。
  • トラフィックをブロックするような iptables ルールが設定されていないことを確認してください。
  • コンテナ上でプライベートネットワークを設定する場合はパケットフォワーディング有効にしてください。
  • 設定ファイルを作った後、networkd デーモンが動作している場合はリロードを行なって下さい: # systemctl restart systemd-networkd
  • デーモンが起動したら systemd の networkctl コマンドでネットワークインターフェイスの状態が表示されます。
ノート: 下で説明している設定について
  • $ ip a コマンドの出力を、関連するインターフェイスにだけ絞っています。
  • ホストは起動しているメインの OS であり、コンテナは仮想マシンのゲストのことです。
  • インターフェイスの名前や IP アドレスは全てあくまでただの例です。

基本的な DHCP ネットワーク

以下はホストとコンテナで DHCP IP を有効にします。この場合、両方のシステムが同じインターフェイスを共有し、同じ IP を共有します。

/etc/systemd/network/MyDhcp.network
[Match]
Name=en*

[Network]
DHCP=ipv4

そして、コンテナで systemd-networkd起動・有効化してください。

もちろん en*$ ip link コマンドの出力でわかる Ethernet デバイスのフルネームに置き換えることは可能です。

  • ホストとコンテナで:
$ ip a
2: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 14:da:e9:b5:7a:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.72/24 brd 192.168.1.255 scope global enp7s0
       valid_lft forever preferred_lft forever
    inet6 fe80::16da:e9ff:feb5:7a88/64 scope link 
       valid_lft forever preferred_lft forever

デフォルトのホストネームは DHCP サーバーから取得され一時的なホストネームとして使用されます。

変更するには [DHCPv4] セクションに UseHostname=false を追加してください:

/etc/systemd/network/MyDhcp.network
[DHCPv4]
UseHostname=false

/etc/resolv.conf で DNS を設定するかわりに DHCP に設定してもらいたい場合、systemd-resolved を有効にして /run/systemd/resolve/resolv.conf から /etc/resolv.conf にシンボリックリンクを作成してください:

# systemctl enable systemd-resolved
# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

詳しくは systemd-resolved.service(8) を参照。

ノート: arch-install-scripts/usr/bin/arch-chroot を使ってシステムパーティションにアクセスする場合、マウントしたパーティションに対して chroot の外からシンボリックリンクを作成する必要があります。arch-chroot はファイルからライブ環境にリンクを作成するためです。

2つの別々な IP で DHCP を使う

ブリッジインターフェイス

仮想ブリッジインターフェイスを作成する:

/etc/systemd/network/MyBridge.netdev
[NetDev]
Name=br0
Kind=bridge

systemd-networkd.service を再起動すると systemd はブリッジを作成します。

  • ホストとコンテナで:
$ ip a
3: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether ae:bd:35:ea:0c:c9 brd ff:ff:ff:ff:ff:ff

インターフェイス br0 が表示されていますが DOWN になっているので注意してください。

イーサネットをブリッジに関連付ける

/etc/systemd/network/MyDhcp.network を編集して DHCP を削除します。ブリッジはどの IP にもバインドされないインターフェイスが必要なので、このデバイスを br0 にバインドするキーを追加してください。名前を適切なものに変更しましょう。

/etc/systemd/network/MyEth.network
[Match]
Name=en*

[Network]
Bridge=br0

ブリッジネットワーク

ブリッジのネットワークプロファイルを作成:

/etc/systemd/network/MyBridge.network
[Match]
Name=br0

[Network]
DHCP=ipv4

コンテナを起動するオプションを追加する

ホストとコンテナに別々の IP を割り当てたいので、ホストからコンテナのネットワークを切断する必要があります。切断するには、コンテナの起動コマンドに --network-bridge=br0 オプションを追加します。

# systemd-nspawn --network-bridge=br0 -bD /path_to/my_container

結果

  • ホスト側
$ ip a
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 14:da:e9:b5:7a:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.87/24 brd 192.168.1.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::16da:e9ff:feb5:7a88/64 scope link 
       valid_lft forever preferred_lft forever
6: vb-MyContainer: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether d2:7c:97:97:37:25 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::d07c:97ff:fe97:3725/64 scope link 
       valid_lft forever preferred_lft forever
  • コンテナ側
$ ip a
2: host0: <BROADCAST,MULTICAST,ALLMULTI,AUTOMEDIA,NOTRAILERS,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 5e:96:85:83:a8:5d brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.73/24 brd 192.168.1.255 scope global host0
       valid_lft forever preferred_lft forever
    inet6 fe80::5c96:85ff:fe83:a85d/64 scope link 
       valid_lft forever preferred_lft forever

注意

  • ホストの br0 と、コンテナの host0 にそれぞれ IP アドレスが割り当てられました。
  • 2つの新しいインターフェイスが作成されます: ホストの vb-MyContainer とコンテナの host0 です。これは --network-bridge=br0 オプションによるものです。このオプションには --network-veth という別のオプションも含まれており、ホストとコンテナの間に仮想イーサネットリンクが作成されます。
  • host0 の DHCP アドレスはシステムの /usr/lib/systemd/network/80-container-host0.network ファイルから由来します。
  • ホスト側
$ brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.14dae9b57a88	no		enp7s0
							vb-MyContainer

上記のコマンドの出力で2つのインターフェイスがバインドされたブリッジが確認できます。

  • ホスト側
$ ip route
default via 192.168.1.254 dev br0 
192.168.1.0/24 dev br0  proto kernel  scope link  src 192.168.1.87
  • コンテナ側
$ ip route
default via 192.168.1.254 dev host0 
192.168.1.0/24 dev host0  proto kernel  scope link  src 192.168.1.73

上記のコマンドの出力で IP アドレスとゲートウェイが 192.168.1.254 の br0host0 インターフェイスが有効になったのが確認できます。ゲートウェイのアドレスは systemd-networkd によって自動的に取得されます。

$ cat /run/systemd/resolve/resolv.conf
nameserver 192.168.1.254

静的 IP アドレスを持つネットワークブリッジ

各デバイスに静的 IP アドレスを設定すると、Web サービス (例:FTP、http、SSH) を展開する場合に便利です。システム /usr/lib/systemd/network/99 default.link ファイルに MACAddressPolicy=persistent オプション (default) が指定されている場合、各デバイスは再起動後も同じMACアドレスを保持します。したがって、ゲートウェイ上の任意のサービスを目的のデバイスに簡単にルーティングできます。

このセットアップでは、次の設定を行う必要があります。

  • on host

この設定は、 基本的な DHCP ネットワーク セクションと非常によく似ています。まず、仮想ブリッジインターフェイスを作成し、メインの物理インターフェイスをそのインターフェイスにバインドする必要があります。この作業は、次の2つのファイルを使用して実行できます。これらのファイルの内容は、 DHCP セクションで使用できるものと同じです。

/etc/systemd/network/MyBridge.netdev
/etc/systemd/network/MyEth.network

次に、新しく作成した仮想ブリッジインターフェイスの IP および DNS を設定する必要があります。例:

/etc/systemd/network/MyBridge.network
[Match]
Name=br0

[Network]
DNS=192.168.1.254
Address=192.168.1.87/24
Gateway=192.168.1.254
  • on container

コンテナに静的 IP アドレスを設定するには、システム /usr/lib/systemd/network/80-container-host 0.network ファイルを上書きする必要があります。このファイルは、コンテナの host0 ネットワークインタフェースに DHCP 構成を提供します。これを行うには、設定を /etc/systemd/network/80-container-host0.network に置きます。例:

/etc/systemd/network/80-container-host0.network
[Match]
Name=host0

[Network]
DNS=192.168.1.254
Address=192.168.1.94/24
Gateway=192.168.1.254

コンテナで systemd-networkd.service有効 であることを確認します。

ヒントとテクニック

管理やデスクトップの統合

systemd-networkd にはコマンドラインや GUI によるインタラクティブな管理インターフェイスがありません。networkctl はネットワークインターフェイスの状態を出力するだけです。

ただし、ネットワークの現在の状態を表示したり、通知を受信したり、ワイヤレス構成を操作したりするためのツールはあります。

  • networkdwpa_supplicant を使うように設定した場合、wpa_cliwpa_gui を使うことで動的に WLAN インターフェイスを関連付けしたり再設定できます。
  • networkd-notify-gitAUR はネットワークインターフェイスの状態の変化にあわせてシンプルな通知を生成します (接続・切断や再関連付けなど)。
  • networkd-dispatcherAUR デーモンを使うことで NetworkManager-dispatcher と同じようにネットワークインターフェイスの状態が変わったときにスクリプトを実行することができます。
  • DNS リゾルバの systemd-resolvedsystemd-resolve --status で現在の DNS サーバーの情報を視覚化できます。

SSID (場所) に基づいた静的 IP または DHCP の設定

ホームワイヤレスネットワークが DHCP を使用し、オフィスワイヤレスネットワークが静的 IP を使用する状況がよくあります。この混在したセットアップは、次のように構成できます。

ノート: ファイル名の番号によって,ファイルの処理順序が決まります。 SSID、 BSSID、 またはその両方に基づいて [Match] できます。
/etc/systemd/network/24-wireless-office.network
# special configuration for office WiFi network
[Match]
Name=wlp2s0
SSID=office_ap_name
#BSSID=aa:bb:cc:dd:ee:ff

[Network]
Address=10.1.10.9/24
Gateway=10.1.10.1
DNS=10.1.10.1
#DNS=8.8.8.8
/etc/systemd/network/25-wireless-dhcp.network
# use DHCP for any other WiFi network
[Match]
Name=wlp2s0

[Network]
DHCP=ipv4

ワイヤード (有線) インターフェイスとワイヤレスインターフェイスのボンディング

ワイヤレスボンディング も参照してください。

ボンディングを使用すると、複数のインターフェイスを介して接続を共有できるため、有線インターフェイスを取り外しても、ワイヤレス接続は維持され、ネットワーク接続はシームレスに維持されます。

結合インタフェースを作成します。この場合、モードは アクティブバックアップ です。つまり、プライマリインターフェイスがダウンした場合、パケットはセカンダリインターフェイスを介してルーティングされます。

/etc/systemd/network/30-bond0.netdev
[NetDev]
Name=bond0
Kind=bond

[Bond]
Mode=active-backup
PrimaryReselectPolicy=always
MIIMonitorSec=1s

有線インターフェイスをプライマリとして設定します。

/etc/systemd/network/30-ethernet-bond0.network
[Match]
Name=enp0s25

[Network]
Bond=bond0
PrimarySlave=true

ワイヤレスをセカンダリとして設定します。

/etc/systemd/network/30-wifi-bond0.network
[Match]
Name=wlan0

[Network]
Bond=bond0

通常のインターフェイスと同様に、bond インターフェイスを設定します。

/etc/systemd/network/30-bond0.network
[Match]
Name=bond0

[Network]
DHCP=ipv4

有線ネットワークが接続されていない場合は、ワイヤレス接続が維持されます。

$ networkctl
IDX LINK    TYPE     OPERATIONAL      SETUP     
  1 lo      loopback carrier          unmanaged 
  2 enp0s25 ether    no-carrier       configured
  3 bond0   bond     degraded-carrier configured
  5 wlan0   wlan     enslaved         configured

4 links listed.

TCP の速度を上げる

遅延が中程度の広帯域リンク (通常、10 Mbit/s を超えるホームインターネット接続) では、TCP スロースタートアルゴリズムのデフォルト設定はやや保守的です。この問題は、ダウンロードがゆっくりと開始され、接続の全帯域幅に到達するまでに加速するのに数秒かかる場合に発生します。特に pacman アップグレードなどで、ダウンロードされた各パッケージがゆっくりと開始し、接続の最大速度に達する前に終了することがよくあります。

これらの設定を調整して、 TCP 接続が既定よりも大きなウィンドウサイズで開始されるようにすることができます。これにより 新しい TCP 接続ごとに自動的に増加する時間を避けることができます [1] これは通常、損失した多数のパケットを再送信する必要があるため、低速な接続ではパフォーマンスを低下させますが (または値が大きくなりすぎた場合) 、十分な帯域幅を持つ接続ではパフォーマンスを大幅に向上させることができます。

これらの値を変更する前と変更した後にベンチマークを実行して、ネットワーク速度を向上させ、低下させないようにすることが重要です。ダウンロードの開始が遅く、速度が徐々に上がっていない場合は、これらの値を変更する必要はありません。これらの値はすでに接続速度に最適です。ベンチマークを行う際には、低速なサーバへのアクセスをさらに低速にすることを犠牲にして高速なマシンへのアクセスを高速化しないように、高速なリモートサーバと低速なリモートサーバの両方に対してテストするようにしてください。

これらの値を調整するには、接続の .network ファイルを編集します。

/etc/systemd/network/eth0.network
[Match]
Name=eth0

#[Network]
#Gateway=...  <-- Remove this if you have it, and put it in the Gateway= line below

[Route]
# This will apply to the gateway supplied via DHCP.  If you manually specify
# your gateway, put it here instead.
Gateway=_dhcp4

# The defaults for these values is 10.  They are a multiple of the MSS (1460 bytes).
InitialCongestionWindow=10
InitialAdvertisedReceiveWindow=10

デフォルトの 10 は、 10Mbit/s より遅い接続に適しています。100 Mbit/s 接続の場合、値 30 位が適切に機能します。マニュアル・ページ systemd.network(5) § [ROUTE] SECTION OPTIONS には、100 の値は過剰と見なされると記載されています。

sysctl 設定 net.ipv4.tcp_slow_start_after_idle が有効になっている場合、しばらくアイドル状態が続くと (多くの場合、ごく短時間) 、接続はこれらの初期設定に戻ります。この設定を無効にすると、パケット転送中に大きいウィンドウがネゴシエートされた場合、接続は大きいウィンドウを維持します。設定に関係なく、新しい各 TCP 接続は上記の Initial* 設定で始まります。

sysctl 設定 net.ipv 4.tcp_congestion_control は、 TCP リンクがアクティブなとき、特に2つのホスト間のパスが輻輳してスループットを低下させる必要があるときに、輻輳ウィンドウと受信ウィンドウを調整する方法を制御するため、これらの値とは直接関係しません。上記の Initial* 値は、輻輳アルゴリズムに引き継がれて必要に応じて調整される前に、新しい接続ごとに選択されたデフォルトのウィンドウ値を設定するだけです。高い初期値を設定すると、輻輳アルゴリズムが最適な値 (または、逆に、間違った初期値を設定するとネゴシエーション時間が長くなりますが、輻輳アルゴリズムはそれらを修正するように動作し、新しく確立された各 TCP 接続の速度が数秒間遅くなります。) を見つけようとしている間に、単純にネゴシエーションが短縮されます。

トラブルシューティング

起動時にマウントサービスが失敗する

ネットワークが立ち上がる前に Samba/NFS などのサービスが実行されると上手く行きません。そのようなときは systemd-networkd-wait-online.service有効化すると良いでしょう。ただし、ネットワークが設定されていない状態でも、ほとんどのネットワークデーモンは問題なく立ち上がるため必要になる状況はあまりありません。

systemd-resolve がローカルドメインを検索してくれない

ホストネームを指定しているとき、たとえ .network ファイルに UseDomains=yesDomains=[domain-list] を設定している場合 (resolv.confsearch [domain-list] が作成されます) でも、Systemd の resolve はローカルドメインを検索しません。この問題を解決するには:

  • /etc/nsswitch.confhosts データベースを切り詰める (例: resolve サービスの後ろの [!UNAVAIL=return] オプションを削除する)。
  • 完全修飾ドメイン名を使うようにする。
  • /etc/hosts を使ってホストネームを解決する。
  • systemd の resolve の代わりに glibc の dns を使うようにする。

参照