「Systemd-networkd」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (→[DHCP]: ==== [DHCPServer] ==== を追加) |
Kusanaginoturugi (トーク | 投稿記録) (→無線アダプタ: 記事を差し替え) |
||
91行目: | 91行目: | ||
==== 無線アダプタ ==== |
==== 無線アダプタ ==== |
||
+ | |||
− | 先に触れた通り、''systemd-networkd'' で無線ネットワークに接続するには、[[wpa_supplicant]] など別のサービスで無線アダプタを設定してから適当なサービスを有効にしてください。以下の例では、{{ic|wpa_supplicant@wlp2s0.service}} としています。以下のサービスは {{ic|/etc/wpa_supplicant/wpa_supplicant-wlp2s0.conf}} 設定ファイルを使って ''wpa_supplicant'' を起動します。ファイルが存在しなかった場合、サービスは起動しません。 |
||
+ | In order to connect to a wireless network with ''systemd-networkd'', a wireless adapter configured with another application such as [[wpa_supplicant]] or [[iwd]] is required. |
||
{{hc|/etc/systemd/network/25-wireless.network|<nowiki> |
{{hc|/etc/systemd/network/25-wireless.network|<nowiki> |
||
102行目: | 103行目: | ||
無線アダプタで固定 IP アドレスを使っている場合、設定は (インターフェイス名を除いて) [[#有線アダプタで固定 IP を使用|有線アダプタ]]と同じになります。 |
無線アダプタで固定 IP アドレスを使っている場合、設定は (インターフェイス名を除いて) [[#有線アダプタで固定 IP を使用|有線アダプタ]]と同じになります。 |
||
+ | |||
+ | To authenticate to the wireless network, use e.g. [[wpa_supplicant]] or [[iwd]]. |
||
==== 同一マシンで有線アダプタと無線アダプタ両方を使用 ==== |
==== 同一マシンで有線アダプタと無線アダプタ両方を使用 ==== |
2021年10月1日 (金) 13:39時点における版
systemd-networkd はネットワーク設定を管理するシステムデーモンです。ネットワークデバイスが立ち上がるとそれを検出して設定を行い、仮想ネットワークデバイスを作成することもできます。このサービスは netctl などの通常のネットワーク管理ツールと一緒に動かすことが可能で、仮想化する場合、設定によってはツールを置き換えることもできます。特に systemd-nspawn で管理するコンテナのための基本的な、もしくは複雑なネットワーク設定 (固定 IP、ブリッジ、vlan など) を設定する場合にこのサービスはとても役に立ちます。
基本的な使い方
systemd パッケージは Arch ではデフォルトでインストールされており、有線ネットワークに接続するために必要なファイルは全て揃っています。後で述べているように、wpa_supplicant や iwd など他のサービスを使うことで無線アダプタを設定することもできます。
必要なサービスと設定
systemd-networkd を使用するには、以下の2つのサービスを起動して、システムのブート時に実行されるように有効化する必要があります:
systemd-networkd.service
systemd-resolved.service
resolv.conf の互換性のために、既存のファイルを削除または名前変更して以下のシンボリックリンクを作成してください (systemd-resolved を使用する場合):
# ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
さらに、systemd-resolved のローカル DNS スタブリゾルバ (インターフェイスごとに LLMNR や DNS マージングが使われます) を使うために、/etc/nsswitch.conf
の dns
を resolve
に置き換えます:
hosts: files resolve myhostname
systemd-resolved(8) や resolved.conf(5)、または Systemd README を参照してください。
system-networkd-wait-online
systemd-networkd.service
を有効にすると、 systemd-networkd-wait-online.service
も有効になります。これは、ネットワークが構成されるのを待つワンショット・システム・サービスです。後者は WantedBy=network-online.target
を持っているので、 network-online.target
自身が有効になっているか、他のユニットに引き寄せられた時にのみ起動します。 Running services after the network is up も参照してください。
デフォルトでは、 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
有線アダプタで 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 ページを見て下さい。
無線アダプタ
In order to connect to a wireless network with systemd-networkd, a wireless adapter configured with another application such as wpa_supplicant or iwd is required.
/etc/systemd/network/25-wireless.network
[Match] Name=wlp2s0 [Network] DHCP=ipv4
無線アダプタで固定 IP アドレスを使っている場合、設定は (インターフェイス名を除いて) 有線アダプタと同じになります。
To authenticate to the wireless network, use e.g. wpa_supplicant or iwd.
同一マシンで有線アダプタと無線アダプタ両方を使用
以下の設定では、Metric ディレクティブを使用して、有線と無線両方の接続で DHCP IP を有効にしており、カーネルがオンザフライでどちらを使うか決定します。有線接続が切断されると、即座に無線に切り替わります。接続が途切れることはありません。
システム上の無線・有線どちらのデバイスも有効な接続がある場合、カーネルのルートメトリック (ip で設定するのと同一) がパケットを送るのにどちらのルートを使用するか決定します。均衡状態を破るために、カーネルはメトリックを使います。メトリックの良い所は、どちらかが使えなくなったときに、自動的にもう片方が有効になることです。
/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
インターフェイスの名前を変更
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]
, [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
が存在しない場合、デフォルトルートとして扱われます。
[DHCP]
UseDomains=true
systemd-resolved を使用する場合にローカル名の解決を修正します。
[DHCPServer]
This is an example of a DHCP server configuration which works well with hostapd to create a wireless hotspot. IPMasquerade
adds the firewall rules for NAT and implies IPForward=ipv4
to enable packet forwarding.
/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) を参照してください。
[Match]
MACAddress=
MAC アドレスHost=
ホストネームVirtualization=
Type=
デバイスのタイプ (例: vlan)
[Link]
MACAddressPolicy=
は永続的な MAC アドレスをハードウェアに設定する persistent (ほとんどのハードウェアはこちらにするべきです) またはデバイスが現れた時にランダムな MAC アドレスを与える random を指定します。MACAddress=
特定のアドレス。
コンテナでの使用方法
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) を見て下さい。
基本的な 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) を参照。
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 の 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
オプション (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 はネットワークインターフェイスの状態を出力するだけです。
ただし、ネットワークの現在の状態を表示したり、通知を受信したり、ワイヤレス構成を操作したりするためのツールはあります。
- networkd で wpa_supplicant を使うように設定した場合、wpa_cli や wpa_gui を使うことで動的に WLAN インターフェイスを関連付けしたり再設定できます。
- networkd-notify-gitAUR はネットワークインターフェイスの状態の変化にあわせてシンプルな通知を生成します (接続・切断や再関連付けなど)。
- networkd-dispatcherAUR デーモンを使うことで NetworkManager-dispatcher と同じようにネットワークインターフェイスの状態が変わったときにスクリプトを実行することができます。
- DNS リゾルバの systemd-resolved は
systemd-resolve --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
ワイヤード (有線) インターフェイスとワイヤレスインターフェイスのボンディング
ワイヤレスボンディング も参照してください。
ボンディングを使用すると、複数のインターフェイスを介して接続を共有できるため、有線インターフェイスを取り外しても、ワイヤレス接続は維持され、ネットワーク接続はシームレスに維持されます。
結合インタフェースを作成します。この場合、モードは アクティブバックアップ です。つまり、プライマリインターフェイスがダウンした場合、パケットはセカンダリインターフェイスを介してルーティングされます。
/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=yes
や Domains=[domain-list]
を設定している場合 (resolv.conf
に search [domain-list]
が作成されます) でも、Systemd の resolve
はローカルドメインを検索しません。この問題を解決するには:
/etc/nsswitch.conf
のhosts
データベースを切り詰める (例:resolve
サービスの後ろの[!UNAVAIL=return]
オプションを削除する)。- 完全修飾ドメイン名を使うようにする。
/etc/hosts
を使ってホストネームを解決する。- systemd の
resolve
の代わりに glibc のdns
を使うようにする。
参照
- systemd.networkd man ページ
- systemd-networkd のメイン開発者、Tom Gundersen の G+ ホームページ
- Core OS のブログにおける Tom Gundersen の投稿
- systemd-networkd と wpa_supplicant をセットアップする方法 (WonderWoofy's walkthrough on Arch forums)