以下の内容はhttps://akkiesoft.hatenablog.jp/entry/20260326/1774454360より取得しました。


Rasperry Pi OSのカーネルがそろそろ6.18になるのでRealtek RTL8127 10GbE NICを試す

先日のRaspberry JAMの発表資料にも書いたとおり、ぼちぼちRasperry Pi OS Trixieのカーネルが6.18系に移行するようです。

https://forums.raspberrypi.com/viewtopic.php?t=394580

6.18になるということは……そうです、前に買ったRealtek RTL8127搭載の10GbE NICが試せます。

akkiesoft.hatenablog.jp

久しぶりにPCIeスロット変換ボードを取り出して準備。Pi 5のPibowを外すのが手間なのが難点……。

というわけで、Pi 5でRTL8127なNICを試していくブログです。が、先にいうとまだ性能を出し切れておらず。ぐぬぬ。

カーネル導入

まずはrpi-updateを実行して6.18のカーネルを導入します。カーネル周りがaptの道から外れるため、試すときはこれ用の環境を用意することをおすすめします。

$ sudo rpi-update

カーネルを入れ終えたら電源を切り、NICを搭載して、電源を入れます。LANケーブルもRTL8127に刺しちゃいましょう。

起動したらSSH接続。普通に接続できて使えています。ワクワクですね。ipコマンドを見るとeth1が生えています。アツい。

$ ip a
(略)
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 88:c9:b3:**:**:** brd ff:ff:ff:ff:ff:ff
    inet 192.168.29.***/24 brd 192.168.29.255 scope global dynamic noprefixroute eth1
(略)

erhtoolコマンドでみると、10000baseT/Fullという夢のある文字列も並びますが……

$ ethtool eth1
Settings for eth1:
	Supported ports: [ TP	 MII ]
	Supported link modes:   10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Full
	                        10000baseT/Full
	                        2500baseT/Full
	                        5000baseT/Full
	Supported pause frame use: Symmetric Receive-only
	Supports auto-negotiation: Yes
	Supported FEC modes: Not reported
	Advertised link modes:  10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Full
	                        10000baseT/Full
	                        2500baseT/Full
	                        5000baseT/Full
	Advertised pause frame use: Symmetric Receive-only
	Advertised auto-negotiation: Yes
	Advertised FEC modes: Not reported
	Link partner advertised link modes:  10baseT/Half 10baseT/Full
	                                     100baseT/Half 100baseT/Full
	                                     1000baseT/Half 1000baseT/Full
	                                     2500baseT/Full
	                                     5000baseT/Full
	Link partner advertised pause frame use: No
	Link partner advertised auto-negotiation: Yes
	Link partner advertised FEC modes: Not reported
	Speed: 5000Mb/s
	Duplex: Full
	Auto-negotiation: on
	master-slave cfg: preferred slave
	master-slave status: slave
	Port: Twisted Pair
	PHYAD: 0
	Transceiver: internal
	MDI-X: Unknown
netlink error: Operation not permitted
	Link detected: yes

「Speed: 5000Mb/s」。「Link partner advertised link modes」=スイッチがこの速度でリンクできまっせと言ってきたモードに10000baseT/Fullがないようです。どうして……。

ドライバーを変える

調べてみると、RTL8127 NICに対してカーネル標準のr8169ドライバーが使われるのですが、動作不安定など色々あるもよう。代替案については、r8168-dkmsパッケージを入れるか、それもイマイチなのでRealtek公式からソースコードをダウンロードしてコンパイルするかが良いようです。

r8168-dkmsパッケージのやりかたはなんか微妙にうまく行かなかった(たぶんやり方がだめだった?)のと、パッケージが新しくなかったのとで、ソースコードからコンパイルすることにしました。

カーネル系のコンパイルをするので、必要なツールと、rpi-updateで導入したカーネルに合うソースコードを取得するためのツールrpi-sourceを導入します。導入手順はrpi-sourceのREADMEの手順相当です。

$ sudo apt install git bc bison flex libssl-dev libncurses5-dev -y
$ sudo wget https://raw.githubusercontent.com/RPi-Distro/rpi-source/master/rpi-source -O /usr/local/bin/rpi-source && sudo chmod +x /usr/local/bin/rpi-source && /usr/local/bin/rpi-source -q --tag-update

そしてソースコードの取得。ホームディレクトリに~/linuxとか~/linux-(なんか長いやつ)が生成されます。

$ rpi-source

Realtekのサイトからドライバーのソースコードを取得します。今回は「10G Ethernet LINUX driver r8127 for kernel up to 6.15」を選択。ダウンロードしたらRaspberry Pi環境に転送して展開します。

www.realtek.com

$ tar xf r8127-11.016.00.tar.bz2 

コンパイルはautorun.shを使用せずに、srcディレクトリでmakeコマンドを実行します。autorun.shはうまく使えないので。というのも、インストール後に、6.18.18-v8-16kのmodulesにインストールされたr8127.ko.xzを、6.18.18-v8-16k+のmodulesにコピーする必要があります。なんか、makeファイルの中で変数の展開がうまく行っていないのか、+がない方にしかドライバーが作られないんですよね。これが解決できたらautorun.shでも良いような気がします。

$ cd r8127-11.016.00/src
~/r8127-11.016.00 $ make -j 6
~/r8127-11.016.00 $ sudo make install
~/r8127-11.016.00 $ sudo cp /lib/modules/6.18.18-v8-16k/kernel/drivers/net/ethernet/realtek/r8127.ko.xz /lib/modules/6.18.18-v8-16k+/kernel/drivers/net/ethernet/realtek/r8127.ko.xz

