Debian系统中为RTL8125 2.5G网卡更新驱动与启用RSS多队列功能的完整指南(DKMS方法)

我的环境

设备:NanoPi R5C

Linux发行版:openmediavault 7.4.10-1(在 Debian 12 上使用脚本构建)(有大坑,在最后面说)

网卡:RTL8125BG

我直接在 root 用户下操作

折腾目标

虽然没有需要处理大量并发连接的需求,但是重在折腾

Dynamic Kernel Module Support (DKMS) 介绍

内核模块是需要和内核版本对应的

这也就意味着,如果你要安装额外的内核模块,例如网卡驱动,那么每次升级内核之后,都要重复做一次模块编译动作

DKMS 的一个基本功能是,如果安装了新内核版本,它会自动重新编译所有 DKMS 模块。这允许主线内核之外的驱动程序和设备在 Linux 内核升级后继续工作。

https://en.wikipedia.org/wiki/Dynamic_Kernel_Module_Support

风险提示

做好无法使用这张网卡,特别是无头系统

例如,你可以接一个使用其他驱动的网卡,并确保联通你的网络

或者对于嵌入式设备,直接上TTL线等调试端口

找到驱动

既然已经知道 dkms 这种好东西,那么

你可以手搓 dkms 驱动包

https://wiki.archlinux.org/title/DKMS_package_guidelines

或者,对于热门设备,很容易找到别人造好的轮子

像我找到的这个项目 ,但只有 amd64 架构的安装包

https://github.com/awesometic/realtek-r8125-dkms

或者,直接从源获取,取决于发行版的软件仓库策略,可能版本会稍微老一点

这是我的 Debian 12 的官方仓库

root@xxx:~# apt search r8125
Sorting... Done
Full Text Search... Done
r8125-dkms/stable 9.011.00-3 all
  dkms source for the r8125 network driver

安装

准备

检查目前正在使用的驱动版本

root@xxx:~# ethtool -i eth0
driver: r8125
version: 9.010.01-NAPI
firmware-version: 
expansion-rom-version: 
bus-info: 0002:21:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

安装 DKMS

apt install dkms

安装内核头文件

检查内核头文件有没有安装
root@xxx:~# dpkg-query -s linux-headers-$(uname -r) 
dpkg-query: package 'linux-headers-6.1.25' is not installed and no information is available
Use dpkg --info (= dpkg-deb --info) to examine archive files.
安装内核头文件

如果你没有手动更换到奇怪的内核,那么大概率能直接使用这个命令安装

apt install linux-headers-$(uname -r)

或者参考你的设备的文档

安装

我最终选择了这个项目

https://github.com/awesometic/realtek-r8125-dkms

正常情况下,下载好软件包后,只要一条命令就能安装好

例如

wget https://github.com/awesometic/realtek-r8125-dkms/releases/download/9.013.02-2/realtek-r8125-dkms_9.013.02-2_amd64.deb
dpkg -i realtek-r8125-dkms_9.013.02-2_amd64.deb

重启

构建

那么问题来了,在某些时候,你希望可以自行构建这个软件包

例如,我的是一台 arm64 架构的机子,Releases 里面的现成的软件包是给 amd64 架构用的

或者,我需要改动一下驱动的配置或者源码

这时候就需要自己构建

准备

安装构建环境

apt install devscripts debmake debhelper build-essential dh-dkms

准备项目源码

下载相应版本的驱动源码存档

wget https://github.com/awesometic/realtek-r8125-dkms/archive/refs/tags/9.013.02-2.zip

解压压缩包,并进入项目目录

unzip ./9.013.02-2.zip
cd realtek-r8125-dkms-9.013.02-2/

检查 Realtek 的官方驱动在不在

xxx@xxx:~/r8125-dkms-9.012.03-2# ls ./src/
Makefile	   r8125_firmware.c  r8125_ptp.h      rtl_eeprom.c
Makefile_linux24x  r8125_firmware.h  r8125_realwow.h  rtl_eeprom.h
r8125.h		   r8125_n.c	     r8125_rss.c      rtltool.c
r8125_dash.h	   r8125_ptp.c	     r8125_rss.h      rtltool.h

为了实现我的目标,还需要编辑 Makefile 文件,指定编译驱动时的参数

