☰
Ubuntu 22.04 安装 Realtek R8125 2.5G 网卡驱动:DKMS 配置全记录
2026/10/2 1:25:40 网站建设 项目流程

长话短说,这篇文章是我在 Ubuntu 22.04 上折腾 Realtek R8125 2.5G 网卡驱动的完整记录。板载 2.5G 网卡在现在的 B660/B760 主板上非常常见,其中相当一部分用的就是 Realtek R8125 芯片。装好 Ubuntu 之后发现网卡没被系统驱动起来,上不了网,没驱动就没法上网,没网就没法装驱动——这个鸡生蛋蛋生鸡的死循环,我是深有体会。这篇文章就把我从头到尾踩过的坑、试错出来的正确步骤全部写清楚,尤其是 DKMS 自动编译配置,确保内核升级后驱动不会失效,免得隔几个月系统一更新又断网。

这内容适合所有在 Ubuntu/Debian 系系统上使用 R8125/RTL8125 板载网卡的朋友,或者准备装 Ubuntu 22.04 双系统但担心驱动问题的人。我会把方案选型、编译安装、DKMS 配置、Secure Boot 排查全部拆开讲,保证每一步你照着敲就行。

1. 方案选型:为什么不能直接依赖内核自带的 r8169

1.1 先搞清楚你的网卡到底是什么芯片

很多朋友第一步就搞错了,以为系统里有网卡就能用。Ubuntu 22.04 默认内核里确实包含了一个名叫r8169的驱动模块,但请记住一个关键点:这个模块不是万能的,对 R8125 的支持非常不完整,甚至可以说是时好时坏。

R8125 是 Realtek 后来的 2.5G Ethernet 控制芯片,它的硬件设计相比老款 8111/8168 有很大改动。虽然内核的 r8169 驱动代码里名义上兼容了 RTL8125,但实际用起来两个问题非常突出:

  • 部分主板上的 R8125 在r8169驱动下根本无法识别,ip link里压根看不到网卡设备。
  • 就算能识别,2.5G 速率协商不稳定,经常掉到 1000Mbps 甚至 100Mbps,大文件传输直接拉胯。

我当时的主板是七彩虹的 B760M,板载 R8125,装完 Ubuntu 22.04 后lspci能看到网卡但dmesg里面一堆报错,链路状态始终是 DOWN。后来我直接放弃内核自带驱动,改用 Realtek 官方闭源驱动,问题才彻底解决。

所以在动手之前,第一步永远是确认芯片型号:

lspci -nn | grep -i ethernet

输出类似这样:

03:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller [10ec:8125] (rev 05)

只要看到10ec:8125这个设备 ID,基本可以确定就是 R8125。如果你还不太确定,可以用lspci -v查看当前被哪条驱动接管,或者直接看主板官网的网卡参数确认。

1.2 官方驱动 vs 内核自带驱动 vs DKMS 管理的差异

我把常见的驱动来源做了个直观对比,这个表挺重要的,建议你先看一遍再决定走哪条路:

驱动来源优点缺点适合场景
内核自带 r8169装完系统就有,不用额外操作R8125 支持不完善,速率不稳甚至无法识别不追求 2.5G 满速、且运行稳定的少数情况
Realtek 官方 r8125 源码手动编译官方优化,2.5G 支持完善,性能稳定内核升级后模块失效,需要重新编译临时救急、一次性部署
Realtek 源码 + DKMS 注册官方驱动性能 + 自动跟随内核编译初始配置需要多花几分钟长期使用,强烈推荐

核心结论一句话:别懒,直接走 DKMS 方案。手动编译安装只需要一条make install看似更快,但下次内核一升级,网卡又变回原来的状态,你还得重新下载源码、重新编译、重新安装,而且如果不记得当时的编译选项,整个流程又要重新摸一遍。

1.3 为什么 R8125 在 Ubuntu 22.04 上特别容易出问题

讲点背景知识。Ubuntu 22.04 使用的是 5.15 LTS 内核,这个内核版本对较新的 2.5G 网卡硬件本身的适配成熟度是不如后续 5.19/6.x 内核的。Realtek R8125 的官方驱动更新节奏又很迷,经常是几个月才发一版,很多用户发现刚适配好新内核,过两个月内核更新又把驱动弄坏了。

