導入
CentOS7のサーバーにPlanexの2.5GbE NIC、GPE-2500Tを導入したところデフォルトではドライバが当たらなかったので、どれどれ手動で入れようかとサポートから落としたドライバを入れようとしたらエラーで動かなかった。
明らかにドライバのソースがコンパイルエラーを起こしており、目の前が真っ暗になる。
In file included from /usr/local/src/r8125-9.005.06/src/r8125_n.c:83:0:
/usr/local/src/r8125-9.005.06/src/r8125.h:69:20: エラー: ‘ether_addr_copy’ が再定義されました
static inline void ether_addr_copy(u8 *dst, const u8 *src)
^
In file included from /usr/local/src/r8125-9.005.06/src/r8125_n.c:43:0:
include/linux/etherdevice.h:246:20: 備考: 前の ‘ether_addr_copy’ の宣言はここです
static inline void ether_addr_copy(u8 *dst, const u8 *src)
^
/usr/local/src/r8125-9.005.06/src/r8125_n.c:11573:9: エラー: 初期化子内で不明なフィールド ‘ndo_change_mtu’ が指定されています
.ndo_change_mtu = rtl8125_change_mtu,
^
/usr/local/src/r8125-9.005.06/src/r8125_n.c:11573:9: 警告: 初期化子の周りに中括弧がありません [-Wmissing-braces]
/usr/local/src/r8125-9.005.06/src/r8125_n.c:11573:9: 警告: (‘rtl8125_netdev_ops.<無名>’ 用の初期化付近) [-Wmissing-braces]
/usr/local/src/r8125-9.005.06/src/r8125_n.c:11573:9: 警告: 互換性のないポインタ型からの初期化です [デフォルトで有効]
/usr/local/src/r8125-9.005.06/src/r8125_n.c:11573:9: 警告: (‘rtl8125_netdev_ops.<無名>.ndo_get_stats64’ 用の初期化付近) [デフォルトで有効]
/usr/local/src/r8125-9.005.06/src/r8125_n.c: 関数 ‘rtl8125_poll_msix_other’ 内:
/usr/local/src/r8125-9.005.06/src/r8125_n.c:11742:22: 警告: 使用されない変数 ‘work_to_do’ です [-Wunused-variable]
unsigned int work_to_do = RTL_NAPI_QUOTA(budget, dev);
^
/usr/local/src/r8125-9.005.06/src/r8125_n.c: 関数 ‘rtl8125_rx_interrupt’ 内:
/usr/local/src/r8125-9.005.06/src/r8125_n.c:14337:28: エラー: ‘struct net_device’ は ‘last_rx’ という名前のメンバを持っていません
dev->last_rx = jiffies;
^
対処
見るからに根が深そうな問題に絶望しかけていたところ、偉大なる先人が同様のエラーを解決してくれている記事を発見。
https://kusoneko.blogspot.com/2018/05/change-centos-7.5-r8168-driver.html
Realtek 8168について書かれた内容であったものの、Realtek 8125でもほぼ同じ対応で解決することができた。(ドライバは同じなので当然といえば当然)
手順
Planexが配布していたドライバはRealtek公式ドライバの再配布だった(おまけに少し古い)ので、本家の方から最新版を取得。
(一番上の2.5G Ethernet LINUX driver r8125 for kernel up to 5.19)
落としてきた圧縮ファイルを /usr/local/src/ 辺りの適当なディレクトリに解凍。
> cd /usr/local/src/
> tar -jxvf r8125-9.009.02.tar.bz2
> cd r8125-9.009.02/
そして元記事を参考にソースを編集する。
■ src/r8125.h
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
KERNEL_VERSION(3,14,0)で検索し、最初に引っかかった行を以下のように書き換える。ドライバv9.005.06では68行目にあった。
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
これでether_addr_copyの多重定義エラーは消える。
■ src/r8125_n.c
.ndo_change_mtu = rtl8125_change_mtu,
.ndo_change_mtuで検索し、該当行(1箇所しかないはず)を以下のように書き換える。v9.005.06では11573行目にあった。
.ndo_change_mtu_rh74 = rtl8125_change_mtu,
これで不明なフィールド'ndo_change_mtu'のエラーが解消。
同じソースをさらに編集する。
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)
dev->last_rx = jiffies;
#endif //LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)
dev->last_rxで検索し、該当行(これも1箇所)を前後の行ごとコメントアウトする。v9.005.06では14336~14338行にあった。
//#if LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)
// dev->last_rx = jiffies;
//#endif //LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)
これで'last_rx'メンバが無いよエラーも解消。
インストール
これでエラーは出なくなったはずなので、既定のインストールコマンドを叩けば無事ドライバが導入される。
> ./autorun.sh
なおこれを実行すると既存のネットワークインターフェースが消され接続が切れてしまったので、SSH経由ではなくマシン上で直接操作した方が良さげ。(古いドライバを消す処理が入ってたので、蟹じゃないNIC積んでれば関係ない?)
その他
最初に載せたエラーではなく、/lib/modules/xxxxxxxxxxxxx.x86_64/build がウンタラ~と言われた場合はkernel-develが入っていないのが悪いので、yumから入れる。
> yum install kernel-devel