nano ./src/Makefile

并作以下修改

# 关闭网卡的 Active-state power management (ASPM) 活动状态电源管理 功能
CONFIG_ASPM = n
# 关闭网卡的 Energy Efficient Ethernet (EEE) 节能以太网 功能
ENABLE_EEE = n
# 开启网卡的 Multiple Tx Queue 多队列发送 功能
ENABLE_MULTIPLE_TX_QUEUE = y
# 开启网卡的 Receive-Side Scaling (RSS) 多队列接收 功能
ENABLE_RSS_SUPPORT = y

开始构建

dpkg-buildpackage -b -rfakeroot -us -uc

构建成功的话,就能在上级目录找到生成的软件包

../realtek-r8125-dkms_9.013.02-2_arm64.deb

安装

dpkg -i realtek-r8125-dkms_9.013.02-2_arm64.deb

卸载 DKMS 驱动

软件包安装

确认包名

root@bb-nanopi-r5c:~# dpkg -l | grep r8125
ii  realtek-r8125-dkms               9.013.02-2                              arm64        Realtek RTL8125 driver in DKMS format

直接卸载这个软件包即可

apt purge realtek-r8125-dkms

重启

手动删除

确认 dkms 模块名和版本

root@xxx:~# dkms status
Deprecated feature: REMAKE_INITRD (/var/lib/dkms/realtek-r8125/9.013.02/source/dkms.conf)
realtek-r8125/9.013.02, 6.1.25, arm64: installed

卸载

dkms remove realtek-r8125/9.013.02

重启

验证

检查 dkms 状态

root@xxx:~# dkms status
Deprecated feature: REMAKE_INITRD (/var/lib/dkms/realtek-r8125/9.013.02/source/dkms.conf)
realtek-r8125/9.013.02, 6.1.25, arm64: installed

检查网卡正在使用的驱动

root@xxx:~# ethtool -i eth0
driver: r8125
version: 9.013.02-NAPI-RSS
firmware-version: 
expansion-rom-version: 
bus-info: 0002:21:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

折腾前后对比

正在使用的驱动

xxx@xxx:~# ethtool -i eth0
driver: r8125
version: 9.010.01-NAPI
firmware-version: 
expansion-rom-version: 
bus-info: 0002:21:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

root@bb-nanopi-r5c:~# ethtool -i eth0
driver: r8125
version: 9.013.02-NAPI-RSS
firmware-version: 
expansion-rom-version: 
bus-info: 0002:21:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

驱动模块信息

root@bb-nanopi-r5c:~# modinfo r8125
filename:       /lib/modules/6.1.25/extra/r8125.ko
version:        9.010.01-NAPI
license:        GPL
description:    Realtek RTL8125 2.5Gigabit Ethernet driver
author:         Realtek and the Linux r8125 crew <netdev@vger.kernel.org>
srcversion:     05603FAA2BFC944987305A4
alias:          pci:v000010ECd00003000sv*sd*bc*sc*i*
alias:          pci:v000010ECd00008162sv*sd*bc*sc*i*
alias:          pci:v000010ECd00008125sv*sd*bc*sc*i*
depends:        
name:           r8125
vermagic:       6.1.25 SMP mod_unload modversions aarch64
parm:           speed_mode:force phy operation. Deprecated by ethtool (8). (uint)
parm:           duplex_mode:force phy operation. Deprecated by ethtool (8). (uint)
parm:           autoneg_mode:force phy operation. Deprecated by ethtool (8). (uint)
parm:           advertising_mode:force phy operation. Deprecated by ethtool (8). (uint)
parm:           aspm:Enable ASPM. (int)
parm:           s5wol:Enable Shutdown Wake On Lan. (int)
parm:           s5_keep_curr_mac:Enable Shutdown Keep Current MAC Address. (int)
parm:           rx_copybreak:Copy breakpoint for copy-only-tiny-frames (int)
parm:           use_dac:Enable PCI DAC. Unsafe on 32 bit PCI slot. (int)
parm:           timer_count:Timer Interrupt Interval. (int)
parm:           eee_enable:Enable Energy Efficient Ethernet. (int)
parm:           hwoptimize:Enable HW optimization function. (ulong)
parm:           s0_magic_packet:Enable S0 Magic Packet. (int)
parm:           tx_no_close_enable:Enable TX No Close. (int)
parm:           enable_ptp_master_mode:Enable PTP Master Mode. (int)
parm:           disable_pm_support:Disable PM support. (int)
parm:           debug:Debug verbosity level (0=none, ..., 16=all) (int)