ここまでできたら、depmodしてからドライバーを読み込めば、r8127でNICが認識するようになります。ダメそうならOS再起動でもOK。

$ sudo depmod -a
$ sudo modprobe r8127
$ ethtool -i eth1
driver: r8127
version: 11.016.00-NAPI-DASH
firmware-version: 
expansion-rom-version: 
bus-info: 0001:01:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

改めてethtoolのオプション無しで。10000Mb/s、きたああああああああああ!!!!

$ ethtool eth1
Settings for eth1:
(略)
	Link partner advertised link modes:  10baseT/Half 10baseT/Full
	                                     100baseT/Half 100baseT/Full
	                                     1000baseT/Half 1000baseT/Full
	                                     10000baseT/Full
	                                     2500baseT/Full
	                                     5000baseT/Full
	Link partner advertised pause frame use: No
	Link partner advertised auto-negotiation: Yes
	Link partner advertised FEC modes: Not reported
	Speed: 10000Mb/s
(略)

ちなみに、使用するドライバーを常にr8127にするためには、/etc/modprobe.d/以下の適当なファイルにブラックリストを追加する必要があります。見たらちょうど8192cuのblacklistがいたので、同じRealtekのドライバー同士ということで、ここにでも追記しておきました。これでOSを再起動してもr8127が使われるようになったはずです。

$ sudo vi /etc/modprobe.d/blacklist-8192cu.conf

blacklist 8192cu
blacklist r8169  ←追記

スピードがでない

というわけで早速iperf3を叩いてみます。対抗は自作PCな自宅サーバーです。どん!

$ iperf3 -c 192.168.29.**
Connecting to host 192.168.29.**, port 5201
[  5] local 192.168.29.*** port 42642 connected to 192.168.29.** port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   435 MBytes  3.65 Gbits/sec    0   1.14 MBytes       
[  5]   1.00-2.00   sec   434 MBytes  3.64 Gbits/sec    0   1.27 MBytes       
[  5]   2.00-3.00   sec   434 MBytes  3.64 Gbits/sec    0   1.27 MBytes       
[  5]   3.00-4.00   sec   432 MBytes  3.63 Gbits/sec    0   1.27 MBytes       
[  5]   4.00-5.00   sec   434 MBytes  3.64 Gbits/sec    0   1.27 MBytes       
[  5]   5.00-6.00   sec   433 MBytes  3.63 Gbits/sec    0   1.27 MBytes       
[  5]   6.00-7.00   sec   434 MBytes  3.64 Gbits/sec    0   1.27 MBytes       
[  5]   7.00-8.00   sec   433 MBytes  3.63 Gbits/sec    0   1.33 MBytes       
[  5]   8.00-9.00   sec   434 MBytes  3.64 Gbits/sec    0   1.33 MBytes       
[  5]   9.00-10.00  sec   433 MBytes  3.63 Gbits/sec    0   1.33 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  4.23 GBytes  3.64 Gbits/sec    0            sender
[  5]   0.00-10.00  sec  4.23 GBytes  3.63 Gbits/sec                  receiver

3.6Gbpsを記録。あれ、スピードがでない。実測のMaxでは6.3Gbpsくらい出せるはずなので、何かがおかしいですね。2.5Gbpsは超えているので、これでも十分早くはありますが。

akkiesoft.hatenablog.jp

……あーわかった。PCIe3.0x1を有効にしてなかった!

PCIe3.0x1を有効にでき……ない

/boot/firmware/config.txtにdtparam=pciex1_gen=3を書くか、raspi-configコマンドでPCIeの設定をして、PCIe3.0x1を有効にします。

$ sudo vi /boot/firmware/config.txt

[all]
dtparam=pciex1_gen=3 ←末尾に追加

そして再起動。……あれ、起動してきませんね。起動画面をキャプチャーで確認すると、ウーンなんですかね?

ASPMは、そういや前に試した時に、cmdline.txtに設定の追記が必要だったりしました。上の自分のブログ記事から引用。

(1) どちらも共通して、/boot/firmware/cmdline.txtに「pcie_ports=compat pcie_aspm=off」を追加しないと、PCIeのリンクエラーが大量に出てなんかシステムがめちゃくちゃ不安定になったりする

これを試すと、起動はしそうなのですが、スプラッシュ画面で止まってしまいます。おしい。

cmdline.txtから「quiet splash」を削って様子を見ます。あと、ここまで不精をして公式電源を使っていなかったので、公式電源に交代して試します。起動すると、ズラズラメッセージが出ましたが……

ああ、なんかダメそうですね。

r8127 0001:01:00.0: of_irq_parse_pci: failed with rc=-22
r8127 0001:01:00.0: Unable to change power state from D3cold to DO, device inaccessible

他にもいくつか試してみましたが、PCIe3.0を有効にした状態ではOSを起動すらできませんでした。ぐぬぬ。

まとめ

RTL8127がハード的にまだという感じなのか、Pi 5のファームウェアでPCIe周りに改善の余地があるのかは不明ですが、残念ながらPi 5でパフォーマンスを出し切るのは難しいようでした。それでも3.6Gbps(450MB/s)を出せていて、PCI2.0x1の片方向理論値である500MB/sに近いので、PCIe2.0としてはかなり優秀っぽそうです。

現実的にはまだ2.5GbEからこれからというかんじなので、アリエクとかで買える2.5GbEのやつ(RTL8125)とかを使うのが良いんでしょうね。

https://ja.aliexpress.com/item/1005010471978840.html

でもこれ(Pi 5で10GbE NIC)はロマンだから……などと。




以上の内容はhttps://akkiesoft.hatenablog.jp/entry/20260326/1774454360より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14