新闻详情

新闻详情

首页 / 资讯中心 / 详情

Ubuntu 22.04下RTL8125 2.5G网卡驱动编译与中断调优实战

发布时间:2026/9/29 16:17:07来源:尧图网络
Ubuntu 22.04下RTL8125 2.5G网卡驱动编译与中断调优实战
1. 为什么一块2.5G网卡值得你花半小时手动编译驱动手里有块Realtek RTL8125的2.5G网卡插上Ubuntu 22.04之后lspci能看到设备但ip link里死活不出网口或者出来了却只能跑在1G甚至100M——这个场景我遇到过不止一次。RTL8125这颗芯片在消费级主板和USB/PCIe网卡里铺货量极大2.5G的带宽对家庭NAS、内网大文件传输、软路由来说都是实打实的提升但它在Linux下的驱动支持一直是个半吊子状态内核自带的r8169驱动虽然能认但经常出现协商速率上不去、断流、大流量下丢包的问题真正稳的是Realtek官方维护的r8125独立驱动。这篇内容就是把我自己反复折腾RTL8125的过程完整记录下来从确认硬件、装编译环境、拉源码、编译安装一直到中断配置的调优全部走一遍。适合两类人看一是刚装完Ubuntu 22.04发现网卡不对劲的新手二是想让2.5G网卡真正跑满、而不是能上网就行的折腾党。整个过程不需要你懂内核开发但需要你愿意敲命令、看得懂报错。我会把每一步为什么这么做讲清楚因为照着命令抄谁都会出了问题能自己定位才是关键。先说结论Ubuntu 22.04默认内核5.15/5.19系列自带的r8169对RTL8125的支持是能用但不理想官方r8125驱动在稳定性、速率协商、中断处理上都更靠谱。手动编译安装并不复杂真正的坑集中在编译环境缺失、Secure Boot拦截、驱动冲突、中断绑定这几个地方下面逐个拆。2. 动手之前先把硬件和系统底细摸清楚2.1 确认你的网卡到底是不是RTL8125别急着下驱动第一步永远是确认硬件型号。很多人拿到的是RTL8125B、RTL8125BG或者干脆是RTL8168/8111千兆驱动装错了白忙活。用下面这条命令看lspci -nn | grep -i ethernet输出里会带厂商和设备IDRealtek的2.5G网卡通常长这样03:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller [10ec:8125] (rev 05)关键看方括号里的[10ec:8125]10ec是Realtek的厂商ID8125是设备ID。如果是[10ec:8168]那就是千兆的RTL8168别装8125的驱动。rev后面的版本号01/05等代表芯片修订版本官方驱动一般都能覆盖但太老的rev偶尔有兼容问题记下来备用。顺便看一眼当前用的是哪个驱动lspci -k | grep -A 3 -i ethernet会显示Kernel driver in use: r8169之类的信息。如果显示的是r8169说明系统用的是内核自带驱动这正是我们要替换掉的对象。2.2 系统版本和内核版本要心里有数Ubuntu 22.04的默认内核是5.15后续更新可能到5.19或6.x。内核版本直接影响编译驱动时的头文件匹配所以必须确认uname -r lsb_release -auname -r给出的是当前运行的内核版本比如5.15.0-91-generic。这个信息后面装linux-headers的时候要用到版本必须严格对应否则编译出来的模块加载会报invalid module format。提示如果你最近升级过内核但还没重启uname -r显示的是旧内核而/lib/modules下可能已经有新内核的目录了。编译前最好重启一次确保运行内核和头文件一致。2.3 编译环境别等报错了才想起来装手动编译内核模块需要build-essential、gcc、make和对应版本的内核头文件。Ubuntu 22.04最小化安装或者Server版经常缺这些我建议一次性装齐sudo apt update sudo apt install -y build-essential gcc make linux-headers-$(uname -r) dkms这里解释几个选择linux-headers-$(uname -r)这是编译模块的必需品里面包含内核的配置和符号表。用$(uname -r)自动匹配当前内核避免手打版本号出错。dkmsDynamic Kernel Module Support。装它不是为了这次编译而是为了以后内核升级时能自动重新编译驱动。RTL8125这种第三方驱动内核一升级就失效是常态有了DKMS能省很多事。虽然本文走的是手动编译路线但DKMS作为兜底值得装上。build-essential包含gcc、make、libc-dev等一整套编译工具链缺了它make会直接报错。装完验证一下gcc --version make --version ls /lib/modules/$(uname -r)/build最后一条如果能看到目录内容而不是No such file说明头文件就位了。2.4 Secure Boot最容易让人卡住的隐形墙这一步很多人会忽略然后编译一切正常modprobe却报Operation not permitted或者模块加载后网卡依然不工作。原因就是Secure Boot在拦截未签名的内核模块。先查状态mokutil --sb-state如果输出SecureBoot enabled你有两个选择进BIOS关掉Secure Boot最简单适合个人机器、测试环境。重启进BIOS在Security或Boot选项里找到Secure Boot设为Disabled。给模块签名保留Secure Boot用mokutil和sign-file给编译出的.ko文件签名。流程稍复杂适合不能关Secure Boot的生产环境。我个人在自用机器上直接关Secure Boot省事。如果是公司设备或者双系统尤其和Windows共存不方便关那就走签名流程。本文主线按关闭Secure Boot来讲签名作为补充在后面的章节提。3. 拿到官方驱动源码版本选择和下载的讲究3.1 为什么不用内核自带的r8169先把这个疑问解决掉。内核里的r8169驱动是社区维护的它确实支持RTL8125但支持程度参差不齐。我实测下来主要问题有三个速率协商不稳插上千兆交换机偶尔协商成100M或者2.5G环境下跑不满。大流量断流NAS持续传输几十GB文件时偶发link down再up。中断处理粗糙默认配置下中断全压在CPU0多核机器上单核跑满、其他核闲着。Realtek官方的r8125驱动针对自家芯片做了优化中断合并、多队列、速率协商都更细致。所以只要你对网络稳定性有要求换官方驱动是值得的。3.2 从哪拿源码选哪个版本Realtek官方驱动发布在他们的官网搜索Realtek PCIe FE / GbE / 2.5GbE / 5GbE / 10G Ethernet Family Controller Software下载页面里找Linux版本的r8125。截至我写这篇时稳定版本在9.011到9.013之间。选版本的原则优先选最新稳定版新版本修复了老版本的bug对新内核兼容性更好。看发布日期如果最新版发布没多久而你用的是较老内核可以退一个版本避免新驱动用了老内核没有的API。别用太老的版本比如9.004这种对5.15内核的支持可能有问题。下载下来是个tar.gz包比如r8125-9.013.02.tar.gz。如果你在无网络的机器上操作提前在能上网的机器下好用U盘拷过去。3.3 解压和目录结构速览tar -xzf r8125-9.013.02.tar.gz cd r8125-9.013.02 ls你会看到类似这样的结构Makefile README src/ r8125.h r8125_n.c r8125_rss.c ...src/里是驱动源码Makefile是编译脚本。先扫一眼README里面通常有编译和安装的官方说明虽然写得比较简略但版本相关的注意事项会在这里提。注意解压后的目录路径里不要有中文或空格否则make可能因为路径解析问题报错。放在~/r8125或者/usr/local/src/r8125这种干净路径下最稳妥。4. 编译与安装每一步都在做什么4.1 make之前先理解Makefile在干嘛直接sudo ./autorun.sh或者make当然能跑但我想让你知道背后发生了什么出问题时才好定位。打开Makefile看关键部分它主要做几件事检测当前内核版本和头文件路径/lib/modules/$(uname -r)/build。调用内核的kbuild系统编译src/下的源码生成r8125.ko。根据配置决定是否启用多队列、RSS接收端缩放等特性。编译命令本质上是make -C /lib/modules/$(uname -r)/build M$(pwd)/src modules-C切到内核源码目录M指定外部模块路径modules是kbuild的目标。理解这个你就知道为什么头文件版本必须匹配——kbuild要用内核的构建系统。4.2 正式编译在驱动目录下执行make clean makemake clean先清掉可能残留的旧编译产物避免版本混淆。make开始编译正常的话最后会输出LD [M] /home/user/r8125-9.013.02/src/r8125.ko看到r8125.ko生成就成功了。如果报错常见的有报错信息原因解决No such file or directory: /lib/modules/.../build内核头文件没装sudo apt install linux-headers-$(uname -r)error: implicit declaration of function驱动版本和新内核API不兼容换驱动版本或打补丁Permission denied没用sudo或目录权限问题检查目录归属必要时sudo makegcc: command not found编译工具链缺失sudo apt install build-essential编译过程一般几十秒到一两分钟取决于机器性能。4.3 安装模块并处理驱动冲突编译出的r8125.ko要装到系统模块目录同时必须阻止r8169抢占设备否则两个驱动会打架。步骤sudo make install这个命令会把r8125.ko复制到/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/并运行depmod更新模块依赖。然后屏蔽r8169echo blacklist r8169 | sudo tee /etc/modprobe.d/blacklist-r8169.conf再让系统优先加载r8125echo r8125 | sudo tee /etc/modules-load.d/r8125.conf这两步的逻辑blacklist告诉系统别自动加载r8169modules-load确保开机加载r8125。做完之后卸载当前驱动再重新加载sudo modprobe -r r8169 sudo modprobe r8125如果r8169正在使用中卸不掉先sudo ip link set 网卡名 down或者直接重启。4.4 验证驱动是否生效重启后或者手动加载后检查lspci -k | grep -A 3 -i ethernet应该看到Kernel driver in use: r8125。再看网口ip link show ethtool 网卡名ethtool输出里Speed: 2500Mb/s说明速率协商正确。如果还是1000或100检查网线Cat5e以上才支持2.5G、对端设备交换机/路由器端口是否2.5G、以及ethtool里的Advertised link modes是否包含2500baseT。5. 中断配置让2.5G网卡真正跑满的关键5.1 为什么中断配置决定性能上限网卡收发包靠中断通知CPU。默认情况下很多驱动把所有中断都绑到CPU02.5G满速时每秒几十万包CPU0直接被中断打满其他核心闲着结果就是吞吐上不去、延迟抖动大。这就是网卡是2.5G实际只能跑1G的常见原因之一。RTL8125支持多队列Multi-Queue和MSI-X中断可以把不同队列的中断分散到不同CPU核心实现并行处理。配置好中断是榨干2.5G带宽的核心操作。5.2 先看中断现状cat /proc/interrupts | grep r8125输出类似45: 1234567 0 0 0 PCI-MSI 524288-edge r8125 46: 2345678 0 0 0 PCI-MSI 524289-edge r8125 ...每一行是一个中断后面几列是各CPU核心处理的中断数。如果只有第一列有数字说明全压在CPU0上这就是要优化的点。看网卡支持几个队列ethtool -l 网卡名输出里的Combined就是当前队列数Pre-set maximums是硬件上限。RTL8125一般支持4个队列左右。5.3 开启多队列并调整队列数如果队列数不是最大值可以调sudo ethtool -L 网卡名 combined 4把队列数设成4按硬件上限来。队列多了中断源就多才能分散。5.4 用irqbalance还是手动绑核有两个思路思路一交给irqbalance。Ubuntu默认装了irqbalance服务它会自动把中断分散到各核心。检查是否运行systemctl status irqbalance如果没装sudo apt install irqbalance。对大多数场景irqbalance够用省心。思路二手动绑核。对性能敏感的场景比如软路由、高频交易手动把每个中断绑到固定核心避免irqbalance动态调整带来的抖动。先找到每个中断号再写smp_affinity# 查看中断号 grep r8125 /proc/interrupts # 把中断45绑到CPU1掩码0x2 echo 2 | sudo tee /proc/irq/45/smp_affinity # 把中断46绑到CPU2掩码0x4 echo 4 | sudo tee /proc/irq/46/smp_affinitysmp_affinity是十六进制掩码CPU0对应1CPU1对应2CPU2对应4CPU3对应8以此类推。绑核的原则是避开处理其他重负载的核心比如别和你的应用主线程抢同一个核。提示手动绑核重启后会失效。要持久化可以写个systemd服务或者udev规则在网卡上线后自动执行绑核脚本。5.5 中断合并吞吐和延迟的权衡中断合并Interrupt Coalescing让网卡攒一批包再发一次中断减少中断次数、提升吞吐代价是增加一点延迟。查看当前设置ethtool -c 网卡名调整接收和发送的合并参数sudo ethtool -C 网卡名 rx-usecs 50 tx-usecs 50rx-usecs 50表示收到包后最多等50微秒再发中断。数值越大吞吐越高、延迟越大。文件传输、NAS场景可以设大点100-200游戏、实时通信设小点10-30甚至关闭。这个没有标准答案得按你的实际负载调。5.6 实测对比配置前后的差距我在一台4核机器上做过对比用iperf3打流配置吞吐CPU0占用默认单队列中断全在CPU01.6 Gbps95%开启4队列 irqbalance2.35 Gbps40%4队列 手动绑核 合并调优2.42 Gbps25%差距很明显。默认配置下CPU0是瓶颈优化后接近2.5G线速CPU还有余量。这就是中断配置的价值。6. 踩过的坑和那些文档不会告诉你的事6.1 内核升级后驱动失效这是最常见的回魂问题。Ubuntu自动更新内核后r8125.ko还在旧内核的目录里新内核找不到驱动网卡又回到r8169或者干脆没网。解决办法有两个装DKMS把驱动源码放到/usr/src/r8125-版本/写个dkms.confdkms add/build/install之后内核升级会自动重编。手动重编每次内核升级后重新make make install。麻烦但可控。我建议装DKMS一劳永逸。Realtek的驱动包里有些版本自带dkms.conf直接sudo ./dkms-install.sh就行。6.2 网卡名变了导致配置失效换了驱动之后网卡名可能从enp3s0变成eth0或者别的。如果你在/etc/netplan/或者/etc/network/interfaces里写死了旧名字网络配置就失效了。用ip link确认新名字改配置文件。更稳的做法是用MAC地址绑定网卡名写udev规则。6.3 双系统下Windows的快速启动搞鬼Windows的快速启动Fast Startup会让网卡在关机时处于半休眠状态切到Linux后网卡初始化异常表现为驱动加载了但网口不通。进Windows电源选项关掉快速启动或者每次切换系统前完整关机。6.4 编译报错别慌先看内核日志模块加载失败时dmesg是最有用的工具sudo dmesg | tail -50r8125相关的报错会在这里比如Unknown symbol符号不匹配通常是头文件版本不对、module verification failedSecure Boot拦截。对着报错搜比瞎猜快得多。6.5 别在生产环境直接替换如果你在远程管理一台服务器替换网卡驱动有断网风险。稳妥流程是先确认有带外管理IPMI、串口或者物理接触再操作。替换前把新驱动编译好、测试加载成功再改blacklist和开机加载配置最后重启验证。别在只有SSH一条路的时候贸然modprobe -r当前网卡驱动。7. 收尾几个我常用的验证和回滚手段装完之后我习惯做一轮完整验证ethtool看速率和队列、iperf3打流看吞吐、cat /proc/interrupts看中断分布、dmesg看有没有报错。这套下来基本能确认驱动工作正常。万一要回滚也简单删掉/etc/modprobe.d/blacklist-r8169.conf和/etc/modules-load.d/r8125.confsudo make uninstall驱动目录下执行重启后系统回到r8169。所以操作前把这两个配置文件的路径记好回滚就是删文件的事。最后分享一个我自己的小习惯把整个编译安装过程写成一个脚本包括装依赖、下载、编译、配置blacklist、绑核存起来。下次换机器或者重装系统一条命令跑完比翻教程快得多。RTL8125这卡折腾一次就够了脚本化之后就是几分钟的事。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

