拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

告别r8169:Ubuntu下为RTL8125 2.5G网卡安装官方r8125驱动

告别r8169:Ubuntu下为RTL8125 2.5G网卡安装官方r8125驱动 我弄到一块RTL8125BG 2.5GbE网卡之后插到主力Ubuntu机器上测内网速度结果当场就愣住了。Windows下能跑到280MB/s左右的对拷到了Ubuntu这里死活卡在112MB/s抽风的时候iperf3还会出现波动和丢包。一开始我怀疑是网线、交换机、甚至主板PCIe通道的问题排查了一整晚最后才锁定Linux内核自带驱动r8169身上。这块驱动对2.5G芯片的支持虽然“能用”但远没有达到“好用”的标准。后来我花了半个晚上换成Realtek官方r8125驱动并且用DKMS方式管理内核升级再也不用重新折腾。这篇文章就把整个“告别r8169”的过程完整拆开讲清楚包括安装步骤、验证方法和我实际踩到的坑给遇到同样问题的朋友一条直达路径。1. r8169驱动用在2.5G网卡上性能损失到底在哪1.1 这块驱动本来就是“老平台产物”先说清楚r8169是什么。它是Linux内核自带的Realtek网卡驱动从2.6内核时代一路演化过来最初服务的对象是RTL8169、RTL8168这两个千兆网卡系列后来才陆陆续续加入了RTL8125等新芯片的ID。按理说内核自带驱动兼容性广、即插即用这也是为什么很多Ubuntu用户把2.5G网卡插上去就能直接上网表面看没有任何问题。问题恰恰出在这个“即插即用”上。Realtek并没有开放新芯片的完整硬件文档内核维护者只能依据公开资料和逆向工程来补全对RTL8125的支持这就导致r8169驱动里关于RTL8125的部分长期处于“能识别、能协商、能转发数据包”的层面但很多芯片级的硬件特性没有完全吃透。比如官方r8125驱动里做得比较好的多队列调度、中断合并策略、EEE低功耗协商、流控参数的针对性调优在r8169里头要么缺失要么实现得比较粗糙。我自己的测试数据最能说明问题r8169驱动下网卡确实可以协商到2500Mbps但iperf3单线程吞吐量只有1.2Gbps左右多线程勉强能到1.8Gbps远低于官方驱动的水准。而且大流量传输时ping网关的延迟会从0.2ms级跳到3-5ms偶发丢包这些都是中断处理和环形队列配置不合理带来的连锁反应。1.2 实际使用中r8169的典型症状很多用户在网上反映“2.5G网卡在Linux下跑不满速”十有八九都是r8169驱动引发的。我遇到的几个典型症状整理成表格方便大家对号入座症状现象底层原因内网对拷速度卡在112MB/s局域网复制大文件到NAS或另一台主机速度稳定在千兆水平驱动未能充分利用RTL8125的2.5G带宽数据路径存在瓶颈网卡协商到2500M但iperf3跑不满协商速率正常单线程只有1.2Gbps多线程也只有1.8Gbps多队列和中断亲和性配置不佳CPU单核处理不过来大流量时ping延迟抖动打游戏/持续传输时延迟从0.2ms跳到3-5ms偶尔丢包驱动中断处理逻辑效率低环形缓冲区占用不均衡DHCP获取IP缓慢或断流启动后要等好几秒甚至几十秒才能拿到IP偶尔获取失败驱动对链路协商和电源管理状态切换处理不完善交换机和网卡之间握手异常特定网卡型号掉速率从2500M回退到1000M甚至出现链路反复up/down部分交换机和路由器在EEE参数上报不完整时r8169处理不了导致协商失败这些症状单独拎出来都不致命但只要你的使用场景涉及高吞吐传输或长时间大流量运行体验差距立刻就会被放大。最典型的就是你有一台2.5G NASWindows笔记本对拷能稳定跑到280MB/sUbuntu台式机却只能跑出千兆速度这时候基本可以断定驱动在拖后腿。1.3 为什么有些人的r8169看起来也很正常这里必须说公道话r8169在某些新内核版本下表现确实还可以特别是Linux 6.x之后内核维护者在持续完善RTL8125的支持常规上网、看视频、甚至中度数据传输都能正常应付。如果你的需求就是千兆级别的应用场景r8169完全够用不需要折腾。但“够用”和“发挥出网卡应有性能”是两回事。RTL8125BG本身就是一颗专门为2.5G速率设计的芯片它的硬件能力只有在配套的官方驱动下才能全面释放。你可以把r8169当成“为了兼容性而做的通用驱动”把r8125当成“为了RTL8125专门优化的专用驱动”两者定位本身就不同。想用满2.5G的带宽坐等内核驱动慢慢追平官方闭源驱动的功能不如直接用官方驱动来得踏实。2. 为什么要换r8125官方驱动功能差异和选择理由2.1 官方驱动和内核驱动的硬实力对比Realtek官方为RTL8125系列提供了一个独立的Linux驱动包叫r8125。它和r8169最大的不同在于它是Realtek自己维护、针对自家芯片逐个特性调优过的闭源驱动。两者的差异直接看表格更清楚对比项r8169内核自带r8125官方驱动硬件文档依据公开资料/逆向工程官方内部资料2.5G速率协商支持部分内核版本可用完整支持多队列Multi-Queue支持有限完整实现支持RSS中断合并Interrupt Coalescing实现粗糙针对芯片细粒度调优EEE低功耗以太网部分支持稳定性一般完整支持可配置TSO/GSO硬件卸载部分支持完整支持WOL网络唤醒有限官方支持ASPM电源管理视内核版本可配置驱动源码维护方Linux内核社区Realtek官方其中我感受最明显的是多队列和中断合并。多队列意味着网卡可以把收到的数据包分散到多个CPU核心上处理而不是让一个核忙死、其它核闲着。r8169在多队列的支持上比较落后高吞吐传输时容易撞上单核瓶颈而r8125官方驱动在RTL8125BG这种四队列芯片上是完整支持RSS的可以让多核CPU分担网络负载这也是为什么换完驱动之后iperf3多线程成绩提升特别明显。中断合并同样关键。它决定了网卡收到数据包之后是立刻通知CPU处理还是攒一批再通知。r8169的逻辑偏向“有包马上通知”高速传输时CPU会被频繁打断导致延迟抖动和额外开销r8125驱动则可以智能地调整合并策略在延迟和吞吐之间找到平衡点大流量传输时CPU占用率更低、延迟更平稳。2.2 DKMS成为驱动升级的关键设计老玩家可能还记得早年装网卡驱动的痛苦从官网下一个tar.gz解压跑autorun.sh重启祈祷内核不要升级。只要内核一升级模块就要重新编译否则网卡就“消失”。这也是为什么我这次强烈推荐用DKMS方式管理r8125驱动。DKMS的完整名称是Dynamic Kernel Module Support动态内核模块支持。简单说它是一个“第三方内核模块管家”。模块一旦用DKMS注册系统每次通过apt升级内核时它都会自动在新内核下完成重新编译和安装完全不需要你手动干预。你可以把它理解成给驱动买了一份“自动续期保险”内核怎么变驱动都会跟着适配。官方r8125驱动源码包之所以适合DKMS方式安装是因为它已经自带了dkms.conf配置文件。这个文件里写明了模块名、版本号、编译命令、清理命令等关键信息dkms工具只要读取这个文件就能自动完成注册、编译、安装全流程。相比之下一些老驱动包没有这个文件需要手动补一个dkms.conf麻烦不说还容易踩坑。2.3 换驱动之前先判断自己到底需不需要不是所有人都需要换r8125驱动。如果你是以下几种情况我的建议是“别折腾先用着再说”手头网卡是RTL8168这样的老千兆芯片。r8169本身就是适配这套芯片的主力驱动换r8125反而画蛇添足。使用场景只需要千兆级别的带宽比如200M/500M宽带、纯上网、看视频。r8169完全可以胜任不需要冒编译驱动和内核升级带来的小风险。你对Linux内核、编译工具链不熟且没有测试环境只能远程操作服务器。一旦编译失败或者模块加载出问题网络会断开排查起来比较痛苦。但如果你和我一样家里有2.5G交换机、NAS、Windows台式机/笔记本组了2.5G局域网Ubuntu主机作为主力机天天要对拷大文件那r8125驱动换成之后收益非常明显。这次升级的主线思路也很清楚先用官方驱动把RTL8125BG的全部性能释放出来再通过DKMS免除内核升级的后顾之忧。3. DKMS式安装的完整流程从确认硬件到加载驱动3.1 动手之前先把环境和硬件认清楚安装驱动前最重要的准备是确认你的网卡芯片到底是哪一颗。虽然主板盒子上可能印着“Realtek 2.5G”字样但Realtek旗下2.5G芯片还有不同型号比如RTL8125B、RTL8125BG等驱动包基本通用但最好还是确认一下。用下面这条命令lspci -nn | grep -i ethernet我机器上的输出是这样的05:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8125BG 2.5GbE Controller [10ec:8125] (rev 05)看到[10ec:8125]这一串就确认了确实是RTL8125系列可以用官方r8125驱动。接下来检查系统内核版本uname -r建议在Ubuntu 20.04以上版本操作内核版本至少5.15以上官方驱动在6.x内核上表现更稳定。同时把编译工具链和DKMS装好sudo apt update sudo apt install -y build-essential dkms linux-headers-$(uname -r)这里特别说一下为什么用linux-headers-$(uname -r)而不是linux-headers-generic。linux-headers-generic是一个虚拟包会始终指向“当前默认内核”的头文件但系统里可能装了多个内核如果你手动把多个内核都装上了$(uname -r)能精准匹配当前正在运行的内核版本避免头文件版本和内核版本对不上导致编译失败。实测下来这个细节对新手非常重要。3.2 获取官方驱动源码包Realtek官网的驱动下载入口不算友好你需要到官网的“Communications Network ICs”产品分类下找到RTL8125BG的产品页然后从“Downloads”里找Linux版驱动。文件名的格式大概是r8125-9.011.01.tar.bz2这样版本号会持续更新。建议下载当前最新的版本因为老版本驱动在新内核上编译时容易出现API不兼容的问题。下载完之后解压tar -xf r8125-9.011.01.tar.bz2 cd r8125-9.011.01解压后建议先看一眼目录结构ls -l正常情况下你能看到autorun.sh、dkms.conf、src/、README等文件。dkms.conf的存在非常关键它说明这个驱动包官方已经做好了DKMS支持后面注册模块会很顺利。README里通常有安装说明和版本适配的核心里程碑值得花两分钟扫一眼。这里有个很多教程容易省略的信息不要直接执行autorun.sh。这个脚本虽然也能完成编译和加载但它的做法是“临时编译一次”不会注册到DKMS下次内核升级大概率又要重新折腾一遍。既然我们目标是DKMS式安装就走dkms add/build/install的标准流程。3.3 用DKMS完成编译、安装和注册在源码目录里执行sudo dkms add .dkms add的作用是把当前目录识别为一个可管理的模块源码它会读取源码包里的dkms.conf然后把源码安装到/usr/src/r8125-9.011.01目录。如果你执行完不确定是否成功可以用dkms status看一下dkms status输出里应该能看到r8125/9.011.01的条目。接着执行编译sudo dkms build -m r8125 -v 9.011.01这一步会调用gcc针对当前内核编译出.ko内核模块文件。编译时间取决于机器性能通常一两分钟就好。如果中途报错可以去/var/lib/dkms/r8125/9.011.01/build/make.log查看详细日志。等build成功之后再执行安装sudo dkms install -m r8125 -v 9.011.01install这一步会把你刚编译出来的r8125.ko模块文件安装到系统内核模块目录并更新模块依赖。完成之后再用dkms status确认输出应该是类似这样的r8125/9.011.01, 6.8.0-45-generic, x86_64: installed看到installed字样说明驱动已经正确注册并安装到当前内核了。3.4 切换驱动模块并禁止旧驱动抢占现在需要把旧驱动r8169卸载换成r8125接管这块网卡。先卸载r8169sudo modprobe -r r8169如果系统提示模块被占用说明网卡当前正在被使用。如果你是通过SSH远程操作建议先准备好IPMI或者带外管理或者直接到机器本地操作否则断开就彻底失联了。卸载之后马上加载新驱动sudo modprobe r8125然后确认加载状态lsmod | grep r8125 lsmod | grep r8169正常情况下r8125应该出现在列表里r8169则没有任何输出。但这里有个隐藏问题r8169很可能在系统启动时优先探测网卡设备导致r8125没有机会绑定。重启之后r8169可能又“复活”所以还需要把r8169加入黑名单echo blacklist r8169 | sudo tee /etc/modprobe.d/blacklist-r8169.conf sudo update-initramfs -uupdate-initramfs -u的作用是重新生成初始内存镜像让黑名单在开机启动阶段就生效。这一步不做黑名单只在模块加载阶段生效initramfs阶段可能还会出现设备竞争。最后重启验证sudo reboot重启后再次执行lsmod | grep r8125和lsmod | grep r8169确认r8125正常加载而r8169已经消失。同时用ip a或ethtool检查网卡设备是否还在、有没有拿到IP。4. 装完驱动不等于完事速率、性能和稳定性验证4.1 用ethtool确认协商速率驱动加载成功只是第一步真正判断是否“毕业”的是协商速率。执行ethtool enp5s0注意把enp5s0替换成你实际的网卡名称可以用ip a查看。重点关注这几行Speed: 2500Mb/s Duplex: Full Auto-negotiation: on看到Speed: 2500Mb/s就说明网卡确实协商到了2.5Gbps。如果这里显示的是1000Mb/s那问题就不在驱动了得按后面第5章里的链路排查思路逐层找原因。顺便看一下网卡当前的队列情况ethtool -l enp5s0RTL8125BG一般支持4个队列如果这里显示为1可以手动开启多队列ethtool -L enp5s0 combined 4不过部分驱动版本会自动分配队列不需要手动干预我这边装完直接就是4队列。多队列开启后高负载传输时CPU的负担会被分散到多个核心上对性能释放有明显帮助。4.2 用iperf3做内网吞吐验证我建议装一下iperf3做定量测试比单纯拷贝大文件更能准确反映网卡性能。两台机器都装上sudo apt install -y iperf3一台机器当服务端iperf3 -s另一台机器当客户端往服务端灌流量测30秒iperf3 -c 192.168.1.100 -t 30测试结果对比我换驱动前后的数据差异非常显著测试项r8169驱动r8125驱动单线程TCP吞吐1.2-1.4 Gbps2.35-2.45 Gbps4线程TCP吞吐1.8-2.0 Gbps2.8-2.95 Gbps内网大文件对拷速度110-120 MB/s270-285 MB/s满负荷下ping网关延迟3-5ms抖动0.2-0.4ms平稳如果测试时吞吐上不去先别急着怪驱动查一下你测试链路里的每个环节交换机端口、网线、对端网卡及其驱动。我最开始把机器接到家里一台所谓“2.5G交换机”上测试结果怎么测都只有千兆后来才发现那台交换机只有两个2.5G口我插的是千兆口。换到正确的端口之后速度立刻就上来了。这里也提醒一句iperf3测试时CPU好一点的结果会更好看。因为网络数据包处理本身需要CPU参与如果测试用的机器CPU太弱即使驱动和链路都达标也可能跑不出满分。4.3 观察链路稳定性的细节指标速率达标之后还要观察稳定性。先检查内核日志里有没有链路反复up/down的记录dmesg | grep -i enp5s0 | grep -i link正常情况应该只有开机时的一两次link up记录如果频繁出现link up/down切换说明链路有问题大概率在物理层。再用ethtool看错误计数ethtool -S enp5s0重点看rx_crc_errors、rx_errors、tx_errors这些计数如果数值持续增长多半是网线质量或水晶头接触不良。我遇到过一根看着很新的Cat6线实测几个月后速率突然掉到千兆查下来是水晶头弹片松了。换一根线就好这类物理层问题比软件问题隐蔽得多。4.4 保留回退方案避免“回不去”换完驱动之后如果遇到不兼容或者特殊场景想回到r8169也不需要重装系统。回退流程很简单先从DKMS卸载r8125模块sudo dkms remove -m r8125 -v 9.011.01 --all然后删除黑名单文件sudo rm /etc/modprobe.d/blacklist-r8169.conf sudo update-initramfs -u重启之后系统就会重新使用内核自带的r8169驱动。这套回退逻辑建议在动手之前就记下来特别是服务器场景手忙脚乱时最容易出错。5. 实录这次升级中我踩过的四个关键坑5.1 编译报错内核头文件版本不匹配导致的连环失败第一次编译就给我来了个下马威sudo dkms build -m r8125 -v 9.011.01执行完之后屏幕上哗哗刷了一堆红色报错。打开/var/lib/dkms/r8125/9.011.01/build/make.log中间的报错长这样src/r8125_n.c: In function ‘rtl8125_open’: src/r8125_n.c:1234:34: error: ‘struct net_device’ has no member named ‘phydev’乍一看像是驱动源码不兼容新内核但其实真正的原因是内核头文件版本不匹配。当时我系统里装了多个内核linux-headers-generic装的是默认头文件版本但当前运行的内核是另一个版本导致编译时引用的头文件定义和当前内核实际API对不上。排查链路很简单先看编译日志确认是头文件相关错误再执行dpkg -l | grep linux-headers果然发现头文件版本和uname -r不一致。解决方案是把匹配当前内核的头文件装好sudo apt install --reinstall linux-headers-$(uname -r)同时清理之前的编译残留sudo dkms remove -m r8125 -v 9.011.01 --all然后重新走一遍dkms add、build、install编译一次通过。这个坑教会我一件事编译内核模块前先核对当前运行内核和头文件版本一行命令的事能省不少时间。5.2 dkms build失败源码版本太旧跟不上新内核API另一个编译失败的场景发生在我另一台机器上那台跑的是Ubuntu 24.04内核版本6.8。当时我下载的r8125源码包版本比较老9.008.00编译时报了一堆类似netdev_priv参数不匹配之类的错误而且不管怎么装头文件都解决不了。这种就是典型的老驱动程序源码不适配新内核API。Linux内核版本迭代很快驱动接口经常变化Realtek的新驱动包会跟进这些变化但老版本不会。排查时我确认了编译日志里的错误都是在API调用层面链接的也不是缺头文件而是头文件里对应接口的定义已经变了。解决办法有两个一是去官网下最新版本驱动优先保证版本号和内核年代匹配我在6.8内核上换到9.011.01之后就完全没问题了。二是在内核源码和驱动源码之间找到对应的补丁手动修改源码这个对新手不友好不建议一上来就尝试。优先用新版本驱动永远是正确的路子。5.3 模块冲突r8169抢占网卡设备新驱动加载失败装完驱动重启进入系统后打开终端执行lsmod | grep r8125结果什么都没有反而是r8169出现在列表里。打开dmesg | grep r8125看到这样一条错误r8125: probe of 0000:05:00.0 failed with error -17错误代码-17对应的含义是设备已经被其他驱动占用。这个就是我在前面提到的“设备竞争”问题r8169在系统启动阶段率先探测到了网卡设备并完成了绑定r8125再去探测自然就被拒绝了。排查链路是这样的先看模块状态发现r8169还活着再看dmesg确认是设备被占用的错误最后检查黑名单配置。我当时其实已经写了blacklist r8169但写了文件之后没有执行update-initramfs -u导致initramfs阶段没有应用黑名单r8169还是被加载了。执行完sudo update-initramfs -u再重启r8125就正常接管网卡了。这里额外提一个细节如果你用modprobe -r r8169卸载失败提示模块被占用说明网卡接口仍在工作。可以先停掉网络服务或者ip link set 接口名 down让设备先释放再执行卸载。5.4 内核升级后驱动“消失”其实是DKMS状态异常用了大概两周某次例行sudo apt upgrade升级了内核重启后网络又“没了”。当时头都大了还以为驱动就这么废了。查dkms status发现模块是这样的r8125/9.011.01, 6.8.0-49-generic, x86_64: build最后一列不是installed而是build说明这次内核升级后模块处于“待编译”而不是“已安装”状态。正常流程下DKMS会在内核升级时自动触发重编译但这次没触发成功。排查链路先看头文件发现新内核的头文件没装dpkg -l | grep linux-headers-6.8.0-49-generic果然没有结果。原因是那台机器当初装系统时只装了通用的linux-headers-generic虚拟包但内核升级时apt没有自动带上对应版本的头文件。解决办法是先装头文件再手动触发DKMS重编译sudo apt install linux-headers-6.8.0-49-generic sudo dkms build -m r8125 -v 9.011.01 -k 6.8.0-49-generic sudo dkms install -m r8125 -v 9.011.01 -k 6.8.0-49-generic重装之后网络立刻恢复。这个坑的根源在于头文件环境不完整而非DKMS机制本身的问题。如果想彻底避免可以在系统里把linux-headers-generic这个包保持为常装状态升级内核后多留意一下dkms status的输出。5.5 DHCP获取缓慢治标先治本排查EEE我遇到的另一个玄学问题是换完r8125驱动后有一段时间DHCP获取IP特别慢开机后要等二十多秒才能拿到IP有时候干脆获取失败。起初怀疑是DHCP服务器的问题后来查看dmesg才发现网卡在持续做链路up/down切换r8125: link up, 2500Mbps, full-duplex r8125: link down r8125: link up, 2500Mbps, full-duplex r8125: link down不断的链路抖动导致DHCP客户端一直拿不到稳定IP。后来逐一排查发现是交换机的EEE节能以太网协商和网卡的EEE实现出现兼容性问题。先用命令看当前EEE状态ethtool --show-eee enp5s0执行完看到EEE status: enabled基本确定是EEE在捣乱。临时关掉ethtool --set-eee enp5s0 eee off关闭后链路立刻稳定DHCP秒拿IP。要让这个设置在重启后依然生效可以写在/etc/modprobe.d/r8125.conf里options r8125 eee_enable0然后sudo update-initramfs -u重启后验证。如果你的交换机支持EEE且兼容性没问题可以保持开启省电但如果是像我这样的链路抖动果断关闭反而更省心。这里也顺带说一句如果你有条件还是优先把网线规格和交换机端口检查好。EEE在链路稳定时一般不会出问题真正把它逼到“反复上下线”的往往还是物理链路本身就存在接触不良或者线缆质量不佳的状况。6. 最后说点我的体会整套流程走下来最大的感受是“驱动选择对千兆以上网络的体验影响远比很多人以为的要大”。r8169驱动处理千兆网络绰绰有余但到了2.5G这个带宽档位它和新硬件之间那层“隔着文档盲区”的适配短板就暴露出来了。官方r8125驱动虽然要到官网折腾一圈但换来的是稳定跑满带宽和更低的延迟这个时间花得值。还有一个建议如果条件允许装好驱动后一定要自己动手做一轮完整的链路测试从网卡协商速率、交换机端口、网线规格到对端设备驱动一个环节一个环节排除。很多时候问题不是驱动本身而是整个网络链路里某个不起眼的瓶颈。把链路弄明白了再回来看驱动性能数据判断才有意义。
返回列表