
先说结论如果你手头有一块2.5G网卡插到Linux机器上发现系统不识别、网卡灯不亮、或者速率一直在1000M/100M徘徊那大概率不是硬件坏了而是驱动没弄对。这两年2.5G网卡几乎成了主板的标配尤其是瑞昱RTL8125这颗芯片出货量极大但在Linux下的驱动体验真的可以用“一言难尽”来形容。我自己前后在Ubuntu、Debian、Rocky Linux上折腾过好几轮踩了不少坑也把编译、模块加载、速率协商、掉速断流这些问题都过了一遍。这篇文章就专门来聊Linux下2.5G网卡驱动问题核心目标是RTL8125顺便把通用排查思路也讲清楚。这篇文章适合几类人刚装好Linux发现网卡没驱动的萌新主板上板载2.5G网卡但系统识别不出来的用户以及买了PCIe转2.5G网卡想在NAS或小主机上用的折腾党。内容会覆盖芯片识别、内核自带驱动判断、官方驱动编译安装、DKMS管理、Secure Boot签名以及各种“网卡不亮灯”“协商速率不对”“网速跑不满”的经典问题。只要跟着操作下来绝大多数2.5G网卡都能稳定跑起来。1. 先搞清楚你的2.5G网卡到底是谁家的芯片1.1 为什么人人都在骂“2.5G网卡Linux驱动难搞”2.5G网卡在Windows下基本是装完系统就能用厂商的驱动也是打包好的双击安装就完事。但Linux下完全是另一个世界有的发行版内核版本高自动就把驱动拉起来了有的内核版本刚好卡在某个边界识别到了但速率不对还有的干脆完全认不出来lsusb和lspci里能看到设备但系统里就是没有网卡接口。原因在于2.5G网卡的市场长期被瑞昱Realtek、英特尔Intel、美满Marvell这几家瓜分而Linux内核自带的驱动对它们的支持成熟度参差不齐。最典型的就是瑞昱RTL8125系列。这颗芯片在2.5G网卡里的市场占有率非常高很多主板上印着“2.5G LAN”或者“2.5Gbps Ethernet”拆开看芯片丝印就是RTL8125BG、RTL8125B等。内核里的r8169驱动从5.9版本开始加入了对RTL8125的初步支持但实际用起来就会发现不同内核版本、不同网卡批次、不同主板设计下r8169的表现极不稳定。有人升级内核后网卡从能用变成不能用也有人从内核5.4升到5.15之后才第一次识别出网卡。所以网上骂“螃蟹卡Linux驱动渣”的声音一直没断过。我自己碰到过一个很典型的情况一块RTL8125BG板载网卡在Ubuntu 20.04内核5.4下完全不识别升级到Ubuntu 22.04内核5.15后用r8169驱动能识别但协商速率只有1000M怎么折腾都上不了2500M。后来换成瑞昱官方r8125驱动才在ethtool里看到2500Mb/s。这个经历让我养成了一个习惯遇到2.5G网卡问题第一步永远是确认芯片型号第二步才是决定用哪个驱动。1.2 锁定芯片型号lspci / dmesg 的现学现用很多人拿到一台Linux机器压根不知道自己的网卡是什么芯片就开始盲查驱动。这其实是走弯路。在Linux下确认网卡芯片只需要两个命令。lspci | grep -i ethernet lspci -vvv -s 04:00.0 | grep -i Subsystem\|LnkCap\|LnkSta第一条命令会列出所有以太网控制器一般输出类似这样04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)看到Realtek和RTL8125就明确是瑞昱的芯片。如果输出的是Intel Corporation Ethernet Controller I225-V或者I226-V那就是英特尔的方案驱动思路完全不一样。如果输出的是“Ethernet controller: Aquantia Corp.”之类那就是Marvell AQtion方案又是另一套玩法。总之先把芯片认准。dmesg也是一个关键的信息来源尤其是网卡完全不被识别的时候dmesg | grep -i eth\|r8169\|r8125\|realtek如果内核已经尝试加载驱动但失败这条命令会输出明确的报错信息比如“unknown chip”或者“no suitable driver found”。这些信息就是后续排查的钥匙。另外用lsmod | grep r8169和lsmod | grep r8125看驱动模块有没有被加载也是常规操作。需要补充一个点即使芯片一样不同厂商的板卡设计比如用了不同的PHY芯片做桥接、板上有没有额外的供电管理也会让驱动表现不一样。这也是为什么有些人在同一颗芯片上内核自带驱动能用你复制过来却不行。下面这张表可以帮你快速对号入座芯片方案常见型号内核自带驱动官方驱动备注瑞昱RTL8125BG / RTL8125Br81695.9r8125本文重点英特尔I225-V / I226-Vigc5.x 自带e1000e系列相对省心MarvellAQC113 / AQC107atlantic5.xaquantia官方少见跑万兆为主2. 方案选型内核自带驱动 vs 官方驱动怎么选2.1 你的内核其实已经偷偷支持了rtl8125很多新手不知道的是Linux内核从5.9版本开始r8169驱动就加入了RTL8125的支持。这意味着如果你用的是Ubuntu 22.04、Debian 12、Rocky Linux 9这类发行版装完系统后网卡很可能直接就能用根本不用编译什么官方驱动。判断方法也很简单看模块信息modinfo r8169 | grep -i 8125\|version输出里如果包含RTL8125字样说明当前内核自带的驱动理论上认这颗芯片。接着用ip link看有没有类似enp4s0这样的接口有的话说明驱动其实已经加载了。既然内核有驱动为什么还要纠结官方r8125这里要先明白一个底层逻辑RTL8125芯片内部有多个版本不同批次、不同B/C/D后缀的产品在寄存器、PHY配置上是有差异的。内核r8169驱动为了兼容各种老芯片采用了通用的初始化流程对新版RTL8125的部分特性支持不完整结果就是有的机器能识别但速率不对有的机器能跑满速但大流量下载时会断流有的机器在睡眠唤醒后网卡消失。这些bug不是内核开发者不努力而是瑞昱对新硬件的适配信息不透明内核驱动的更新永远慢半拍。所以我的建议是如果r8169驱动在你机器上能正常工作速率协商到2500Mb/s长时间大流量不断流那就没必要换官方驱动。系统越少动越稳定。但如果你发现网卡不识别、速率上不去、或者有明显的掉线断流那就果断换官方r8125驱动。2.2 什么情况下必须用官方r8125驱动结合我自己的经验下面这几种情况强烈建议使用瑞昱官方r8125驱动第一内核版本较老比如还在用5.4、5.10等长期维护版本r8169对RTL8125支持不完全或者压根没加入支持。这种情况下无论是升级内核还是换官方驱动总得选一条路。如果机器上有业务不能随便重启升级那编译官方驱动是更稳妥的方案。第二r8169驱动能识别网卡但ethtool显示速率只有1000Mb/s或者频繁在100M/1000M之间跳变。这说明驱动对PHY的配置有问题协商没有跑进2.5G模式。换官方驱动后多数能解决。第三板载网卡是七彩虹、铭瑄这类国产主板上的RTL8125厂商在板级设计时可能用了特殊的电源管理和唤醒逻辑对内核驱动的兼容性更差。我之前试过一块七彩虹主板的2.5G口在Debian 11内核5.10下r8169直接认不到官方r8125装上后一切正常。这也解释了为什么很多国产品牌主板的用户在网上反馈“Linux网卡驱动有问题”其实不是主板问题而是主板的方案对Linux的适配依赖芯片厂商官方驱动厂商又不愿意提前给内核做贡献整个生态就是这么拧巴。第四你想跑满2.5G带宽做软路由、NAS传输或者内网备份对稳定性要求高。官方驱动更新频率更高对一些offload特性、EEE节能特性的支持更完整。不过要注意官方驱动本身也不是完美的它在一个干净的内核环境下跑起来一劳永逸但一旦碰上内核升级、Secure Boot、DKMS配置这些事也会折腾你半天。顺便说一句如果你用的是英特尔的I225/I226网卡绝大多数内核版本下用igc驱动就好英特尔在网络芯片这块对Linux的贡献比瑞昱强很多。这问题在2.5G网卡里基本不叫问题不用太焦虑。3. 动手实操RTL8125官方驱动编译安装全流程3.1 准备环境装好编译工具链和内核头文件官方r8125驱动是源码包需要现场编译成内核模块所以编译环境必须先准备好。这一步很多人会忽略然后编译时疯狂报错到处找依赖。不同发行版命令不一样但核心就是三样东西gcc、make、以及当前内核版本对应的头文件。Ubuntu / Debian系sudo apt update sudo apt install -y build-essential dkms linux-headers-$(uname -r) gcc makeCentOS / Rocky Linux / AlmaLinux系sudo dnf install -y gcc make kernel-devel kernel-headers dkms这里有一个关键点linux-headers-$(uname -r)这个东西必须和当前运行的内核版本一致。你升级内核之后重启了还好如果你装的是最新内核头文件但当前运行的是旧内核make的时候就会报找不到/lib/modules/$(uname -r)/build的错误。验证方法很简单ls /lib/modules/$(uname -r)/build这个目录存在说明头文件就位。如果输出“No such file or directory”那就是头文件没装对版本。另外如果你用的是RHEL系发行版并且已经启用了Secure Boot编译出来的模块如果没有签名加载的时候会被拒绝这个问题后面专门讲。现在先假设还没到那一步。3.2 下载驱动源码与正确解压瑞昱官网的下载入口比较隐蔽总是在一堆英文网页里绕来绕去。但驱动的包名很规律一般是r8125-9.012.04.tar.bz2这类版本号形式。下载之后建议放到一个专门的目录里统一管理我是放在/usr/src/下方便之后给DKMS用。解压命令需要注意这个驱动包是.tar.bz2格式不是常见的.tar.gzsudo mkdir -p /usr/src/r8125 sudo tar -xf r8125-9.012.04.tar.bz2 -C /usr/src/r8125 --strip-components1如果文件后缀是.tar.gz那命令改成sudo tar -xzf r8125-9.012.04.tar.bz2 -C /usr/src/r8125 --strip-components1很多人在解压这一步翻车因为驱动包内层目录结构有多层嵌套不加--strip-components1会导致源码全部堆在一个带版本号的子目录里后续执行编译脚本时怎么都找不到文件。解压完之后进目录看一眼ls /usr/src/r8125正常情况能看到README.md、autorun.sh、src、Makefile等文件。有autorun.sh说明是标准的瑞昱驱动包。3.3 编译安装与模块加载官方驱动包最省事的编译方式是直接执行autorun.sh脚本。这个脚本会自动完成make、make install、modprobe等一连串操作适合一条路走到黑cd /usr/src/r8125 sudo ./autorun.sh如果一切顺利脚本执行完后会提示module加载成功。立刻用lsmod | grep r8125验证能看到r8125模块就说明驱动已经进内核了。然后ip link查看网卡接口如果看到类似enp4s0的接口说明网卡已经被识别。但autorun.sh有一个坑它编译时用的是当前内核环境如果你以后升级内核重启新内核里没有这个模块网卡就又消失了。这个问题后面讲DKMS的时候解决现在先让它跑起来。如果autorun.sh执行过程中报错或者你想手动步骤更可控一些也可以用传统方式cd /usr/src/r8125 sudo make sudo make install sudo modprobe r8125在这套流程里真正核心的是make这一步绝大多数编译错误都是在这一步暴露出来的。常见的报错比如“错误unknown type name ‘ktime_t’”“错误implicit declaration of function”基本都是内核头文件版本不对或者gcc版本和新内核不兼容。建议先回头检查内核头文件不要盲目重试。加载完驱动后可以用dmesg看驱动初始化的日志dmesg | grep r8125正常会输出类似“r8125: 2.5Gbps Ethernet”或者寄存器初始化的信息。多看了一眼细节心里就踏实了。3.4 用DKMS一劳永逸DKMSDynamic Kernel Module Support是解决“内核升级后驱动失效”的标准方案。它的作用简单说就是注册一个驱动源码包当系统检测到新内核安装时自动为新内核重新编译这个模块。这样你就再也不用每次升级内核后手动重装驱动了对长期使用的机器来说这个价值极大。我的建议是直接跳过autorun.sh用DKMS来管理r8125驱动。步骤如下先把驱动源码放到/usr/src/r8125-9.012.04这样的目录注意目录名要带版本号因为DKMS依赖这个命名来识别。sudo mkdir -p /usr/src/r8125-9.012.04 sudo tar -xf r8125-9.012.04.tar.bz2 -C /usr/src/r8125-9.012.04 --strip-components1然后添加DKMS配置sudo dkms add -m r8125 -v 9.012.04 sudo dkms build -m r8125 -v 9.012.04 sudo dkms install -m r8125 -v 9.012.04dkms build这一步就是实际编译过程可以在这里看到所有编译输出。如果编译失败用dkms status查看状态再根据报错定位问题。dkms install执行完后再modprobe r8125加载模块。DKMS的好处还不止是应对内核升级。如果你不小心把驱动编译坏了可以用dkms uninstall -m r8125 -v x.x.x和dkms remove -m r8125 -v x.x.x干净地卸载不会在系统里留下一堆乱七八糟的中间文件。相比之下autorun.sh装出来的驱动要卸载就麻烦得多。4. 实操中100%会踩的坑与排查命令手册4.1 编译报错的常见原因编译r8125驱动时最经典的问题是/lib/modules/$(uname -r)/build目录不存在。这个问题前面提过核心原因就是内核头文件没装或者装的版本和运行内核不一致。解决方法是重新安装对应版本的头文件Ubuntu系可以用apt install linux-headers-$(uname -r)RHEL系用dnf install kernel-devel-$(uname -r)。第二个常见问题是gcc版本太新和内核源码里某些写法不兼容。比如新gcc默认启用了更严格的格式检查会导致一些老驱动代码编译不过。如果你用的是Fedora或者Arch这种高版本gcc发行版可以考虑降级gcc或者给Makefile加-Wno-error之类的参数不太推荐治标不治本。更实际的办法是升级到官方驱动包的最新版本瑞昱通常会在新版本里适配新编译器。第三个问题是编译时提示缺失头文件比如linux/version.h、linux/utsname.h缺失。这两个文件在linux-headers-xxx包里都有如果你已经装好了头文件还报缺那大概率是头文件目录软链接坏了重新执行一遍头文件安装命令即可。第四个问题比较隐蔽有些发行版默认启用了CONFIG_MODULE_SIG模块签名校验编译时不会报错但加载时会提示“Required key not available”。这属于Secure Boot问题单独拎出来说。4.2 Secure Boot 导致驱动无法加载Secure Boot安全启动是UEFI的固件安全机制如果在BIOS里开着Secure Boot内核默认只会加载有签名校验的模块。你手动编译出来的r8125模块没有签名就会被内核拒绝加载。最典型的现象是modprobe r8125命令没有任何输出但dmesg | tail里能看到类似“Lockdown: modprobe: unsigned module loading is restricted”。解决方案有三个第一个直接进BIOS关掉Secure Boot。这是最简单粗暴的办法适合个人使用的机器。不是所有主板都能轻松关闭但多数家用主板在Security或者Boot菜单里能找到选项。第二个给模块签名。这需要用到mokutil和openssl工具链过程比关Secure Boot复杂但能在不关闭安全机制的情况下加载模块sudo apt install mokutil # Ubuntu/Debian # 生成签名密钥 openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj /CNCustom Module Signing Key/ # 注册密钥到MOK sudo mokutil --import MOK.der # 重启后会进入蓝色MOK管理界面选择Enroll MOK输入密码完成注册 # 签名模块进入drivers/net/ethernet/realtek/r8125目录或模块所在路径 sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 /path/to/MOK.priv /path/to/MOK.der r8125.ko第三个直接换成DKMS。新版DKMS在安装模块时会给模块做自动签名前提是你已经用mokutil注册了MOK密钥可以省掉手动签名步骤。如果只是个人折腾直接关Secure Boot是最省心的。但如果你的机器是公司统一管控的建议用MOK签名方案别去动BIOS设置。4.3 驱动加载了但网卡不识别/不亮灯模块加载成功lsmod | grep r8125有输出但ip link里没有网卡接口或者网口的灯压根不亮这种问题也经常遇到。先排除一个常见错误如果你之前加载过r8169驱动并且r8169和r8125同时存在两者会互相抢占设备。解决方法是把r8169加入黑名单只保留r8125sudo sh -c echo blacklist r8169 /etc/modprobe.d/blacklist-r8169.conf sudo update-initramfs -u # Debian/Ubuntu # 或者 RHEL系用 sudo dracut -f sudo reboot另外PCIe设备的电源管理也可能是元凶。尤其是笔记本或者小主机上PCIe链路会进入ASPM低功耗状态网卡在驱动初始化的时候如果被挂起就会导致设备无法完全使能。出现这种情况时可以试着在内核引导参数里加pcie_aspmoffsudo sed -i s/GRUB_CMDLINE_LINUX_DEFAULT/GRUB_CMDLINE_LINUX_DEFAULTpcie_aspmoff / /etc/default/grub sudo update-grub sudo reboot如果加完参数还是不亮灯检查一下网卡是不是插在PCIe x1的插槽上并且检查lspci -vvv里网卡的LnkSta速度是不是只有2.5GT/s也就是PCIe 2.0这个状态和网卡初始化本身没直接关系但如果链路异常也会导致驱动初始化失败。还有一种少见情况是主板BIOS里把网卡的Wake-on-LAN或者“网络栈”功能打开了导致网卡处于半复位状态驱动加载到一半就卡住。这种问题可以试着在BIOS里关闭网络引导PXE/Network Boot再试。4.4 网卡速率只能协商到1000M/100M驱动起来了网卡接口也看得到了但ethtool eth0显示协商速率只有1000Mb/s甚至100Mb/s这种情况我也遇到过而且最让人抓狂——因为看起来一切都正常但网速就是上不去。排查顺序一般是第一确认对端设备支持2.5G。你插的交换机、路由器、NAS的网口如果只有千兆那协商成1000M是正常的这不是网卡问题。如果对端是2.5G口但协商结果还是1000M继续往下查。第二检查网线。2.5G速率需要至少Cat5e超五类以上的网线如果网线质量差、线芯不达标自动协商会向下跳档到1000M甚至100M。这条最容易被忽略但也最容易换线就解决。第三检查EEE节能以太网和Green Ethernet设置。部分RTL8125网卡在开启EEE后PHY侧的协商会异常导致锁定在1000M。尝试关闭sudo ethtool --set-eee eth0 eee off如果系统不支持这个命令可以用驱动参数或者在/etc/network/interfaces里加post-up ethtool --set-eee $IFACE eee off来持久化。有时候还需要在BIOS里关闭ErP省电相关选项。第四手动指定速率模式测试。可以用ethtool -s eth0 speed 2500 duplex full强制指定到2500M如果指定后链路直接断开那说明对端或网线不支持2.5G如果能稳定工作再改回自适应。第五关闭网卡的TSO/GSO/GRO等offload功能。这虽然不会直接改变协商速率但在某些弱电环境下内核协议栈的offload会引发大量丢包重传导致速率看起来“协商成2500M却跑不出2500M的速”反而让人误以为是协商问题。用以下命令关闭sudo ethtool -K eth0 tso off gso off gro off这个操作对CPU占用影响不大但对某些网卡稳定性的提升非常明显尤其是驱动版本较老的时候。4.5 网速飙不上去offload、网线、交换机排查最后一种场景是驱动装好了协商速率也是2500Mip link显示网卡link up但实际跑文件传输或者Speedtest的时候速度死活只有千兆水平有时候还会出现大流量断流。这类问题十有八九出在驱动和内核协议栈的配合上。RTL8125官方驱动在开启TSO/TSS、GSO等软件offload时老版本的驱动里有很多bug会导致特定大小包的发送队列卡死表现为传输速度突然掉到0过几秒又恢复。我遇到过最典型的一次是用rsync在内网传文件没传多久速度就从280MB/s直接掉到0等十几秒又跳回来周而复始非常折磨人。解决思路是先粗暴地把所有offload关掉测速看是否稳定稳定之后再逐个开启找出罪魁祸首。实际操作sudo ethtool -K eth0 tso off sudo ethtool -K eth0 gso off sudo ethtool -K eth0 gro off sudo ethtool -K eth0 lro off如果关掉之后速度稳定了那问题就在驱动对offload的处理上。想一劳永逸的话可以写个systemd服务开机就自动关闭这些选项sudo tee /etc/systemd/system/ethtool-offload.service /dev/null EOF [Unit] Afternetwork.target [Service] Typeoneshot ExecStart/usr/sbin/ethtool -K eth0 tso off gso off gro off lro off RemainAfterExityes [Install] WantedBymulti-user.target EOF sudo systemctl enable ethtool-offload.service sudo systemctl start ethtool-offload.service网线方面也有讲究。跑2.5G不一定需要Cat6但最好使用带屏蔽层的Cat5e以上成品线不要用自己做的水晶头线那东西在千兆下能用跑到2.5G就很容易丢包。交换机也不要只看端口标称速率部分老交换机所谓的“2.5G口”其实是2.5G光电复用口切换模式之后才能跑满端口协商显示的还是1000M。还有一个容易踩的坑PCIe链路速率。RTL8125本身是PCIe 2.0 x1的接口跑2.5G完全没压力但如果你把它插在PCIe 3.0 x1或者PCIe x16的插槽上有些主板会把链路速率限制在PCIe 1.0这就可能导致网卡的DMA带宽不足传输速度上不去。用lspci -vvv -s 04:00.0 | grep LnkSta看链路状态如果显示LnkSta: Speed 2.5GT/s是正常的PCIe 2.0速率如果显示Speed 5GT/s说明跑在PCIe 3.0上更不用担心但如果显示Speed 2.5GT/s (downgraded)就去BIOS里看看是不是强制了PCIe 1.0。最后补充一个和驱动本身关系不大的坑如果网卡在系统休眠或者挂起后消失了ip link只剩loopback接口大概率是电源管理把网卡供电切断了。除了BIOS关闭ErP之外还可以在systemd里处理sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target这个操作直接禁用系统睡眠治标不治本但对NUC、迷你主机这类设备来说禁用睡眠换来网卡稳定很多人是愿意的。5. 最后分享一点自己的经验折腾过这么多2.5G网卡的机器我最大的体会是这类驱动问题没有“银弹”但有一套固定的排查套路可以人传人。先确认芯片再看内核驱动能不能用不能用就编译官方驱动编译完优先用DKMS管理最后遇到速率或者断流问题再往网线、交换机、电源管理和offload方向查。这套路我用了很多遍基本每次都能把问题框定在很小的范围内。另外一个建议是别在系统内核还停留在5.10以下的旧发行版上太纠结。很多老发行版在2.5G网卡上就是先天不足与其花几个小时各种打补丁不如直接换一个内核版本新一点的发行版Ubuntu 22.04、Debian 12、Rocky Linux 9这些用起来会省心很多。如果你的机器上有必须保留的生产环境那就用DKMS方案把r8125管起来至少升级内核之后能自动重建驱动不会被突然的驱动失效打一个措手不及。说到底2.5G网卡在Linux下的体验这几年已经比前两年好多了内核的r8169驱动也在持续完善。如果你的问题至今还没解决先回去看一眼lspci确认芯片型号然后按这篇文章的顺序一步步排查大概率不会空手而归。