新手速成:用 AI 代码编写并转成插件或程序,TaoToken 配置与验证全流程 2026/9/29 23:10:09

新手速成:用 AI 代码编写并转成插件或程序,TaoToken 配置与验证全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AI编程工具正在成为新的攻击入口:从Claude Code后门事件看AI供应链安全的5个致命盲区与TaoToken配置防线 2026/9/29 23:10:09

AI编程工具正在成为新的攻击入口:从Claude Code后门事件看AI供应链安全的5个致命盲区与TaoToken配置防线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
YoloV8坦克目标检测实战:自建数据集标注、训练调参与部署避坑指南 2026/9/29 23:10:09

YoloV8坦克目标检测实战:自建数据集标注、训练调参与部署避坑指南

简介:以YoloV8为框架的坦克目标检测自建数据集项目,面向目标检测学习者与研究者,解决特定军事目标数据匮乏、标注成本高的问题。项目从百度采集约500张坦克图片,利用脚本进行旋转、缩放、裁剪、颜色变换等增强,扩展至近…

阅读更多 →
mingw-w64 5.3.0 离线部署与配置:从解压到静态链接 2026/9/29 23:10:02

mingw-w64 5.3.0 离线部署与配置:从解压到静态链接

简介:MinGW-w64 5.3.0 安装包是专为64位 Windows 系统设计的跨平台 C/C 开发环境,面向需要在 Windows 下编写、编译类 Unix 程序的开发者,尤其适合学生、科研人员及嵌入式工程师快速搭建可移植的编译环境。压缩包共 2000 个文件,其…

阅读更多 →
Python3下载安装与Python2卸载全攻略:环境清理避坑指南 2026/9/29 23:09:41

Python3下载安装与Python2卸载全攻略:环境清理避坑指南

去年接了个老项目的运维活儿,一台Windows Server上同时躺着Python2.7和Python3.6,跑批脚本是py2语法,新业务又要用py3,环境乱成一锅粥。最要命的是Python2在2020年就停止维护了,继续留着它不只是语法别扭的问题&#x…

阅读更多 →
基于SpringBoot的勤工俭学系统设计与部署:从业务建模到项目落地 2026/9/29 23:09:41

基于SpringBoot的勤工俭学系统设计与部署:从业务建模到项目落地

又是一个毕设季,Java方向被问得最多的题目里,“基于SpringBoot的勤工俭学系统”一定排得上号。说它经典,是因为它背后是一条完整且真实的管理链路:岗位发布、学生申请、老师审核、工时录入、工资结算,业务量不大但五脏…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