systemd-networkd
systemd-networkd はネットワーク設定を管理するシステムデーモンです。ネットワークデバイスが立ち上がるとそれを検出して設定を行います。また、仮想ネットワークデバイスを作成することもできます。このサービスは systemd-nspawn で管理されるコンテナまたは仮想マシンの複雑なネットワークを設定する場合にとても役に立ちます。また、単純な接続でも正常に動作します。
基本的な使い方
systemd パッケージは Arch ではデフォルトでインストールされており、有線ネットワークに接続するために必要なファイルは全て揃っています。後で述べているように、wpa_supplicant や iwd など他のサービスを使うことで無線アダプタを設定することもできます。
必要なサービスと設定
systemd-networkd を使用するには、systemd-networkd.service
起動/有効化します。
また、ネットワーク名前解決サービスである systemd-resolved は,以下の点を考慮して任意に設定して下さい。
- 使用する DNS を適切に設定するためには、resolv.conf と systemd-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) を見て下さい。
systemd/udev は、予測可能で安定したネットワークインターフェイス名をすべてのローカルイーサネット、WLAN、WWAN インターフェイスに自動で割り当てます。システム上にあるデバイスのリストを得るには networkctl list
を使用してください。
設定ファイルに変更を加えたら、systemd-networkd.service
を再起動してください。
有線アダプタで DHCP を使用
/etc/systemd/network/20-wired.network
[Match] Name=enp1s0 [Network] DHCP=yes
有線アダプタで固定 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
Address=
は1回以上使用することができ、複数の IPv4 や IPv6 アドレスを指定することができます。さらなるオプションについては #network ファイル や systemd.network(5) を見てください。
無線アダプタ
systemd-networkd で無線ネットワークに接続するには、wpa_supplicant や iwd などの別のアプリケーションで設定された無線アダプタが必要です。
/etc/systemd/network/25-wireless.network
[Match] Name=wlp2s0 [Network] DHCP=yes IgnoreCarrierLoss=3s
無線アダプタで固定 IP アドレスを使っている場合、設定は (インターフェイス名を除いて) 有線アダプタと同じになります。
無線スネットワークへの認証には、wpa_supplicant や iwd などを使用します。
同一マシンで有線アダプタと無線アダプタ両方を使用
以下の設定では、metric ディレクティブを使用して、有線と無線両方の接続で DHCP IP を有効にしており、カーネルがその場でどちらを使うか決定します。有線接続が切断されると、即座に無線に切り替わります。接続が途切れることはありません。
システム上の無線・有線どちらのデバイスも有効な接続がある場合、カーネルのルーティングのメトリック(ip で設定するのと同一) が、パケットを送るのにどちらのルートを使用するか決定します。システム上の有線デバイスと無線デバイスの両方がアクティブな接続を行っている場合がそうです。均衡状態を破るために、カーネルはメトリックを使います。もし一方の接続が終了しても、何も設定せずとも、もう一方が自動的にギャップを埋めます(進行中の転送はまだうまく対処されないでしょうが、これは他の OSI レイヤーでの問題です)。
systemd-networkd はインターフェイスごとのデフォルトルートメトリクスを設定しないので、手動で設定する必要があります:
/etc/systemd/network/20-wired.network
[Match] Name=enp1s0 [Network] DHCP=yes [DHCPv4] RouteMetric=100 [IPv6AcceptRA] RouteMetric=100
/etc/systemd/network/25-wireless.network
[Match] Name=wlp2s0 [Network] DHCP=yes [DHCPv4] RouteMetric=600 [IPv6AcceptRA] RouteMetric=600
インターフェイスの名前を変更
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
設定ファイル
設定ファイルは /usr/lib/systemd/network/
から、そして一時的な実行時のネットワークディレクトリ /run/systemd/network/
とローカルのネットワーク管理ディレクトリ /etc/systemd/network/
から読み込まれます。/etc/systemd/network/
内のファイルが一番優先されます。
3つのタイプの設定ファイルが存在します。ファイルのフォーマットは systemd のユニットファイルと似ています。
- .network ファイル。マッチするデバイスにネットワーク設定を適用します。
- .netdev ファイル。マッチする環境に仮想ネットワークデバイスを作成します。
- .link ファイル。ネットワークデバイスが作られた時、udev は最初にマッチする .link ファイルを探します。
これらの設定ファイルは同じルールに従っています:
[Match]
セクションの全ての条件がマッチすれば、プロファイルが有効になります。- 空の
[Match]
セクションはどんな場合でもそのセクションを適用することを示します (いわば*
ワイルドカードのようなものです)。 - 全ての設定ファイルは辞書順でまとめてソートされ処理されます。ファイルがどのディレクトリにあるかは関係ありません。
- 同じ名前のファイルは互いを置き換えます。
network ファイル
このファイルはネットワーク設定の変数の設定、特にサーバーとコンテナの設定のために存在します。
.network ファイルには次のセクションを記述できます: [Match]
、[Link]
、[Network]
、[Address]
、[Route]
、[DHCPv4]
。以下ではそれぞれのセクションでよく使われる設定キーを説明します。詳細や例は systemd.network(5) を見てください。
[Match]
パラメータ | 説明 | 受け入れる値 | デフォルト値 |
---|---|---|---|
Name= |
デバイス名のリストにマッチ(例: en* )。プレフィックス ! を付けると、リストを反転できます。 |
空白で区切られた、グロブ付きデバイス名リスト。論理否定 (! ) |
|
MACAddress= |
MAC アドレスのリストにマッチ(例: MACAddress=01:23:45:67:89:ab 00-11-22-33-44-55 AABB.CCDD.EEFF ) |
コロン、ハイフン、またはドットで区切られた完全な 16 進数による、空白で区切られた MAC アドレスリスト | |
Host= |
ホスト名、またはホストのマシン IDにマッチ。 | グロブ付きのホスト名文字列、machine-id(5) | |
Virtualization= |
システムが仮想化環境で起動されているかどうかをチェックします。Virtualization=false キーはホストマシンにのみマッチし、逆に Virtualization=true はコンテナや VM にマッチします。特定の仮想化タイプや実装をチェックしたり、(private-users を使って)ユーザ名前空間をチェックしたりできます。 |
真偽値、論理否定(! )、タイプ(vm , container )、実装(systemd-detect-virt(1) を参照)、private-users |
[Link]
パラメータ | 説明 | 受け入れる値 | デフォルト値 |
---|---|---|---|
MACAddress= |
ハードウェアアドレスをデバイスに割り当てる。MAC アドレスの偽装に便利。 | コロン、ハイフン、ドットで区切られた、完全な 16 進数 MAC アドレス。 | |
MTUBytes= |
デバイスに対して最大転送単位をバイト単位で指定。IPv6 がインターフェイスで有効化されていて、MTU が 1280 (IPv6 における最低 MTU) 未満に指定されている場合、自動的に 1280 まで増やされます。より大きな MTU 値を設定することで(例: ジャンボフレーム 使用時)、ネットワーク転送速度を飛躍的に速くできます。 | 整数 (通常の接尾辞 K、M、G がサポートされており、1024 の倍数として認識されます) | |
Multicast= |
マルチキャスト の使用を許可。 | 真偽値 | ? ドキュメント化されておらず ? |
[Network]
パラメータ | 説明 | 受け入れる値 | デフォルト値 |
---|---|---|---|
DHCP= |
DHCPv4 と DHCPv6 の一方/両方のサポートを制御。 | 真偽値、ipv4 、ipv6 |
false
|
DHCPServer= |
有効化されている場合、DHCPv4 サーバが起動されます。 | 真偽値 | false
|
MulticastDNS= |
マルチキャスト DNS のサポートを有効化。resolve に設定すると、名前解決のみが有効化され、ホストやサービスの登録と広告は行われません。 |
真偽値、resolve |
false
|
DNSSEC= |
リンク上での DNSSEC DNS validation のサポートを制御。allow-downgrade に設定すると、DNSSEC 非対応のネットワークとの互換性が向上します。この場合、DNSSEC は自動でオフになります。 |
真偽値、allow-downgrade |
false
|
DNS= |
固定 DNS アドレスを設定。1回以上指定できます。 | inet_pton(3) | |
Domains= |
リンク上の DNS サーバを利用して解決すべきドメインのリスト。詳細 | ドメイン名、オプションでチルダ(~ )のプレフィックス。 |
|
IPForward= |
有効化すると、ネットワークインターフェイス上で受信したパケットを、ルーティングテーブルに従って他のインターフェイスに転送します。詳細は インターネット共有#パケット転送の有効化。 | 真偽値、ipv4 、ipv6 |
false
|
IPMasquerade= |
有効化すると、ネットワークインターフェイスからのパケット転送がローカルホストから来るように見えます。値によっては、IPForward=ipv4 、IPForward=ipv6 、または IPForward=yes の意味になります。 |
ipv4 、ipv6 、both 、no |
no
|
IPv6PrivacyExtensions= |
時間と共に変化するステートレステンポラリアドレスの使用を設定します(RFC 4941 を参照)。prefer-public を指定すると、プライバシー拡張が有効に名ありますが、テンポラリアドレスよりもパブリックアドレスを優先します。kernel を指定すると、カーネルのデフォルトの設定のままになります。 |
真偽値、prefer-public 、kernel |
false
|
[Address]
パラメータ | 説明 | 受け入れる値 | デフォルト値 |
---|---|---|---|
Address= |
複数のアドレスを設定するには、このキーを複数回指定してください。DHCP を使用しない限り必須です。指定されたアドレスが(IPv4の 場合) 0.0.0.0 または (IPv6 の場合) :: である場合、要求されたサイズの新しいアドレス範囲が、システム全体の未使用範囲のプールから自動的に割り当てられます。 |
固定 IPv4 または IPv6 アドレスとプレフィックス長(inet_pton(3) を参照) |
[Route]
Gateway=
DHCP を使用しない場合、このオプションは必須です。Destination=
ルートの宛先プリフィックスです。スラッシュとプリフィックス長を後ろに付けることができます。
[Route]
セクションに Destination
が存在しない場合、デフォルトルートとして扱われます。
[DHCPv4]
パラメータ | 説明 | 受け入れる値 | デフォルト値 |
---|---|---|---|
UseDNS= |
DHCP サーバにより広告された DNS サーバを使用するかどうかを制御。 | 真偽値 | true
|
Anonymize= |
true を指定すると、DHCP サーバに送られるオプションが RFC:7844 (Anonymity Profiles for DHCP Clients) に従って、識別情報の開示を最小限にするようになります。 | 真偽値 | false
|
UseDomains= |
DHCP サーバから受け取るドメイン名を DNS 検索ドメインとして使用するかどうかを制御。route に設定すると、DHCP サーバから受け取るドメイン名が DNS クエリにのみ使用され、検索には使用されなくなります。このオプションは、systemd-resolved を使用している際にはローカルな名前解決を修正する可能性があります。 |
真偽値、route |
false
|
[DHCPServer]
これは、無線ホットスポットを作成するために hostapd とうまく連動する DHCP サーバーの設定例です。IPMasquerade
は NATを有効にする ためのファイアウォールルールを追加し、IPForward=ipv4
パケット転送 を有効にしています。
/etc/systemd/network/wlan0.network
[Match] Name=wlan0 [Network] Address=10.1.1.1/24 DHCPServer=true IPMasquerade=ipv4 [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=
インターフェイス名。必須Kind=
例: bridge, bond, vlan, veth, sit。必須
コンテナでの使用方法
systemd-networkd は、コンテナ内とホストシステムの両方で使用されている場合、systemd-nspawn コンテナに対するネットワークの完全自動設定を提供できます。総合的な外観は systemd-nspawn#ネットワーキング を見てください。
下で説明している設定について、
$ ip a
コマンドの出力を、関連するインターフェイスにだけ絞っています。- ホストは起動しているメインの OS であり、コンテナは仮想マシンのゲストのことです。
- インターフェイスの名前や IP アドレスは全てあくまでただの例です。
DHCP を用いたネットワークブリッジ
ブリッジインターフェイス
まず、仮想ブリッジインターフェイスを作成してください。systemd に、イーサネットブリッジとして機能する、br0 という名前のデバイスを作成するように指示します。
/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 になっていることに注意してください。
イーサネットをブリッジに関連付ける
次のステップでは、新しく作成したブリッジにネットワークインターフェイスを追加します。以下の例では、en* という名前にマッチする任意のインターフェイスをブリッジ br0 に追加します。
/etc/systemd/network/bind.network
[Match] Name=en* [Network] Bridge=br0
ブリッジが IP と関連付けられていないインターフェイスを必要とするので、イーサネットインターフェイスは DHCP や IP アドレスと関連付けてはいけません: 対応する /etc/systemd/network/MyEth.network
を適宜変更して、アドレッシングを削除してください。
ブリッジネットワーク
ブリッジが作成され、既存のネットワークインターフェイスに関連付けられました。ブリッジインターフェイスの IP 設定を指定する必要があります。これは3番目の .network で定義されます。以下の例では DHCP を使用します。
/etc/systemd/network/mybridge.network
[Match] Name=br0 [Network] DHCP=ipv4
コンテナの設定
コンテナを起動する際は --network-bridge=br0
オプションを使用してください。詳細は systemd-nspawn#ネットワークブリッジを使用する を見てください。
結果
- ホスト側
$ 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
オプションによるものです。詳細は systemd-nspawn#ネットワークブリッジを使用する を参照してください。 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 の br0
と host0
インターフェイスが有効になったのが確認できます。ゲートウェイのアドレスは 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
オプションが指定されている場合(デフォルトで指定されています)、各デバイスは再起動後も同じMACアドレスを保持します。したがって、ゲートウェイ上の任意のサービスを目的のデバイスに簡単にルーティングできます。
このセットアップでは、次の設定を行う必要があります。
- ホスト側
この設定は、#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
- コンテナ側
コンテナに静的 IP アドレスを設定するには、システム /usr/lib/systemd/network/80-container-host0.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
が有効化されていることを確認してください。
MACVLAN bridge
For the host to be able to reach containers connected via MACVLAN, the host itself also needs to connect via MACVLAN and not directly to the underlying Ethernet network interface.
On the host, attach the underlying Ethernet network interface to MACVLAN and make sure it does not get assigned IP addresses. For example, using mv-0
as the MACVLAN interface name and with enp1s0
as the host's Ethernet interface:
/etc/systemd/network/30-enp1s0.network
[Match] Name=enp1s0 [Link] RequiredForOnline=carrier [Network] MACVLAN=mv-0 DHCP=no IPv6AcceptRA=false LinkLocalAddressing=no MulticastDNS=false LLMNR=false
Create the MACVLAN bridge mv-0
:
/etc/systemd/network/25-mv-0.netdev
[NetDev] Name=mv-0 Kind=macvlan [MACVLAN] Mode=bridge
Configure the host's network connection on the MACVLAN bridge (mv-0
). The following example uses DHCP, replace the options as necessary.
/etc/systemd/network/35-mv-0.network
[Match] Name=mv-0 [Link] RequiredForOnline=routable [Network] BindCarrier=enp1s0 DHCP=yes
For the container, attach a MACVLAN to the underlying Ethernet network interface (enp1s0
in the examples above). For example, in /etc/systemd/nspawn/container_name.nspawn
specify:
[Network] MACVLAN=enp1s0
For containers started from the command line, pass them the --network-macvlanテンプレート:=enp1s0
option.
In the container, the MACVLAN interface will have the name mv-underlying_interface_name
(e.g. mv-enp1s0
). Configure the network connection as necessary (just like in the host) by matching the interface name. For example, using DHCP:
/etc/systemd/network/30-mv-enp1s0.network
[Match] Name=mv-enp1s0 [Link] RequiredForOnline=routable [Network] DHCP=yes
ヒントとテクニック
管理やデスクトップの統合
systemd-networkd にはコマンドラインシェルや GUI による適切なインタラクティブ管理インターフェイスがありません。
ただし、ネットワークの現在の状態を表示したり、通知を受信したり、ワイヤレス構成を操作したりするためのツールはあります:
- networkctl は(CLI を通して)ネットワークインターフェイスの状態の簡単な表示を行います。
- networkd で wpa_supplicant を使うように設定した場合、wpa_cli や wpa_gui を使うことで動的に WLAN インターフェイスを関連付けしたり再設定できます。
- networkd-notify-gitAUR はネットワークインターフェイスの状態の変化にあわせてシンプルな通知を生成します (接続・切断や再関連付けなど)。
- networkd-dispatcherAUR デーモンを使うことで NetworkManager-dispatcher と同じようにネットワークインターフェイスの状態が変わったときにスクリプトを実行することができます。
- DNS リゾルバの systemd-resolved は
resolvectl status
で現在の DNS サーバーの情報を視覚化できます。
SSID (場所) に基づいた静的 IP または DHCP の設定
ホームワイヤレスネットワークが DHCP を使用し、オフィスワイヤレスネットワークが静的 IP を使用する状況がよくあります。この混在したセットアップは、次のように構成できます:
/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
ワイヤード (有線) インターフェイスとワイヤレスインターフェイスのボンディング
ワイヤレスボンディング も参照してください。
ボンディングを使用すると、複数のインターフェイスを介して接続を共有できるため、有線インターフェイスを取り外しても、ワイヤレス接続は維持され、ネットワーク接続はシームレスに維持されます。
結合インタフェースを作成します。この場合、モードは active-backup です。つまり、プライマリインターフェイスがダウンした場合、パケットはセカンダリインターフェイスを介してルーティングされます。
/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.ipv4.tcp_congestion_control
は、 TCP リンクがアクティブなとき、特に2つのホスト間のパスが輻輳してスループットを低下させる必要があるときに、輻輳ウィンドウと受信ウィンドウを調整する方法を制御するため、これらの値とは直接関係しません。上記の Initial*
値は、輻輳アルゴリズムに引き継がれて必要に応じて調整される前に、新しい接続ごとに選択されたデフォルトのウィンドウ値を設定するだけです。高い初期値を設定すると、輻輳アルゴリズムが最適な値 (または、逆に、間違った初期値を設定するとネゴシエーション時間が長くなりますが、輻輳アルゴリズムはそれらを修正するように動作し、新しく確立された各 TCP 接続の速度が数秒間遅くなります。) を見つけようとしている間に、単純にネゴシエーションが短縮されます。
参照
- systemd-networkd(8)
- Tom Gundersen posts on Core OS blog
- How to set up systemd-networkd with wpa_supplicant (WonderWoofy's walkthrough on Arch forums)