🚄

Linux環境でエレコム製の2.5Gbps Ethernet/USBアダプタを使う

2022/05/11に公開
2

3行まとめ

  • Linux環境でエレコム製の2.5Gbps Ethernet/USBアダプタ「EDC-QUA3C-B」を使い、約2.3Gbpsで通信できました。
  • Linux環境で当該アダプタ(チップはRTL8156B)を使うためには、ドライバへのパッチの適用、ビルドが必要でした。
  • Ubuntu 22.04 LTS、カーネル5.15.0-27、Realtekのドライバ2.16.1の組み合わせで成功しました。

はじめに

以前、「Raspberry Pi 4に2.5Gbps Ethernetアダプタを接続してみた (1) 失敗編」という記事を書いたのですが、その時には期待通りの速度が出ず、失敗してしまいました。

Raspberry Pi、ARM64のような少々特殊な環境ではなく、まずは普通のx86_64、Linux環境で実験してみようと思い、結果成功しました。
その実験の備忘録としてメモを残しておきます。

使用機材

今回の実験で使用した機材は以下の通りです。

メーカー 品名 型番 台数 参考リンク
エレコム 2.5Gbps Ethernet/USBアダプタ EDC-QUA3C-B 1台 Amazon
PLANEX 2.5Gbps Ethernet スイッチングハブ 8ポート FX2G-08EM 1台 Amazon
MSI マザーボード(2.5Gbps Ethernet内蔵) MEG X570 UNIFY 1台 Amazon
BUFFALO Ethernetケーブル Cat6A 1.0m BCLS6AN10BK 2本 Amazon

ネットワーク構成

ネットワークの物理構成は以下の通りです。

machine2 〜 Cat6Aケーブル 〜 2.5Gbpsスイッチングハブ 〜 Cat6Aケーブル 〜 2.5Gbps Ethernet/USBアダプタ 〜 machine1

machine2は、マザーボードに内蔵されている2.5Gbps Ethernetを使用しています。
また、2.5Gbpsスイッチングハブには上位の1Gbpsスイッチングハブが接続されており、DHCPが有効な環境です。

環境

2.5Gbps Ethernet/USBアダプタを使用するmachine1の環境は以下の通りです。

ubuntu@machine1$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

ubuntu@machine1$ uname -a
Linux machine1 5.15.0-27-generic #28-Ubuntu SMP Thu Apr 14 04:55:28 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

ドライバ導入前

machine1に2.5Gbps Ethernet/USBアダプタを接続すると、ネットワークデバイスとしては認識されますが、ethtoolコマンドで情報が表示されない状態でした。
この時点では、ドライバとしてcdc_ncmが使われています。

ubuntu@machine1$ lsusb
Bus 002 Device 002: ID 056e:4017 Elecom Co., Ltd USB 10/100/1G/2.5G LAN
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 413c:2003 Dell Computer Corp. Keyboard SK-8115
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

ubuntu@machine1$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
    |__ Port 1: Dev 2, If 0, Class=Communications, Driver=cdc_ncm, 5000M
    |__ Port 1: Dev 2, If 1, Class=CDC Data, Driver=cdc_ncm, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 480M
    |__ Port 7: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M

ubuntu@machine1$ inxi -n
Network:
  Device-1: Intel Ethernet I219-V driver: e1000e
  IF: enp0s31f6 state: up speed: 1000 Mbps duplex: full mac: 70:85:c2:5f:2e:a2
  Device-2: Elecom USB 10/100/1G/2.5G LAN type: USB driver: cdc_ncm
  IF: enx04ab18a2a32c state: down mac: 04:ab:18:a2:a3:2c
  IF-ID-1: docker0 state: up speed: 10000 Mbps duplex: unknown mac: 02:42:d3:66:f6:e6
  IF-ID-2: veth8919f37 state: up speed: 10000 Mbps duplex: full mac: 5a:e3:e6:4f:4c:de

ubuntu@machine1$ ip addr show enx04ab18a2a32c
6: enx04ab18a2a32c: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 04:ab:18:a2:a3:2c brd ff:ff:ff:ff:ff:ff

ubuntu@machine1$ sudo ethtool enx04ab18a2a32c
Settings for enx04ab18a2a32c:
	Supported ports: [  ]
	Supported link modes:   Not reported
	Supported pause frame use: No
	Supports auto-negotiation: No
	Supported FEC modes: Not reported
	Advertised link modes:  Not reported
	Advertised pause frame use: No
	Advertised auto-negotiation: No
	Advertised FEC modes: Not reported
	Speed: Unknown!
	Duplex: Half
	Auto-negotiation: off
	Port: Twisted Pair
	PHYAD: 0
	Transceiver: internal
	MDI-X: Unknown
        Current message level: 0x00000007 (7)
                               drv probe link
	Link detected: no

