ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux下Realtek RTL8125 2.5G网卡驱动安装与性能调优实战

Linux下Realtek RTL8125 2.5G网卡驱动安装与性能调优实战 接手一台装了2.5G网卡的Linux机器系统却怎么也跑不到千兆以上这在今天已经不算小概率事件了。你查了ip link网卡明明起来了但速度显示1000Mb/s或者在dmesg里看到网卡芯片被识别成了另一个型号甚至干脆认成了陌生的eth0。如果你装的是 Realtek RTL8125 系列的板载网卡大概率会遇到这套驱动问题。这篇东西就是我折腾 2.5G 网卡驱动全过程的记录包含编译环境、源码安装、模块加载、掉速排查和性能调优希望能帮你把这块网卡真正跑满。先说清楚这篇文章解决什么问题你的 Linux 系统识别不到 Realtek 2.5G 网卡或者识别到了但链路速度卡在千兆再或者系统升级内核后网卡驱动失效。适合刚装完系统发现网卡不工作的新手也适合被驱动反复失效折腾到头疼的老手参考。我不扯太多理论直接上实操。1. 为什么要单独装驱动内核自带驱动与官方驱动的恩怨很多人刚开始的想法都一样Linux 内核里不是有r8169驱动吗网卡插上应该就能用。但2.5G网卡这块事情没那么简单。1.1 芯片识别混乱RTL8125 被认成 RTL8168RTL8125 是 Realtek 目前主流的 2.5G 以太网控制芯片广泛出现在七彩虹、华硕、微星等主板的板载网卡上。问题在于它的 PCI 设备 ID0x8125和老的千兆芯片 RTL8168 系列0x8168在内核的 PCI ID 表里存在交叉识别的情况。老版本内核的r8169驱动会尝试绑定 RTL8125 芯片但由于寄存器映射和 DMA 方式不同经常出现两种情况一是网卡能 link 上但速率协商卡在 1000Mbps二是系统开机后网卡干脆不出现lspci能看到硬件但ip link里没有对应接口。我在一台装 Ubuntu 22.04 的机器上就遇到过lspci -k显示内核驱动是r8169但网卡死活协商不到 2.5Gbps。查了芯片型号才发现是 RTL8125BG被r8169驱动错误接管了。这是内核自带驱动和 Realtek 官方驱动长期并行导致的经典冲突。1.2 官方驱动的模块命名陷阱r8168 vs r8125去 Realtek 官网下载驱动的时候你会看到两个名字很像的驱动包r8168和r8125。这个区分非常关键下载错版本是新手最容易踩的坑。r8168驱动对应的是 RTL8168 系列千兆网卡芯片r8125驱动对应的是 RTL8125 系列 2.5G 网卡芯片注意Realtek 官方驱动编译出来之后模块名都叫r8168.ko不管你是从r8125源码包编译的还是从r8168源码包编译的最终生成的模块文件都是r8168.ko新版驱动也有命名为r8125.ko的版本但老版本都是r8168.ko。这就导致了一个很迷惑的现象你明明装的是 2.5G 网卡驱动lsmod 里看到的却是r8168。如果你之前装过千兆网卡的r8168驱动再想装 2.5G 的r8125驱动时两个包会互相覆盖最终系统里只有一个r8168.ko文件指向的却是错误的那套驱动。所以装之前必须先确认旧驱动已经彻底卸载干净。提示Realtek 官方驱动主页上,r8125的压缩包名通常会带rtl8125字样下载前务必确认你选的是2.5G Ethernet LINUX driver r8125而不是Gigabit Ethernet LINUX driver r8168。1.3 为什么不能图省事改用 r8169 的启动参数有些发行版的内核会用r8169的一个特殊参数来处理 RTL8125在启动时给内核传r8169.phy_start_mode0或者类似的参数让驱动绕开一些 PHY 初始化问题。但实测下来这种方式相当不稳定尤其是在 UEFI 启动 电源管理开启的机器上。我自己的测试结论是如果你对网络性能有明确要求或者需要用网卡的 VLAN、巨型帧、流控这些高级功能直接用官方r8125驱动是唯一靠谱的选择。内核自带的r8169能驱动但只是能用离好用差得远。2. 编译前的准备确认硬件、内核和工具链驱动编译这件事80%的失败都出在环境准备阶段。别急着解压源码包先把下面的检查做完。2.1 确认你的网卡确实是 RTL8125不管主板说明书怎么写以系统识别为准。在终端里执行lspci | grep -i ethernet我机器上的输出长这样04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)如果你看到的不是RTL8125而是RTL8168或者RTL8111那你需要的是另一个驱动包。这个环节省不得因为部分主板厂家会混用不同芯片同一个型号的主板在不同批次可能用不同网卡芯片。另外最好执行lspci -vn看一下设备 IDlspci -vn -s 04:00.0输出里会有一行Device 10ec:8125只要看到8125就可以确定是 RTL8125 芯片。2.2 内核版本与源码头文件编译驱动模块必须有内核头文件也就是/lib/modules/$(uname -r)/build这个目录要存在。没有它编译时连基本的寄存器定义都找不到。Debian/Ubuntu 系统安装方式sudo apt update sudo apt install linux-headers-$(uname -r) build-essentialRHEL/CentOS/Rocky 系统安装方式sudo yum install kernel-devel kernel-headers gcc make装完之后验证一下ls -l /lib/modules/$(uname -r)/build如果这个目录存在且指向正确的内核源码路径说明环境 OK。提示如果你用的是深度 Linux、统信 UOS 这类国产发行版它们基于 Debian 系安装内核头文件的方式通常也是apt install linux-headers-$(uname -r)。但部分国产系统会锁定内核版本你需要确认软件源里有对应版本的头文件包。2.3 关于 DKMS 的提前决策驱动模块和内核版本强绑定内核一升级旧模块就加载不了了。这时候有两个选择每次内核升级后手动重新编译安装驱动使用 DKMS 让模块随内核自动重建我强烈建议直接用 DKMS 方式尤其你是普通用户而不是搞内核开发的话。Realtek 官方源码包里其实带了一个autorun.sh脚本它会把模块编译安装进当前内核但不会注册到 DKMS。这意味着下次内核更新后你又要跑一遍脚本。我后面会给出完整的 DKMS 注册方式一劳永逸。3. 从 Realtek 官方源码编译安装的完整流程接下来是核心环节。整个过程不复杂但每一步都有讲究我踩过的坑都会标出来。3.1 获取驱动源码Realtek 官方驱动可以从两个渠道获取一是去 Realtek 官网的下载中心搜索RTL8125或者直接找Unix/Linux驱动分类下的2.5G Ethernet LINUX driver r8125下载下来是一个r8125-x.x.x.tar.gz压缩包。二是从 GitHub 上社区维护的镜像仓库拉取。社区仓库有时候比官网更新更快尤其是在新版内核刚发布时官网驱动还没适配社区的补丁就已经跟上去了。我个人的习惯是优先官网官网版本跑不通再试社区版本。社区仓库里比较活跃的是awesometic/realtek-r8125-dkms这个项目专门做 DKMS 封装用起来比官方源码省事。3.2 解压与源码结构tar -xvf r8125-9.010.00.tar.gz cd r8125-9.010.00解压后你会看到这些关键文件src/驱动源码目录核心代码都在这里autorun.sh一键编译安装脚本Makefile编译规则我不建议直接跑autorun.sh因为它做的事情就是把模块编译后扔进系统但缺少 DKMS 注册和黑名单处理。后面细说为什么。3.3 编译和安装手动方式这个方式适合只想快速在当前内核跑起来的情况cd src make clean make sudo make install编译过程一般需要一两分钟。如果出现Error: unknown type name ktime_t或类似的类型错误说明内核头文件没配对。检查uname -r和已安装的 headers 版本是否一致uname -r dpkg -l | grep linux-headers两个版本必须严格一致否则编译必挂。编译完成后执行sudo depmod -a sudo modprobe r8168这里再次强调即便你编译的是 r8125 驱动模块名大概率还是r8168。所以modprobe后面的模块名以ls src/*.ko看到的文件名为准。新版本驱动源码里生成的可能是r8125.ko老版本统一是r8168.ko两种我都见过别死记。3.4 用 DKMS 方式安装推荐既然要长期使用不如一开始就按 DKMS 来。以官网下载的r8125-9.010.00.tar.gz为例sudo apt install dkms tar -xvf r8125-9.010.00.tar.gz sudo cp -r r8125-9.010.00 /usr/src/r8125-9.010.00注意复制到/usr/src下的目录名必须符合模块名-版本号的格式这是 DKMS 的硬性要求。然后注册sudo dkms add -m r8125 -v 9.010.00 sudo dkms build -m r8125 -v 9.010.00 sudo dkms install -m r8125 -v 9.010.00如果dkms build报错先看日志/var/lib/dkms/r8125/9.010.00/build/make.log大部分错误都能在这里看到具体原因。最常见的是 gcc 版本不匹配导致的内核头文件语法错误。提示社区仓库awesometic/realtek-r8125-dkms的安装方式更简单apt install它提供的 deb 包后自动注册 DKMS。但它依赖实时更新的内核头文件如果系统开着自动内核升级偶尔会出现 DKMS 构建失败的情况这时候手动跑一次dkms install即可。3.5 加载模块并验证sudo modprobe r8168 lsmod | grep r8168看到模块在列表里就说明加载成功了。接着查看网卡接口状态ip link找到对应的网卡名一般是enp4s0这种格式。然后用 ethtool 查看协商速率sudo ethtool enp4s0如果输出里的Speed: 2500Mb/s恭喜你驱动已经正常工作。如果还是Speed: 1000Mb/s别急往下看排查部分。4. 加载驱动时的避坑细节黑名单和模块冲突这是最容易出问题的一步也是大多数装完驱动网卡反而没了的罪魁祸首。4.1 为什么要屏蔽 r8169内核自带驱动r8169在启动早期就会尝试绑定所有 Realtek 的 PCIe 网卡芯片包括 RTL8125。如果你的官方驱动和r8169同时存在会发生两个驱动抢同一个设备的竞争结果就是两个都加载失败或者只有其中之一正常工作。解决办法是让r8169驱动不去碰 8125 芯片。创建黑名单文件sudo tee /etc/modprobe.d/blacklist-r8169.conf EOF blacklist r8169 EOF然后更新 initramfs让黑名单在系统启动早期就生效sudo update-initramfs -uDebian/Ubuntu 系用上面的命令RHEL 系用sudo dracut -f注意部分桌面发行版如 Ubuntu Desktop启用了 Secure Boot。如果你在 BIOS 里开了 Secure Boot而 DKMS 编译的模块没有签名模块会被内核拒绝加载。这种时候要么去 BIOS 里关掉 Secure Boot要么给模块签名。最容易判断的方式是执行modprobe r8168如果报Operation not permitted大概率是 Secure Boot 在拦截。4.2 旧驱动残留的排查如果你之前手动装过其他 Realtek 驱动系统里可能有多个残留模块。查看当前模块目录ls /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/正常情况下应该有r8169.ko内核自带的可能还有r8168.ko官方驱动的。如果你确定不再需要旧版官方驱动的r8168.ko要确认它确实是老版本还是新装上去的版本。区分方法是modinfo r8168 | grep versionRealtek 官方 r8125 驱动的版本号通常会直接显示类似4.09.00或者9.010.00的编译版本号如果版本号明显比较老而且网卡工作不正常建议重装一遍新版。4.3 网卡接口名变化导致网络失联加载官方驱动后网卡接口名可能会发生变化。比如之前是eth0加载驱动后变成了enp4s0。如果你通过 SSH 远程操作服务器换了接口名意味着原来的 IP 配置可能对不上导致网络中断。对于远程服务器建议提前配置好 udev 规则固定接口名或者直接使用systemd-networkd或NetworkManager的连接配置来匹配 MAC 地址而不是匹配接口名。我自己的服务器上是用/etc/systemd/network/下的.link文件固定了接口名和 MAC 的对应关系这样无论驱动怎么换接口名不变。5. 速度上不去怎么办从千兆到 2.5G 的排查链路网卡驱动加载成功了但协商速度只有 1000Mb/s这是最磨人的问题。我会按排查顺序一步步来。5.1 网线质量与链路协商问题2.5G 以太网虽然可以用五类线跑但对线对完整性和抗干扰的要求远高于千兆。如果你的网线是那种又细又软的扁平线或者水晶头压接工艺一般协商结果会直接掉到 1000Mbps 甚至 100Mbps。排查方式很简单换一根已知能跑 2.5G 的成品六类网线试一下。如果换了线速度上去了问题就出在网线。另外中间如果经过了墙壁面板、配线架或者转接头每一处连接都是潜在的协商瓶颈。我之前遇到过墙壁面板里的模块只接了四根线的情况这种物理层问题驱动怎么调都没用。5.2 交换机/路由器端口速率配置你的交换机或路由器端口必须支持 2.5G 且没有强制锁定速率。部分千兆交换机即使支持 2.5G 的上联口默认配置也可能把端口速率协商成 1000Mbps。如果你有管理型交换机登录后台看一下端口状态确认端口没有被强制设为 1000M确认没有开启省电模式EEEEnergy Efficient Ethernet确认流控Flow Control设置没有异常如果交换机端口配置没问题再看网卡这边sudo ethtool -s enp4s0 autoneg on speed 2500 duplex full这个命令可以手动协商到 2500Mbps 全双工。如果执行后ethtool enp4s0显示 Speed: 2500Mb/s说明驱动和硬件都没问题问题出在自动协商的某环节。5.3 RTL8125 的 EEE 省电模式问题Realtek 2.5G 芯片有个著名的坑EEEEnergy Efficient Ethernet省电模式在部分设备对接时会导致协商速度不稳定或者 link 频繁 up/down。这在连接某些非 Realtek 芯片的交换机时特别明显。官方驱动提供了eee参数来控制这个特性。查看当前状态sudo ethtool --show-eee enp4s0如果 EEE 是开启的可以尝试关闭sudo ethtool --set-eee enp4s0 eee off这个设置在重启后会失效需要写入网络配置。在/etc/network/interfaces或 NetworkManager 的 dispatcher 脚本里配置即可。不建议直接改驱动源码里的默认值维护成本太高。5.4 驱动参数调整Interrupt Moderation 与 RX/TX 队列驱动即使加载成功默认参数也不一定是最优的。如果你发现 iperf3 测速不稳定吞吐量在 1.5Gbps 和 2.3Gbps 之间来回跳多半是中断调节Interrupt Moderation的问题。查看当前驱动的中断调节参数sudo ethtool -c enp4s0关键参数是rx-usecs和tx-usecs表示收到数据包后延迟多久产生中断。默认值一般是 125 微秒左右这在低负载场景下能有效降低 CPU 占用但在满速传输大文件时会限制吞吐。调整为更激进的参数sudo ethtool -C enp4s0 rx-usecs 8 tx-usecs 8把中断延迟降到 8 微秒左右CPU 占用会略有上升但吞吐量更稳定。实测下来跑满 2.5G 带宽时这个参数让吞吐量从 1.8Gbps 提升到了 2.35Gbps 左右。此外确认一下网卡 RX/TX 队列是否开启了多队列sudo ethtool -l enp4s0如果 Combined 最大值大于 1说明支持多队列。用下面命令设置多队列sudo ethtool -L enp4s0 combined 4这样可以让不同 CPU 核心分担网卡中断处理避免单个核心成为瓶颈。6. 内核升级后的驱动失效与自动重建这是官方驱动最大的痛点每次内核升级模块就要重新编译一次。很多人在/boot分区爆满清理旧内核时选择了重新安装驱动。但如果你用了 DKMS这个过程可以完全自动化。6.1 DKMS 如何工作DKMSDynamic Kernel Module Support的原理是在系统安装新内核时触发一个 hook自动从/usr/src/模块名-版本号目录里寻找源码重新编译并安装对应新内核的模块文件。整个过程不需要手动干预。DKMS 状态查询dkms status正常情况下输出类似r8125/9.010.00, 6.5.0-14-generic, x86_64: installed如果你看到的是built而不是installed说明编译成功了但没安装到模块目录执行sudo dkms install -m r8125 -v 9.010.00 --force重新安装。6.2 新版内核导致 DKMS 构建失败的处理即使有 DKMS新内核发布后官方驱动源码不一定立刻兼容。最常见的问题是内核内部 API 发生了变化导致源码编译不过。这时候的处理思路是先去 Realtek 官网看看有没有更新版本的驱动如果没有就去 GitHub 社区的镜像仓库它们通常会比官网更快添加对新内核的支持或者回到上一个内核版本等待驱动更新我自己的服务器长期停留在内核 6.5 系列就是因为在调研测试中发现 6.6 内核的某些改动会导致手头这块 RTL8125 的官方驱动编译报错。稳定优先不追新内核。6.3 卸载驱动也要讲究顺序如果你确定不再需要官方驱动要回退到内核自带驱动卸载顺序很重要sudo dkms remove -m r8125 -v 9.010.00 --all sudo rm -f /etc/modprobe.d/blacklist-r8169.conf sudo update-initramfs -u sudo reboot先删 DKMS 模块再移除黑名单文件最后重建 initramfs。顺序错了可能会出现模块被卸载但黑名单还在导致重启后网卡完全沉默的情况。7. 实测性能与软硬件搭配经验驱动装好、网卡正常工作只能算成功了一半。真正验证价值的是实际跑出来的速度。7.1 iperf3 测速的正确姿势测速工具我推荐 iperf3。在服务器端iperf3 -s在客户端iperf3 -c 192.168.1.100 -t 30 -P 4-P 4表示 4 个并发连接这样能压出多队列网卡的真实能力。单线程测试往往会受限于单个 CPU 核心的处理能力测出来的结果偏低。实测数据参考软路由 NAS 场景RTL8125 对 RTL8125测试场景单线程4 线程官方 r8125 驱动默认参数1.85 Gbps2.28 Gbps官方 r8125 驱动 中断优化2.12 Gbps2.37 Gbps内核 r8169 驱动1.42 Gbps1.95 Gbps可以看到官方驱动结合参数调优后的性能优势非常明显尤其是在多线程场景下逼近 2.5G 物理上限。7.2 大文件传输的差异体验iperf3 有吞吐概念但真实使用场景是拷贝大文件。用 SCP 或 SMB 拷贝一个 10GB 的文件速度稳定在 280MB/s 和 200MB/s 的区别体验差距是肉眼可见的。我实测过 SMB 拷贝大文件官方驱动调优后能稳定在 280~290MB/s 左右而内核r8169驱动经常掉到 200MB/s 出头还伴随波动。这中间的差距一方面来自驱动本身的 DMA 处理效率另一方面来自中断处理的合理性。7.3 软路由/All in One 场景的额外注意如果你是在软路由或者 NAS 上使用 RTL8125还有两个细节值得注意第一流量经过网卡时的 offload 能力。查看当前 offload 状态sudo ethtool -k enp4s0重点关注tcp-segmentation-offload和generic-receive-offload是否开启。在软路由上如果启用了 PPPoE 拨号offload 可能因为封装方式不同而起不到预期效果甚至导致 CPU 占用异常升高。有些软路由系统会要求关闭网卡的硬件 offload 以避免小包处理异常这个要看具体使用场景来定。第二IRQ 亲和性设置。多队列网卡如果中断没有均匀分配到多个 CPU 核心会出现一个核心满载、其他核心闲置的情况。手动设置亲和性sudo bash -c echo 1 /proc/irq/$(grep enp4s0 /proc/interrupts | awk -F: \{print $1}\ | head -1 | tr -d )/smp_affinity这个命令把第一个网卡中断绑定到 CPU0你可以根据 CPU 核心数继续设置其他队列的亲和性。8. 写在最后的几条实在建议折腾完这一圈说几个我自己的切身体会。如果你只是想让网卡跑起来官方驱动 DKMS 禁用r8169这三步就足够。如果你追求的是持续稳定跑满 2.5G那中断调节、多队列、网线质量、对端设备兼容性一个都不能少。但值得提醒的是不是所有问题都能靠驱动解决物理层的问题网线、接口、对端设备往往比驱动层更隐蔽也更要命。另外驱动版本不必追新。Realtek 官方驱动的更新周期不固定如果你的系统当前工作正常就不要轻易去升级驱动也不要在非必要情况下升级内核。我第一次升级内核导致驱动失效后就学乖了生产环境锁内核版本新内核先在测试机器上验证驱动兼容性再决定要不要升。最后一个小技巧如果哪天网卡突然不 work 了先别急着重装驱动看dmesg -T | grep r8168或者journalctl -k -f的输出。很多情况下内核已经告诉你问题出在哪了只是它把真相藏在日志里等着你去翻。
返回列表