root@bb-nanopi-r5c:~# modinfo r8125
filename:       /lib/modules/6.1.25/updates/dkms/r8125.ko
version:        9.013.02-NAPI-RSS
license:        GPL
description:    Realtek r8125 Ethernet controller driver
author:         Realtek and the Linux r8125 crew &lt;netdev@vger.kernel.org>
srcversion:     9AFBE27E9C8C3201B0719DD
alias:          pci:v000010ECd00003000sv*sd*bc*sc*i*
alias:          pci:v000010ECd00008162sv*sd*bc*sc*i*
alias:          pci:v000010ECd00008125sv*sd*bc*sc*i*
depends:        
name:           r8125
vermagic:       6.1.25 SMP mod_unload modversions aarch64
parm:           speed_mode:force phy operation. Deprecated by ethtool (8). (uint)
parm:           duplex_mode:force phy operation. Deprecated by ethtool (8). (uint)
parm:           autoneg_mode:force phy operation. Deprecated by ethtool (8). (uint)
parm:           aspm:Enable ASPM. (int)
parm:           s5wol:Enable Shutdown Wake On Lan. (int)
parm:           s5_keep_curr_mac:Enable Shutdown Keep Current MAC Address. (int)
parm:           use_dac:Enable PCI DAC. Unsafe on 32 bit PCI slot. (int)
parm:           timer_count:Timer Interrupt Interval. (int)
parm:           eee_enable:Enable Energy Efficient Ethernet. (int)
parm:           hwoptimize:Enable HW optimization function. (ulong)
parm:           s0_magic_packet:Enable S0 Magic Packet. (int)
parm:           tx_no_close_enable:Enable TX No Close. (int)
parm:           enable_ptp_master_mode:Enable PTP Master Mode. (int)
parm:           disable_wol_support:Disable PM support. (int)
parm:           enable_double_vlan:Enable Double VLAN. (int)
parm:           debug:Debug verbosity level (0=none, ..., 16=all) (int)

缓冲区

xxx:~# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX:		1024
RX Mini:	n/a
RX Jumbo:	n/a
TX:		1024
Current hardware settings:
RX:		1024
RX Mini:	n/a
RX Jumbo:	n/a
TX:		1024
RX Buf Len:		n/a
CQE Size:		n/a
TX Push:	off
TCP data split:	n/a
root@bb-nanopi-r5c:~# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX:		1024
RX Mini:	n/a
RX Jumbo:	n/a
TX:		1024
Current hardware settings:
RX:		1024
RX Mini:	n/a
RX Jumbo:	n/a
TX:		1024
RX Buf Len:		n/a
CQE Size:		n/a
TX Push:	off
TCP data split:	n/a

队列

root@bb-nanopi-r5c:~# ethtool -l eth0
netlink error: Operation not supported
root@bb-nanopi-r5c:~# ethtool -l eth0
Channel parameters for eth0:
Pre-set maximums:
RX:		4
TX:		2
Other:		n/a
Combined:	n/a
Current hardware settings:
RX:		2
TX:		2
Other:		n/a
Combined:	n/a

常见问题

重启后发现驱动加载正常,但没有获取 IP 地址等

openmediavault 大坑

解决方法

使用 omv-firstaid 命令,或者 WEB 控制面板重新配置网络接口

构建时没有安装 dh-dkms

dh: error: unable to load addon dkms: Can't locate Debian/Debhelper/Sequence/dkms.pm in @INC (you may need to install the Debian::Debhelper::Sequence::dkms module)

解决方法

安装 dh-dkms

apt install dh-dkms

r8169驱动

参考

https://www.cnblogs.com/klzy/p/18266961

linux-headers 没有安装或者不匹配内核

参考

https://blog.im.ci/study-notes/linux-notes/1222

chevron_left
chevron_right

Leave a comment

您的邮箱地址不会被公开。 必填项已用 * 标注

Comment
Name
Email
Website