另外还有一个隐藏问题:部分主板在默认 BIOS 设置下会把网络接口的电源管理模式打开,导致网卡在空闲时进入低功耗状态,系统挂起后恢复时驱动异常,表现为"睡眠后断网""重启后必须冷启动才能识别"。这些和网卡驱动本身强相关,官方驱动相比内核自带的 r8169 在电源管理处理上要成熟一些。

所以我在这篇文章里所有的操作都基于一个原则:官方驱动源码 + DKMS 自动化编译,最大化稳定性,最小化人工干预。

2. 编译前的环境准备:装好这些再动手,能省一半时间

2.1 确认内核头文件和编译工具链

在开始编译网卡驱动之前,系统里必须已经有当前内核对应的头文件。如果头文件版本和运行时内核版本不匹配,编译 100% 会报错,最常见的错误长这样:

Makefile: ... 找不到 generated/autoconf.h

所以第一步,确认内核版本并安装匹配的头文件:

uname -r

假设输出的是5.15.0-91-generic,那么依次执行:

sudo apt update sudo apt install linux-headers-$(uname -r) build-essential dkms

其中linux-headers-$(uname -r)是保证编译驱动时能找到内核构建接口,build-essential提供 gcc/make 整套工具,dkms是我们后面要用的自动编译框架。

顺便说一句,这里有一个常见坑:有些教程让你直接sudo apt install linux-headers-generic,这个包装的是当前推荐版本的通用头文件,如果你的系统内核不是它对应的版本,编译核心模块时依然会报版本不匹配。最稳妥的做法永远是带上$(uname -r)动态匹配。

2.2 提前处理 Secure Boot

这一步真的非常关键,我后来在多个群里帮人排查,发现很多人 R8125 驱动装上之后modprobe加载模块报错,卡的都在这。如果你主板开启了 UEFI Secure Boot,系统内核默认只允许加载经过签名的内核模块,手动编译的驱动没有签名,就会触发拒绝加载。

具体症状是:

modprobe: ERROR: could not insert 'r8125': Required key not available

或者dmesg里出现:

Lockdown: modprobe: unsigned module loading is restricted; see man kernel_lockdown.7

处理方案有两个:

  • 方案 A(推荐):进 BIOS 关闭 Secure Boot。大多数 DIY 用户没有强安全需求,关了省事,一切模块随便加载。
  • 方案 B:保留 Secure Boot,用mokutil导入自定义密钥给模块签名。流程比较复杂,适合企业环境或者非要开 Secure Boot 的朋友。

考虑到这篇博文面向的受众大部分是个人电脑,我建议直接关掉。如果实在不想关,我后面在常见问题章节会单独写签名操作的大概流程。

2.3 从 Realtek 官方获取驱动源码

Realtek 官网的下载链接经常变,但驱动源码的打包命名一般比较规律,通常是r8125-9.xxx.xx.tar.gz这种格式。你可以去 Realtek 官网的"网络界面控制器 / PCIe 接口 / 2.5G Ethernet" 分类下找到 RTL8125 的 Linux 驱动下载入口。下载后得到的是一个压缩包。

假设你下载到的是r8125-9.011.00.tar.bz2,解压:

tar -xjf r8125-9.011.00.tar.bz2 cd r8125-9.011.00

操作之前你最好先看一眼目录内容,尤其是README.md或autorun.sh文件。Realtek 官方驱动包里面自带一个脚本方式的一键安装,但我实测不推荐直接用,原因跟前面说的一样——它只是自动 make 和 make install,没有注册 DKMS。内核一更新照样断网。

3. 编译安装与 DKMS 配置:手把手实操记录

3.1 先手动编译一次,确认源码没问题

我习惯先把驱动模块编译出来跑一遍,确认源码在当前内核下能通过,再进 DKMS 流程。这样如果后续 DKMS 构建失败,你能更快定位是 DKMS 配置的问题还是源码本身的问题。

make clean make -j$(nproc)

-j$(nproc)的意思是用 CPU 所有核心并行编译,速度能快不少。在 8 核 16 线程的机器上,整个编译过程通常 30 秒到 1 分钟就能完成。如果你的网络环境是在装好系统但没驱动的情况下,利用 USB 共享网络或者手机 USB 网络共享先把需要的包全部装好,之后再进入正常流程。

