LoginSignup
0
0

More than 1 year has passed since last update.

CentOS7にRealtek 8125のドライバをインストール

Last updated at Posted at 2022-07-15

導入

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)
image.png
落としてきた圧縮ファイルを /usr/local/src/ 辺りの適当なディレクトリに解凍。

> cd /usr/local/src/
> tar -jxvf r8125-9.009.02.tar.bz2
> cd r8125-9.009.02/

そして元記事を参考にソースを編集する。

■ src/r8125.h

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

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'のエラーが解消。
同じソースをさらに編集する。

src/r8125_n.c
#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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0