なお、あとにRaspberry Pi 4で実験したところでは、cdc_ncmを使用した状態でも通信できましたが、1.3Gbps程度の通信速度となりました。

ドライバの導入

以下の手順で、2.5Gbps Ethernet/USBアダプタで使用されているチップ「RTL8156B」のドライバを導入しました。

  1. ダウンロード
  2. パッチ
  3. ビルド

ダウンロード

Realtekのサイトから「USB NIC Linux driver for kernel up to 5.17」をダウンロードしました。ダウンロード時点のバージョンは「2.16.1」(更新日時2022年5月4日)でした。

https://www.realtek.com/en/component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-usb-3-0-software

ubuntu@machine1$ ls -l r8152-2.16.1.tar.bz2
-rw-r--r-- 1 ubuntu ubuntu 72932 May 10 16:07 r8152-2.16.1.tar.bz2

ubuntu@machine1$ shasum r8152-2.16.1.tar.bz2
fa2d9ce8e374d3e462ca14509af7a03088767eb9  r8152-2.16.1.tar.bz2

パッチ&ビルド

Realtekのサイトからダウンロードしてきたドライバのソースコードには、エレコム製デバイスのベンダーID、プロダクトIDは含まれていません。
そのため、ソースコードを変更して追加しました。パッチは、GitHub Gistに置いておきます。

https://gist.github.com/nayutaya/0e48e707ea397db1137050d5ffa342cb

# ドライバのアーカイブを展開する
ubuntu@machine1$ tar xfv r8152-2.16.1.tar.bz2
r8152-2.16.1/
r8152-2.16.1/ReadMe.txt
r8152-2.16.1/compatibility.h
r8152-2.16.1/50-usb-realtek-net.rules
r8152-2.16.1/r8152.c
r8152-2.16.1/Makefile

ubuntu@machine1$ cd r8152-2.16.1/

# r8152.cのパッチをダウンロードし、適用する。
ubuntu@machine1$ wget https://gist.githubusercontent.com/nayutaya/0e48e707ea397db1137050d5ffa342cb/raw/7686050988ffee262c6aa53af07d247538db473c/r8152.c.patch
ubuntu@machine1$ cat r8152.c.patch
--- r8152.c.orig	2022-05-10 18:42:20.935229478 +0900
+++ r8152.c	2022-05-10 18:43:17.759407562 +0900
@@ -20734,6 +20734,9 @@
 	/* Getac */
 	REALTEK_USB_DEVICE(0x2baf, 0x0012),

+	/* ELECOM */
+	REALTEK_USB_DEVICE(0x056e, 0x4017),
+
 	{}
 };

ubuntu@machine1$ patch -u < r8152.c.patch
patching file r8152.c

# 50-usb-realtek-net.rulesのパッチをダウンロードし、適用する。
ubuntu@machine1$ wget https://gist.githubusercontent.com/nayutaya/0e48e707ea397db1137050d5ffa342cb/raw/7686050988ffee262c6aa53af07d247538db473c/50-usb-realtek-net.rules.patch
ubuntu@machine1$ cat 50-usb-realtek-net.rules.patch
--- 50-usb-realtek-net.rules.orig	2022-05-10 19:06:50.312255170 +0900
+++ 50-usb-realtek-net.rules	2022-05-10 19:07:51.472438505 +0900
@@ -43,4 +43,7 @@
 # LINKSYS
 ATTR{idVendor}=="13b1", ATTR{idProduct}=="0041", ATTR{bConfigurationValue}!="$env{REALTEK_MODE1}", ATTR{bConfigurationValue}="$env{REALTEK_MODE1}"

+# ELECOM
+ATTR{idVendor}=="056e", ATTR{idProduct}=="4017", ATTR{bConfigurationValue}!="$env{REALTEK_MODE1}", ATTR{bConfigurationValue}="$env{REALTEK_MODE1}"
+
 LABEL="usb_realtek_net_end"

ubuntu@machine1$ patch -u < 50-usb-realtek-net.rules.patch
patching file 50-usb-realtek-net.rules

