先日の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)はロマンだから……などと。