编译完成后,手动加载模块验证当前内核可以直接使用:

sudo insmod src/r8125.ko

然后查看网卡是否出现:

ip link

能看到enp3s0之类的新接口,说明编译出来的模块没问题。这里先不要急着make install,直接用rmmod r8125把模块卸载掉,方便下一步交给 DKMS 接管。

3.2 DKMS 配置文件写法与目录规范

要让 DKMS 能自动帮我们编译安装驱动,需要做两件事:把源码放到 DKMS 管理的源码目录,然后写一个dkms.conf描述编译信息。

先创建源码目录。DKMS 目录命名规范是<模块名>-<模块版本>/,这里模块名用r8125,版本和源码目录里的版本一致,我这里是9.011.00:

sudo mkdir -p /usr/src/r8125-9.011.00 sudo cp -r . /usr/src/r8125-9.011.00/

然后创建/usr/src/r8125-9.011.00/dkms.conf:

sudo vim /usr/src/r8125-9.011.00/dkms.conf

内容如下:

PACKAGE_NAME="r8125" PACKAGE_VERSION="9.011.00" BUILT_MODULE_NAME[0]="r8125" DEST_MODULE_LOCATION[0]="/kernel/drivers/net/ethernet/realtek" AUTOINSTALL="yes" MAKE[0]="make -C ${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build/src clean && make -C ${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build/src" CLEAN="make -C ${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build/src clean"

几个关键点解释一下:

  • BUILT_MODULE_NAME指定编译产出的内核模块叫什么,R8125 官方驱动的模块名就是r8125.ko。
  • DEST_MODULE_LOCATION决定 DKMS 构建完成后把模块安装到内核模块树的哪个子目录,一般放在realtek厂商目录比较规范。
  • MAKE这一行里的${dkms_tree}变量是 DKMS 内置的,指向/usr/src,核心动作是先在源码目录里make clean再执行make,防止旧编译产物污染新构建。
  • AUTOINSTRUCT=yes是灵魂配置,告诉 DKMS 在后续每次内核更新后自动为新内核重新编译模块。这就是"自动编译配置"的核心。

3.3 初始化 DKMS 并验证自动编译链路

源码目录和配置都齐了,接下来执行三条命令,把驱动加入 DKMS 管理:

sudo dkms add -m r8125 -v 9.011.00 sudo dkms build -m r8125 -v 9.011.00 sudo dkms install -m r8125 -v 9.011.00

步骤如下:

  1. dkms add只是把源码登记到 DKMS 的数据库里,不会立刻编译。
  2. dkms build会真正执行编译。这一步如果前面环境准备没做好,就会在这里暴露问题。构建成功的话,输出最后几行是Building module...然后cleaning build area...。
  3. dkms install把编译好的r8125.ko安装到内核模块目录,并刷新模块依赖。

安装完成后,先卸载之前手动加载的模块(如果之前 insmod 过),再重新加载,确保走的是 DKMS 新装的那条路径:

sudo modprobe -r r8125 sudo modprobe r8125

然后确认模块加载状态和网卡识别:

lsmod | grep r8125 ip link show

看到enp3s0之类的网口有UP状态,通常 DHCP 就能获取到 IP 了。检查网络:

sudo dhclient enp3s0

或者直接看 NetworkManager 是否自动弹出连接提示。如果到这里一切正常,恭喜你,2.5G 网卡的驱动部分已经搞定。

3.4 验证 DKMS 自动编译确实生效

很多人做完上面三步以为就完事了,其实漏了最关键的一步:验证 DKMS 真的能在内核升级后自动兜底。我建议用下面的命令确认当前模块在 DKMS 中的状态:

sudo dkms status

输出类似这样:

r8125/9.011.00, 5.15.0-91-generic, x86_64: installed

这个状态说明当前内核的模块已经 installed。未来如果你执行sudo apt upgrade升级了内核,系统重启后你不需要做任何操作,DKMS 会自动对新内核执行一次 build + install。想验证的话可以用sudo dkms status再看一次,你会发现同一版本号下面多出了对应新内核的记录。

如果不小心删除了 DKMS 注册信息,或者某次升级后网卡又消失了,可以手动触发一次:

