Ubuntu 20.04 でリンク速度固定をする


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 というファイルを作って設定している。(Ubuntu 20.04 だと /etc/systemd/networkd/ というディレクトリは無く /etc/systemd/network/ )

実際には拡張子「.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

と書かれていたのがもっとも正解に近かったという・・・


2021/12/24 追記

udevadmの詳細表示は下記の様に実行する

osakanataro@ubuntu:~$ sudo SYSTEMD_LOG_LEVEL=debug udevadm test-builtin net_setup_link /sys/class/net/ens160
Trying to open "/etc/systemd/hwdb/hwdb.bin"...
Trying to open "/etc/udev/hwdb.bin"...
Trying to open "/usr/lib/systemd/hwdb/hwdb.bin"...
Trying to open "/lib/systemd/hwdb/hwdb.bin"...
Trying to open "/lib/udev/hwdb.bin"...
=== trie on-disk ===
tool version:          245
file size:         9953660 bytes
header size             80 bytes
strings            2163852 bytes
nodes              7789728 bytes
Load module index
Found container virtualization none.
timestamp of '/etc/systemd/network' changed
timestamp of '/run/systemd/network' changed
Parsed configuration file /usr/lib/systemd/network/99-default.link
Parsed configuration file /etc/systemd/network/98-ens34.link
Parsed configuration file /etc/systemd/network/98-ens224.link
Parsed configuration file /usr/lib/systemd/network/73-usb-net-by-mac.link
Created link configuration context.
ID_NET_DRIVER=vmxnet3
ens160: Config file /usr/lib/systemd/network/99-default.link is applied
ens160: Failed to get ACTION= property: No such file or directory
ethtool: autonegotiation is unset or enabled, the speed and duplex are not writable.
ens160: Device has name_assign_type=4
Using default interface naming scheme 'v245'.
ens160: Policy *keep*: keeping existing userspace name
ens160: Device has addr_assign_type=0
ens160: MAC on the device already matches policy *persistent*
Could not set AlternativeName= or apply AlternativeNamesPolicy= on ens160, ignoring: Operation not supported
ID_NET_LINK_FILE=/usr/lib/systemd/network/99-default.link
Unload module index
Unloaded link configuration context.
osakanataro@ubuntu:~$

NICデバイス名の算出に関しては下記

osakanataro@ubuntu:~$ sudo SYSTEMD_LOG_LEVEL=debug udevadm test-builtin net_id /sys/class/net/ens160
Trying to open "/etc/systemd/hwdb/hwdb.bin"...
Trying to open "/etc/udev/hwdb.bin"...
Trying to open "/usr/lib/systemd/hwdb/hwdb.bin"...
Trying to open "/lib/systemd/hwdb/hwdb.bin"...
Trying to open "/lib/udev/hwdb.bin"...
=== trie on-disk ===
tool version:          245
file size:         9953660 bytes
header size             80 bytes
strings            2163852 bytes
nodes              7789728 bytes
Load module index
Found container virtualization none.
timestamp of '/etc/systemd/network' changed
timestamp of '/run/systemd/network' changed
Parsed configuration file /usr/lib/systemd/network/99-default.link
Parsed configuration file /etc/systemd/network/98-ens34.link
Parsed configuration file /etc/systemd/network/98-ens224.link
Parsed configuration file /usr/lib/systemd/network/73-usb-net-by-mac.link
Created link configuration context.
Using default interface naming scheme 'v245'.
ID_NET_NAMING_SCHEME=v245
ID_NET_NAME_MAC=enx00505699e0a1
ID_OUI_FROM_DATABASE=VMware, Inc.
ID_NET_NAME_PATH=enp3s0
ID_NET_NAME_SLOT=ens160
Unload module index
Unloaded link configuration context.
osakanataro@ubuntu:~$

ちなみに ens34については100Mb固定設定を行っていて、下記の様な出力となる。

