Ubuntu 20.04.3 Serverでリンク速度の固定をしようと思ったのだが、公式に類するドキュメントが発見できなかった。
手動でやる場合は ethtoolコマンド、というのは分かるのだが、起動時に自動設定する方法が分からない。
Desktop版の設定
Ubuntu 20.04 DesktopではNetworkManagerがネットワークの設定を担当しており、 /etc/NetworkManager ディレクトリ内に関連する設定ファイルがあった。
具体的には /etc/NetworkManager/system-connections/接続名.nmconnection というファイルが作成されていた。
そのファイル内の[ethernet]セクションに下記の記載をすることで設定された。
[ethernet]
mac-address-blacklist=
speed=100
duplex=full
Server版の場合
Ubuntu 20.04 Server版では systemd-networkd と netplanがネットワーク設定を担当している。
IPアドレス設定については netplan側で行い、 /etc/netplan/99_config.yaml などで設定する。
リンク速度固定についてはsystemd側で設定を行うようだった。
今回直接のヒントになった情報はこちら:Set network interface speed with systemd-networkd
上記サイトでは /etc/systemd/networkd/internet.link というファイルを作って設定している。
実際には拡張子「.link」が重要となっていて、NICの初期認識の時に読み込むファイル群ということになっている。
私の場合は /etc/systemd/network/99-default.link というファイル名で作成した。
複数のNICがあり、それぞれで異なる設定を行いたい場合は /etc/systemd/network/99-nic1.link と /etc/systemd/network/99-nic2.link とMatch条件ごとにファイルを分けて設定する形になる。
ドキュメント: systemd.link
[Match]セクションで条件に該当するデバイスを定義し、[Link]セクションで値を設定する、という作りになっている。
たとえばドライバ e1000e のNIC全てに同じ設定を入れる場合は下記の様になる。
[Match]
Driver=e1000e
[Link]
AutoNegotiation=no
BitsPerSecond=100M
Duplex=full
特定のMACアドレスに対してのみ適用したい場合は下記の様になる。
[Match]
PermanentMACAddress=00:0c:29:9c:7e:14
[Link]
AutoNegotiation=no
BitsPerSecond=1G
Duplex=half
なお、「MACAddress=~」で設定もできるが、Linuxでは物理的なMACアドレスに対して上書きで別途MACAddress値を設定してしまうことができる。
特にbonding設定時は必ずMACAddress値が変わってしまうため、物理的なデバイスについているPermanentMACAddressの値を使う必要がある。
bondingデバイス設定時などは「ip a s」で確認できるMACアドレスではなく、dmesgなどに登場する起動直後に認識しているMACアドレスを使う必要がある。
root@ubuntu:~# dmesg|grep eth
[ 1.718483] e1000e 0000:03:00.0 eth0: (PCI Express:2.5GT/s:Width x1) 00:0c:29:9c:7e:0a
[ 1.718709] e1000e 0000:03:00.0 eth0: Intel(R) PRO/1000 Network Connection
[ 1.718927] e1000e 0000:03:00.0 eth0: MAC: 3, PHY: 8, PBA No: 000000-000
[ 1.825725] e1000e 0000:0b:00.0 eth1: (PCI Express:2.5GT/s:Width x1) 00:0c:29:9c:7e:14
[ 1.826001] e1000e 0000:0b:00.0 eth1: Intel(R) PRO/1000 Network Connection
[ 1.826314] e1000e 0000:0b:00.0 eth1: MAC: 3, PHY: 8, PBA No: 000000-000
[ 1.829127] e1000e 0000:03:00.0 ens160: renamed from eth0
[ 1.843927] e1000e 0000:0b:00.0 ens192: renamed from eth1
root@ubuntu:~#
複数のMACアドレスを指定する場合は下記の様にスペースを空けて列挙する。
[Match]
PermanentMACAddress=00:0c:29:9c:7e:14 00:0c:29:9c:7e:0a
[Link]
AutoNegotiation=no
BitsPerSecond=100M
Duplex=full
NICのデバイス名 ens192などを指定できないかチャレンジしたのですが、「Name=」や「OriginalName=」を使用してみましたが動作しませんでした。
設定値の反映については、確認した限りではauto negotiationのon/off切り替えについては、再起動が必要でした。
auto-negotiation offになった後の、リンク速度変更については、設定記載後に「udevadm test-builtin net_setup_link /sys/class/net/デバイス名」を実行することで反映されました。
root@ubuntu:~# udevadm test-builtin net_setup_link /sys/class/net/ens160
Load module index
Parsed configuration file /etc/systemd/network/99-default.link
Parsed configuration file /usr/lib/systemd/network/73-usb-net-by-mac.link
Created link configuration context.
ID_NET_DRIVER=e1000e
ens160: Failed to get ACTION= property: No such file or directory
Using default interface naming scheme 'v245'.
ID_NET_LINK_FILE=/etc/systemd/network/99-default.link
Unload module index
Unloaded link configuration context.
root@ubuntu:~#
リンク速度が変わったことが確認できます。
root@ubuntu:~# dmesg|grep ens160
[ 5510.551597] e1000e: ens160 NIC Link is Up 100 Mbps Full Duplex, Flow Control: None
[ 5510.551771] e1000e 0000:03:00.0 ens160: 10/100 speed: disabling TSO
root@ubuntu:~#
失敗編
/etc/networkd-dispatcher/routable.d にスクリプトを配置して、 ethtoolを実行してTSO offさせる、的な記述を発見。(How to execute post-up scripts with netplan)
/etc/networkd-dispatcher/routable.d/990-speed を作成し下記の内容を書いてみたところ、なぜか1秒間隔でスクリプトが実行され続けてしまった・・・なぜ?
#!/bin/bash
/usr/sbin/ethtool -s ens192 autoneg off speed 100 duplex full
exit 0
失敗ではないものの、実は一番最初に見つけた「How to permanently disable TSO & GSO in Ubuntu 18.04」で/etc/systemd/network/01-tso-and-gso.link ファイルを作って下記を記述
[Match]
# Set a match condition appropriate for your use case
Name=*
[Link]
TCPSegmentationOffload=false
GenericSegmentationOffload=false
と書かれていたのがもっとも正解に近かったという・・・