sudo dkms autoinstall

这个命令会让 DKMS 检查所有已注册模块,对本地所有新内核重新编译缺失的模块。

4. 常见问题排查与避坑技巧实录

4.1 编译报错或加载失败怎么办

我在折腾过程中遇到过几个典型问题,直接列成速查表,你遇到类似情况可以对号入座:

现象排查方向解决方案
dkms build报Makefile: ... 没有那个文件没有安装对应内核头文件执行sudo apt install linux-headers-$(uname -r)
modprobe r8125报Required key not availableSecure Boot 阻止未签名模块关闭 Secure Boot 或用 mokutil 签名
编译成功但ip link没有新网口模块没有自动加载,旧模块冲突sudo modprobe r8125,必要时sudo depmod -a刷新依赖
网卡能识别但协商速率只有 1000Mbps网线质量、路由器端口或 EEE 节能以太网问题换线或使用ethtool -s eth0 speed 2500 duplex full强制速率
系统升级后网卡失效DKMS 注册丢失或新内核编译失败sudo dkms autoinstall,再检查/var/lib/dkms下的日志

这其中有几个值得展开说的经验。

第一个是Secure Boot 问题其实比很多人想得更隐蔽。就算你在 BIOS 里明明记得关掉了 Secure Boot,装完系统之后某些主板(尤其是部分品牌机)会在系统更新完 firmware 之后悄悄把 Secure Boot 重新启用,或者 UEFI 设置里存在"重置安全启动状态"之类的隐藏选项。遇到可疑加载失败问题时,重新进一次 BIOS 检查比在系统里瞎折腾更高效。

第二个是强制 2.5G 速率不一定是好事。Realtek R8125 的协商逻辑在遇到不合格的网线或者对端设备只支持千兆时会自动降级。如果你发现网卡始终只有 1000Mbps,先用ethtool看自我协商的对端能力,而不是盲目强制。强制 2500 速率但链路质量不够可能导致丢包率飙升。

第三个是关于r8169和r8125模块共存的问题。如果系统之前加载过r8169,然后你又手动加载r8125,有可能出现两个模块抢占同一 PCI 设备的情况。安全做法是:

sudo rmmod r8169 sudo modprobe r8125

然后把r8169加入黑名单,避免重启后它抢着绑设备:

echo "blacklist r8169" | sudo tee /etc/modprobe.d/blacklist-r8169.conf

4.2 DKMS 注册太多旧版本导致构建混乱

这种情况我遇到过一次:源代码包更新了几版,我在/usr/src下积累了多个版本目录,同时在 DKMS 里注册了多个同名模块版本。这会导致dkms status输出很长,而且dkms autoinstall会尝试对所有旧版本内核逐个编译,浪费时间和磁盘。

清理方法:

sudo dkms remove -m r8125 -v 旧版本号 --all sudo rm -rf /usr/src/r8125-旧版本号

只保留一个稳定版就好。另外要注意,如果dkms.conf里写的版本号和目录名不一致,dkms add会直接报错,所以每次升级驱动源码时,一定要同时修改目录名和 dkms.conf 里的PACKAGE_VERSION。

4.3 网卡休眠唤醒后失联的问题

这个我在多台设备上遇到过,Sleep 或 Hibernate 后网卡彻底失联,必须重启才能恢复。原因主要是网卡的节能特性与内核电源管理交互不完美。从驱动侧缓解的话,可以用 ethtool 关闭部分节能特性:

sudo ethtool -s enp3s0 wol d

或者用ethtool --set-eee enp3s0 eee off关闭 EEE(Energy Efficient Ethernet)。不过这两个选项在重启后会恢复默认,想持久化的话可以写一个 systemd 服务,或者直接放在/etc/rc.local里执行。

作为一个更省心的方式,很多主板 BIOS 里有关闭 ErP / 深度节能 / 网络唤醒的选项,对于纯台式机用户,直接在 BIOS 里把和网络唤醒相关的选项关掉,是比系统侧调 ethtool 更彻底的办法。我在自己那台机器上就是这样处理的,系统挂起恢复后网卡从来没再掉过链子。

4.4 如何判断你的驱动到底是不是官方的

有几次群里朋友发截图说"我的网卡识别了,但是速度只有 100Mbps",结果让他们跑命令一看,驱动模块名是r8169,固件根本没走 R8125 官方驱动。判断当前网卡被哪个驱动接管:

ls -l /sys/class/net/enp3s0/device/driver

输出会显示驱动的名字,比如:

.../drivers/r8125

看到r8125就是官方驱动接管,看到r8169说明还是内核通用驱动的状态。这一步排查应该在任何网络性能异常之前就先做掉。

5. 从零到稳定使用的完整命令清单

写到这里,我把整个流程压成一份可以直接照抄的操作清单,未来你在别的机器上装 R8125,不用再翻前文,直接按这份清单走就行:

# 1. 安装编译依赖 sudo apt update sudo apt install -y dkms build-essential linux-headers-$(uname -r) # 2. 下载并解压官方驱动源码包(假设文件名为 r8125-9.011.00.tar.bz2) tar -xjf r8125-9.011.00.tar.bz2 cd r8125-9.011.00 # 3. 注册 DKMS sudo mkdir -p /usr/src/r8125-9.011.00 sudo cp -r * /usr/src/r8125-9.011.00/ sudo vim /usr/src/r8125-9.011.00/dkms.conf # 填入前文提供的配置内容 # 4. 构建并安装 sudo dkms add -m r8125 -v 9.011.00 sudo dkms build -m r8125 -v 9.011.00 sudo dkms install -m r8125 -v 9.011.00 # 5. 加载模块并验证 sudo modprobe r8125 ip link # 6. 可选:黑名单 r8169 避免冲突 echo "blacklist r8169" | sudo tee /etc/modprobe.d/blacklist-r8169.conf

实际操作中,唯一可能变化的版本号。只要保持dkms.conf里的版本和/usr/src目录名一致,就不会出问题。

6. 比驱动安装更重要的长期维护习惯

6.1 内核升级后的检查流程

装了 DKMS 不代表可以完全当甩手掌柜,建议每次系统内核升级后养成快速检查的习惯。操作顺序是:

# 更新系统 sudo apt upgrade # 查看当前运行内核 uname -r # 查看系统已安装的内核列表 dpkg --list | grep linux-image # 查看 DKMS 模块状态 sudo dkms status

如果dkms status里新内核对应的记录显示 installed,说明驱动已经自动搞定了。如果显示 build 失败,那就进/var/lib/dkms/r8125/9.011.00/下面看构建日志,最常见的原因是新内核头文件没装齐全,装好之后执行sudo dkms autoinstall一般能救回来。

6.2 备份 dkms.conf,避免再次踩坑

我已经把dkms.conf的内容备份到自己的配置仓库里,连同blacklist-r8169.conf一起。以后重装系统,直接拷贝出来用,省去了重新回忆写法的过程。这一点推荐你也学一下,特别是如果你管理多台 Ubuntu 机器,哪怕只是几台测试机,有一份标准配置能少掉很多头发。

6.3 谁说不需要官方驱动,别急着信

论坛里经常有人安利"Ubuntu 自带 r8169 就行,不用折腾",这个观点在部分主板上是成立的,但在 R8125 上我见过太多翻车案例。也有部分高手会说新内核(6.x)对 R8125 支持已经不错了,确实如此,如果你的内核版本较新,可以先试试不装驱动直接ip link看能不能识别。能识别、速率稳定 2.5G,那确实可以省事。但如果你要求 100% 可控,或者遇到过无故断流,那么官方驱动 + DKMS 始终是最稳的选择。

结合我自己的现行做法,每台 Ubuntu 机器装完系统的第一件事就是把这个 R8125 驱动流程走一遍,已经重复做了七八次,成功率从第一次折腾时的 60% 提升到现在基本一次过。核心就靠两件事:环境准备别跳步,DKMS 配置别想当然。尤其是linux-headers-$(uname -r)和主板的 Secure Boot 状态,这两处只要有一个疏忽,后面大概率浪费时间。

最后分享一个小技巧,很多朋友在编译时喜欢加-j参数加速,但如果是在虚拟机或者低配小主机上编译,反而建议不加并行参数,直接用make,因为并行编译占用内存较多,某些小内存机器甚至会出现 OOM。驱动编译本身也就几十秒,等一会完全无所谓,稳定优先。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询