我的环境
设备:NanoPi R5C
Linux发行版:openmediavault 7.4.10-1(在 Debian 12 上使用脚本构建)(有大坑,在最后面说)
网卡:RTL8125BG
我直接在 root 用户下操作
折腾目标
虽然没有需要处理大量并发连接的需求,但是重在折腾
- 使用新版本的 r8125 驱动
- 每次更新内核之后,自动重新生成对应的内核驱动模块
- 开启网卡的 Multiple Tx Queue 多队列发送 功能
- 开启网卡的 Receive-Side Scaling (RSS) 多队列接收 功能
- 关闭网卡的 Active-state power management (ASPM) 活动状态电源管理 功能
- 关闭网卡的 Energy Efficient Ethernet (EEE) 节能以太网 功能
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 <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 没有安装或者不匹配内核
参考