osakanataro@ubuntu:~$ sudo SYSTEMD_LOG_LEVEL=debug udevadm test-builtin net_setup_link /sys/class/net/ens34
Trying to open "/etc/systemd/hwdb/hwdb.bin"...
Trying to open "/etc/udev/hwdb.bin"...
Trying to open "/usr/lib/systemd/hwdb/hwdb.bin"...
Trying to open "/lib/systemd/hwdb/hwdb.bin"...
Trying to open "/lib/udev/hwdb.bin"...
=== trie on-disk ===
tool version:          245
file size:         9953660 bytes
header size             80 bytes
strings            2163852 bytes
nodes              7789728 bytes
Load module index
Found container virtualization none.
timestamp of '/etc/systemd/network' changed
timestamp of '/run/systemd/network' changed
Parsed configuration file /usr/lib/systemd/network/99-default.link
Parsed configuration file /etc/systemd/network/98-ens34.link
Parsed configuration file /etc/systemd/network/98-ens224.link
Parsed configuration file /usr/lib/systemd/network/73-usb-net-by-mac.link
Created link configuration context.
ID_NET_DRIVER=e1000
ens34: Config file /etc/systemd/network/98-ens34.link is applied
ens34: Failed to get ACTION= property: No such file or directory
ens34: Device has name_assign_type=4
Using default interface naming scheme 'v245'.
ens34: Policies didn't yield a name and Name= is not given, not renaming.
ID_NET_LINK_FILE=/etc/systemd/network/98-ens34.link
Unload module index
Unloaded link configuration context.
osakanataro@ubuntu:~$ sudo SYSTEMD_LOG_LEVEL=debug udevadm test-builtin net_id /sys/class/net/ens34
Trying to open "/etc/systemd/hwdb/hwdb.bin"...
Trying to open "/etc/udev/hwdb.bin"...
Trying to open "/usr/lib/systemd/hwdb/hwdb.bin"...
Trying to open "/lib/systemd/hwdb/hwdb.bin"...
Trying to open "/lib/udev/hwdb.bin"...
=== trie on-disk ===
tool version:          245
file size:         9953660 bytes
header size             80 bytes
strings            2163852 bytes
nodes              7789728 bytes
Load module index
Found container virtualization none.
timestamp of '/etc/systemd/network' changed
timestamp of '/run/systemd/network' changed
Parsed configuration file /usr/lib/systemd/network/99-default.link
Parsed configuration file /etc/systemd/network/98-ens34.link
Parsed configuration file /etc/systemd/network/98-ens224.link
Parsed configuration file /usr/lib/systemd/network/73-usb-net-by-mac.link
Created link configuration context.
Using default interface naming scheme 'v245'.
ID_NET_NAMING_SCHEME=v245
ID_NET_NAME_MAC=enx000c2953f0df
ID_OUI_FROM_DATABASE=VMware, Inc.
ID_NET_NAME_PATH=enp2s2
ID_NET_NAME_SLOT=ens34
Unload module index
Unloaded link configuration context.
osakanataro@ubuntu:~$ cat /etc/systemd/network/98-ens34.link
[Match]
PermanentMACAddress=00:0c:29:53:f0:df

[Link]
AutoNegotiation=no
BitsPerSecond=100M
Duplex=full

osakanataro@ubuntu:~$

上記で「ens34: Policies didn’t yield a name and Name= is not given, not renaming.」というのが出ているが、これはLinkセクションでName=で定義していないための表示。

/etc/systemd/network/98-ens34.link のLinkセクションにNAME=ens34aと記載すると、再起動後のNIC名がens34a と指定したものになる。

また Matchセクションの「OriginalName=」についてだが、マニュアル にINTERACEを元にするとあるが、起動後に変更されてると名前が変わってると使えない、ともある。

とりあえず起動状態のINTERFACEを確認するには 「sudo udevadm test /sys/class/net/ens34」で確認出来る

osakanataro@ubuntu:~$ sudo udevadm test /sys/class/net/ens34
This program is for debugging only, it does not run any program
specified by a RUN key. It may show incorrect results, because
some values may be different, or not available at a simulation run.

