Linux環境でエレコム製の2.5Gbps Ethernet/USBアダプタを使う
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」のドライバを導入しました。
- ダウンロード
- パッチ
- ビルド
ダウンロード
Realtekのサイトから「USB NIC Linux driver for kernel up to 5.17」をダウンロードしました。ダウンロード時点のバージョンは「2.16.1」(更新日時2022年5月4日)でした。
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に置いておきます。
# ドライバのアーカイブを展開する
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でも同様に成功しています。こちらは別途、記事を作成予定です。
関連記事
Discussion
バッファローのNICでも丁寧なパッチ情報があって入れられました。
ありがとうございます。
参考になったようで幸いです。わざわざコメント頂けて嬉しいです!