# ドライバをビルドする。
ubuntu@machine1$ make
make -C /lib/modules/5.15.0-27-generic/build M=/home/ubuntu/r8152-2.16.1 modules
make[1]: Entering directory '/usr/src/linux-headers-5.15.0-27-generic'
  CC [M]  /home/ubuntu/r8152-2.16.1/r8152.o
  MODPOST /home/ubuntu/r8152-2.16.1/Module.symvers
  CC [M]  /home/ubuntu/r8152-2.16.1/r8152.mod.o
  LD [M]  /home/ubuntu/r8152-2.16.1/r8152.ko
  BTF [M] /home/ubuntu/r8152-2.16.1/r8152.ko
Skipping BTF generation for /home/ubuntu/r8152-2.16.1/r8152.ko due to unavailability of vmlinux
make[1]: Leaving directory '/usr/src/linux-headers-5.15.0-27-generic'

# エレコムのベンダーIDが含まれていることを確認する。
ubuntu@machine1$ modinfo ./r8152.ko | grep -i 056e
alias:          usb:v056Ep4017d*dc*dsc*dp*ic02isc0Dip00in*
alias:          usb:v056Ep4017d*dc*dsc*dp*ic02isc06ip00in*
alias:          usb:v056Ep4017d*dc*dsc*dp*icFFisc*ip*in*

# ドライバをインストールする。
ubuntu@machine1$ sudo make install

# ルールファイルをインストールする。
ubuntu@machine1$ sudo cp 50-usb-realtek-net.rules /etc/udev/rules.d/

# 環境を整える。
ubuntu@machine1$ sudo depmod -a
ubuntu@machine1$ sudo update-initramfs -u
ubuntu@machine1$ sudo service udev restart

なお、lsusbコマンドの結果に含まれている056e:4017がベンダーID、プロダクトIDです。
エレコム製以外の2.5Gbps Ethernet/USBアダプタを使用する場合は、この部分を変更する必要があります。

ドライバの導入後

ドライバの導入後、2.5Gbps Ethernet/USBアダプタを抜き挿しすると、当該デバイスのドライバとしてr8152がロードされます。

ubuntu@machine1$ inxi -n
Network:
  Device-1: Intel Ethernet I219-V driver: e1000e
  IF: enp0s31f6 state: up speed: 1000 Mbps duplex: full mac: 70:85:c2:5f:2e:a2
  Device-2: Elecom USB 10/100/1G/2.5G LAN type: USB driver: r8152
  IF: enx04ab18a2a32c state: up speed: 2500 Mbps duplex: full mac: 04:ab:18:a2:a3:2c
  IF-ID-1: docker0 state: up speed: 10000 Mbps duplex: unknown mac: 02:42:e6:a2:b4:1a
  IF-ID-2: veth6cc2188 state: up speed: 10000 Mbps duplex: full mac: da:99:41:3c:6e:0f

ethtoolコマンドでも各種情報が表示されるようになりました。

ubuntu@machine1$ sudo ethtool enx04ab18a2a32c
Settings for enx04ab18a2a32c:
	Supported ports: [ MII ]
	Supported link modes:   10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Full
	                        2500baseT/Full
	Supported pause frame use: No
	Supports auto-negotiation: Yes
	Supported FEC modes: Not reported
	Advertised link modes:  10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Full
	                        2500baseT/Full
	Advertised pause frame use: No
	Advertised auto-negotiation: Yes
	Advertised FEC modes: Not reported
	Link partner advertised link modes:  10baseT/Half 10baseT/Full
	                                     100baseT/Half 100baseT/Full
	                                     1000baseT/Full
	                                     2500baseT/Full
	Link partner advertised pause frame use: No
	Link partner advertised auto-negotiation: Yes
	Link partner advertised FEC modes: Not reported
	Speed: 2500Mb/s
	Duplex: Full
	Auto-negotiation: on
	Port: MII
	PHYAD: 32
	Transceiver: internal
	Supports Wake-on: pumbg
	Wake-on: g
        Current message level: 0x00007fff (32767)
                               drv probe link timer ifdown ifup rx_err tx_err tx_queued intr tx_done rx_status pktdata hw wol
	Link detected: yes

DHCPのための設定ファイルを作成し、netplan applyコマンドを実行することで、IPアドレスが割り当てられました。

ubuntu@machine1$ sudo vim /etc/netplan/90-usb-ethernet.yaml
ubuntu@machine1$ cat /etc/netplan/90-usb-ethernet.yaml
network:
  version: 2
  ethernets:
    enx04ab18a2a32c:
      dhcp4: true

ubuntu@machine1$ sudo netplan apply
ubuntu@machine1$ ip addr show enx04ab18a2a32c
20: enx04ab18a2a32c: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 04:ab:18:a2:a3:2c brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.122/24 metric 100 brd 192.168.1.255 scope global dynamic enx04ab18a2a32c
       valid_lft 86385sec preferred_lft 86385sec
    inet6 fe80::6ab:18ff:fea2:a32c/64 scope link
       valid_lft forever preferred_lft forever

通信速度の測定

iperf3コマンドを使って通信速度を測定しました。約2.3Gbpsで通信することができました。

machine1がサーバの場合:

ubuntu@machine1$ iperf3 --bind 192.168.1.122 --server

ubuntu@machine2$ iperf3 --client 192.168.1.122
Connecting to host 192.168.1.122, port 5201
[  5] local 192.168.1.205 port 54880 connected to 192.168.1.122 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   283 MBytes  2.37 Gbits/sec    0    690 KBytes
[  5]   1.00-2.00   sec   281 MBytes  2.36 Gbits/sec    0    690 KBytes
[  5]   2.00-3.00   sec   279 MBytes  2.34 Gbits/sec    0    747 KBytes
[  5]   3.00-4.00   sec   281 MBytes  2.36 Gbits/sec    0    747 KBytes
[  5]   4.00-5.00   sec   280 MBytes  2.35 Gbits/sec    0    747 KBytes
[  5]   5.00-6.00   sec   281 MBytes  2.36 Gbits/sec    0    747 KBytes
[  5]   6.00-7.00   sec   280 MBytes  2.35 Gbits/sec    0    747 KBytes
[  5]   7.00-8.00   sec   281 MBytes  2.36 Gbits/sec    0    747 KBytes
[  5]   8.00-9.00   sec   280 MBytes  2.35 Gbits/sec    0    747 KBytes
[  5]   9.00-10.00  sec   280 MBytes  2.35 Gbits/sec    0    747 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  2.74 GBytes  2.35 Gbits/sec    0             sender
[  5]   0.00-10.00  sec  2.74 GBytes  2.35 Gbits/sec                  receiver

iperf Done.

machine2がサーバの場合:

ubuntu@machine2$ iperf3 --bind 192.168.1.205 --server

ubuntu@machine1$ iperf3 --client 192.168.1.205
Connecting to host 192.168.1.205, port 5201
[  5] local 192.168.1.122 port 42410 connected to 192.168.1.205 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   284 MBytes  2.38 Gbits/sec    0   1.18 MBytes
[  5]   1.00-2.00   sec   280 MBytes  2.35 Gbits/sec    0   1.18 MBytes
[  5]   2.00-3.00   sec   281 MBytes  2.36 Gbits/sec    0   1.23 MBytes
[  5]   3.00-4.00   sec   280 MBytes  2.35 Gbits/sec    0   1.23 MBytes
[  5]   4.00-5.00   sec   281 MBytes  2.36 Gbits/sec    0   1.23 MBytes
[  5]   5.00-6.00   sec   280 MBytes  2.35 Gbits/sec    0   1.23 MBytes
[  5]   6.00-7.00   sec   280 MBytes  2.35 Gbits/sec    0   1.23 MBytes
[  5]   7.00-8.00   sec   281 MBytes  2.36 Gbits/sec    0   1.23 MBytes
[  5]   8.00-9.00   sec   280 MBytes  2.35 Gbits/sec    0   1.23 MBytes
[  5]   9.00-10.00  sec   281 MBytes  2.36 Gbits/sec    0   1.23 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  2.74 GBytes  2.36 Gbits/sec    0             sender
[  5]   0.00-10.01  sec  2.74 GBytes  2.35 Gbits/sec                  receiver

iperf Done.

おわりに

前回は失敗に終わった「Linux環境における2.5Gbps Ethernet/USBアダプタの使用」は、今回は無事に成功しました。
本記事中には記載がありませんが、Raspberry Pi 4でも同様に成功しています。こちらは別途、記事を作成予定です。

関連記事

https://zenn.dev/yuyakato/articles/a7921bf7f89c96

https://zenn.dev/yuyakato/articles/8bd9f75a4427ae

Discussion

TacknTackn

バッファローのNICでも丁寧なパッチ情報があって入れられました。
ありがとうございます。

Yuya KatoYuya Kato

参考になったようで幸いです。わざわざコメント頂けて嬉しいです!