Load module index
Parsed configuration file /usr/lib/systemd/network/99-default.link
Parsed configuration file /etc/systemd/network/98-ens34.link
Parsed configuration file /etc/systemd/network/98-ens224.link
Parsed configuration file /usr/lib/systemd/network/73-usb-net-by-mac.link
Created link configuration context.
Reading rules file: /usr/lib/udev/rules.d/01-md-raid-creating.rules
Reading rules file: /usr/lib/udev/rules.d/39-usbmuxd.rules
Reading rules file: /usr/lib/udev/rules.d/40-vm-hotadd.rules
Reading rules file: /usr/lib/udev/rules.d/50-apport.rules
Reading rules file: /usr/lib/udev/rules.d/50-firmware.rules
Reading rules file: /usr/lib/udev/rules.d/50-udev-default.rules
Reading rules file: /usr/lib/udev/rules.d/55-dm.rules
Reading rules file: /usr/lib/udev/rules.d/55-scsi-sg3_id.rules
Reading rules file: /usr/lib/udev/rules.d/56-dm-mpath.rules
Reading rules file: /usr/lib/udev/rules.d/56-dm-parts.rules
Reading rules file: /usr/lib/udev/rules.d/56-lvm.rules
Reading rules file: /usr/lib/udev/rules.d/58-scsi-sg3_symlink.rules
Reading rules file: /usr/lib/udev/rules.d/60-autosuspend-chromiumos.rules
Reading rules file: /usr/lib/udev/rules.d/60-block.rules
Reading rules file: /usr/lib/udev/rules.d/60-cdrom_id.rules
Reading rules file: /usr/lib/udev/rules.d/60-crda.rules
Reading rules file: /usr/lib/udev/rules.d/60-drm.rules
Reading rules file: /usr/lib/udev/rules.d/60-evdev.rules
Reading rules file: /usr/lib/udev/rules.d/60-fido-id.rules
Reading rules file: /usr/lib/udev/rules.d/60-input-id.rules
Reading rules file: /usr/lib/udev/rules.d/60-multipath.rules
Reading rules file: /usr/lib/udev/rules.d/60-open-vm-tools.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-alsa.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-input.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-storage-dm.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-storage-tape.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-storage.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-v4l.rules
Reading rules file: /usr/lib/udev/rules.d/60-sensor.rules
Reading rules file: /usr/lib/udev/rules.d/60-serial.rules
Reading rules file: /usr/lib/udev/rules.d/60-tpm-udev.rules
Reading rules file: /usr/lib/udev/rules.d/61-autosuspend-manual.rules
Reading rules file: /usr/lib/udev/rules.d/61-persistent-storage-android.rules
Reading rules file: /usr/lib/udev/rules.d/63-md-raid-arrays.rules
Reading rules file: /usr/lib/udev/rules.d/64-btrfs-dm.rules
Reading rules file: /usr/lib/udev/rules.d/64-btrfs.rules
Reading rules file: /usr/lib/udev/rules.d/64-md-raid-assembly.rules
Reading rules file: /usr/lib/udev/rules.d/66-azure-ephemeral.rules
Reading rules file: /usr/lib/udev/rules.d/66-snapd-autoimport.rules
Reading rules file: /usr/lib/udev/rules.d/68-del-part-nodes.rules
Reading rules file: /usr/lib/udev/rules.d/69-bcache.rules
Reading rules file: /usr/lib/udev/rules.d/69-lvm-metad.rules
Reading rules file: /usr/lib/udev/rules.d/69-md-clustered-confirm-device.rules
Reading rules file: /usr/lib/udev/rules.d/70-iscsi-disk.rules
Reading rules file: /usr/lib/udev/rules.d/70-iscsi-network-interface.rules
Reading rules file: /usr/lib/udev/rules.d/70-joystick.rules
Reading rules file: /usr/lib/udev/rules.d/70-mouse.rules
Reading rules file: /usr/lib/udev/rules.d/70-power-switch.rules
Reading rules file: /etc/udev/rules.d/70-snap.snapd.rules
Reading rules file: /usr/lib/udev/rules.d/70-touchpad.rules
Reading rules file: /usr/lib/udev/rules.d/70-uaccess.rules
Reading rules file: /usr/lib/udev/rules.d/71-power-switch-proliant.rules
Reading rules file: /usr/lib/udev/rules.d/71-seat.rules
Reading rules file: /usr/lib/udev/rules.d/73-seat-late.rules
Reading rules file: /usr/lib/udev/rules.d/73-special-net-names.rules
Reading rules file: /usr/lib/udev/rules.d/75-net-description.rules
Reading rules file: /usr/lib/udev/rules.d/75-probe_mtd.rules
Reading rules file: /usr/lib/udev/rules.d/78-graphics-card.rules
Reading rules file: /usr/lib/udev/rules.d/78-sound-card.rules
Reading rules file: /usr/lib/udev/rules.d/80-debian-compat.rules
Reading rules file: /usr/lib/udev/rules.d/80-drivers.rules
Reading rules file: /usr/lib/udev/rules.d/80-net-setup-link.rules
Reading rules file: /usr/lib/udev/rules.d/80-udisks2.rules
Reading rules file: /usr/lib/udev/rules.d/81-net-dhcp.rules
Reading rules file: /usr/lib/udev/rules.d/85-hdparm.rules
Reading rules file: /usr/lib/udev/rules.d/85-regulatory.rules
Reading rules file: /usr/lib/udev/rules.d/90-bolt.rules
Reading rules file: /usr/lib/udev/rules.d/90-console-setup.rules
Reading rules file: /usr/lib/udev/rules.d/90-fwupd-devices.rules
Reading rules file: /usr/lib/udev/rules.d/95-dm-notify.rules
Reading rules file: /usr/lib/udev/rules.d/95-kpartx.rules
Reading rules file: /usr/lib/udev/rules.d/95-upower-csr.rules
Reading rules file: /usr/lib/udev/rules.d/95-upower-hid.rules
Reading rules file: /usr/lib/udev/rules.d/95-upower-hidpp.rules
Reading rules file: /usr/lib/udev/rules.d/95-upower-wup.rules
Reading rules file: /usr/lib/udev/rules.d/96-e2scrub.rules
Reading rules file: /usr/lib/udev/rules.d/99-systemd.rules
Reading rules file: /usr/lib/udev/rules.d/99-vmware-scsi-udev.rules
Reading rules file: /etc/udev/rules.d/ubuntu--vg-ubuntu--lv.rules
Using default interface naming scheme 'v245'.
ethtool: autonegotiation is unset or enabled, the speed and duplex are not writable.
Could not set AlternativeName= or apply AlternativeNamesPolicy= on ens34, ignoring: Operation not supported
DEVPATH=/devices/pci0000:00/0000:00:11.0/0000:02:02.0/net/ens34
INTERFACE=ens34
IFINDEX=6
ACTION=add
SUBSYSTEM=net
ID_MM_CANDIDATE=1
ID_NET_NAMING_SCHEME=v245
ID_NET_NAME_MAC=enx000c2953f0df
ID_OUI_FROM_DATABASE=VMware, Inc.
ID_NET_NAME_PATH=enp2s2
ID_NET_NAME_SLOT=ens34
ID_BUS=pci
ID_VENDOR_ID=0x8086
ID_MODEL_ID=0x100f
ID_PCI_CLASS_FROM_DATABASE=Network controller
ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
ID_VENDOR_FROM_DATABASE=Intel Corporation
ID_MODEL_FROM_DATABASE=82545EM Gigabit Ethernet Controller (Copper) (PRO/1000 MT Single Port Adapter)
ID_PATH=pci-0000:02:02.0
ID_PATH_TAG=pci-0000_02_02_0
ID_NET_DRIVER=e1000
ID_NET_LINK_FILE=/usr/lib/systemd/network/99-default.link
TAGS=:systemd:
SYSTEMD_ALIAS=/sys/subsystem/net/devices/ens34
USEC_INITIALIZED=2681966
run: '/lib/open-iscsi/net-interface-handler start'
run: '/lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/ens34 --prefix=/net/ipv4/neigh/ens34 --prefix=/net/ipv6/conf/ens34 --prefix=/net/ipv6/neigh/ens34'
Unload module index
Unloaded link configuration context.
osakanataro@ubuntu:~$

「INTERFACE=ens34」とはなっているが、OriginalName=ens34 と設定しても動作しなかったので、ダメなようだ。

MatchセクションでNIC特定に利用できたものは下記3つでした。
「PermanentMACAddress=」NICのMACアドレスで指定
  例: PermanentMACAddress=00:0c:29:9c:7e:0a

「Driver=」そのNICが使用するドライバ名で指定
  例: Driver=e1000

「Path=」そのNICの存在するPCIバスアドレスで指定
  例: Path=pci-0000:02:02.0

Path=で指定するパスは「sudo udevadm test /sys/class/net/ens34」の出力内にある「ID_PATH」の値を使用する

“Ubuntu 20.04 でリンク速度固定をする” への1件の返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください