admin管理员组

文章数量:1516870

Ubuntu 22.04下Realtek R8125网卡驱动安装避坑指南(附DKMS自动编译配置)

最近给家里的主力台式机升级了主板,顺手换上了支持2.5G的Realtek RTL8125网卡。本以为在Ubuntu 22.04 LTS这种成熟的发行版上,驱动应该不是问题,结果却踩了一连串的坑。从系统安装后网卡直接“消失”,到手动编译驱动后重启失效,再到内核升级后驱动“罢工”,整个过程简直像在玩扫雷。如果你也遇到了类似的问题,别担心,这篇文章就是为你准备的。我会从一个实际踩坑者的角度,分享如何一劳永逸地解决R8125网卡在Ubuntu下的驱动问题,特别是利用DKMS(Dynamic Kernel Module Support)实现驱动的持久化,让你再也不用担心内核更新。

这篇文章主要面向有一定Linux使用经验,追求系统稳定性和长期维护便利性的中高级用户。我们不会止步于“能用就行”的临时方案,而是深入探讨如何构建一个健壮的、能伴随系统内核自动更新的驱动环境。除了标准的DKMS配置,我还会分享几个实战中总结出来的技巧,比如如何检测和解决驱动冲突,以及如何设置黑名单来确保系统加载正确的模块。

1. 问题诊断与驱动冲突分析

在开始动手安装任何驱动之前,花几分钟时间搞清楚现状是至关重要的。很多朋友一上来就照着教程敲命令,结果发现网卡还是没反应,或者出现了更奇怪的问题,根本原因就在于没有做好前期诊断。RTL8125网卡在较新的Linux内核中,常常会被一个名为 r8169 的通用驱动错误地“劫持”。这个驱动虽然名字看起来和 r8125 很像,但它实际上是针对Realtek另一系列老款千兆网卡的,用在2.5G的R8125上会导致网卡无法正常工作,或者性能极不稳定。

首先,让我们确认一下你的网卡型号。打开终端,输入以下命令:

lspci -nnk | grep -A3 -i ethernet

你应该会看到类似这样的输出:

04:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller [10ec:8125] (rev 04)
        Subsystem: ASUSTeK Computer Inc. Device [1043:87d0]
        Kernel driver in use: r8169
        Kernel modules: r8169

关键信息解读

  • [10ec:8125] :这是网卡的PCI厂商ID和设备ID,明确无误地指向Realtek RTL8125。
  • Kernel driver in use: r8169 问题所在! 系统当前正在使用错误的 r8169 驱动。
  • Kernel modules: r8169 :系统内核模块列表里也只有 r8169 ,没有我们需要的 r8125

这个状态解释了为什么你的有线网络无法连接。 r8169 驱动无法正确初始化R8125硬件的2.5G功能,导致设备处于“未激活”或“不稳定”状态。你可以再用 ip link 命令查看,很可能根本看不到对应的以太网接口(如 enp4s0 ),或者看到了但状态是 DOWN

注意 :有些情况下, r8169 驱动可能勉强能让网卡工作,但你会遇到网络时断时续、速度远低于2.5G、甚至系统休眠唤醒后网络丢失等问题。这些都是驱动不匹配的典型症状。

所以,我们安装新驱动的第一步,其实包含了两个任务:1. 安装正确的 r8125 驱动;2. 确保系统在启动时不再加载 r8169 驱动 。很多教程只做了第一步,忽略了第二步,这就是为什么很多人安装后重启或升级内核又失效了。

2. 驱动安装前的环境准备与方案选择

在下载和编译驱动之前,我们需要确保系统具备编译内核模块所需的环境。同时,面对网络上众多的安装方法,选择一个适合长期维护的方案至关重要。

2.1 安装编译依赖

无论你选择哪种安装方式,编译环境都是必须的。在终端中执行以下命令来安装必要的软件包:

sudo apt update
sudo apt install --reinstall linux-headers-$(uname -r) build-essential dkms
  • linux-headers-$(uname -r) :安装与当前运行内核版本完全一致的内核头文件,这是编译外部内核模块的基石。 $(uname -r) 会自动获取你的内核版本。
  • build-essential :提供了GCC编译器、make工具链等基础编译组件。
  • dkms :本次的核心工具。它的作用是动态内核模块支持。简单说,当你以后升级内核时,DKMS会自动在后台为新的内核重新编译安装这个 r8125 驱动模块,从而实现驱动的持久化。

2.2 驱动安装方案对比与选择

网上常见的安装方法主要有三种,它们的优缺点对比如下:

方案 操作方法 优点 缺点 适用场景
一键脚本安装 运行驱动包内的 autorun.sh 极其简单,一步到位 临时性方案 。重启或内核升级后失效,需要重新运行。 快速测试,临时使用。
手动编译安装 进入源码目录,执行 make && sudo make install 直接,能立即生效 无持久化 。内核升级后驱动丢失,需要手动重装。 了解编译过程,不打算升级内核的系统。
DKMS集成安装 创建 dkms.conf 配置文件,通过DKMS管理 一劳永逸 。内核升级自动重编译驱动。 前期配置稍复杂。 生产环境、追求稳定的个人工作站首选。

显然,为了彻底解决问题,我们选择 DKMS集成安装 方案。这个方案前期多花5分钟配置,换来的是未来无数次内核升级的省心。接下来,我们将分步详解这个过程。

3. 获取驱动源码与DKMS标准配置流程

你可以从Realtek官网下载驱动,但官网的布局对于寻找特定Linux驱动并不友好。更便捷的方式是使用GitHub上维护的DKMS包,它通常包含了适配好的配置,甚至整合了多个版本的驱动源码。这里我推荐 awesometic/realtek-r8125-dkms 这个仓库。

3.1 下载驱动源码

打开终端,执行以下命令克隆仓库:

git clone 
cd realtek-r8125-dkms

进入目录后,你可以看到里面已经包含了驱动源码和关键的 dkms.conf 文件。如果你坚持使用Realtek官方源码,需要去官网找到对应版本(例如 r8125-9.009.01.tar.bz2 )下载并解压到 /usr/src/ 目录下。但为了流程的统一和减少出错概率,我强烈建议使用上述GitHub仓库。

3.2 创建并配置DKMS配置文件

DKMS的核心就是这个 dkms.conf 文件。它告诉DKMS系统:这个模块叫什么、版本是什么、源码在哪里、如何编译。在克隆的仓库里,这个文件已经存在。但理解其内容对于排查问题非常有帮助。让我们看一下一个典型的 dkms.conf 内容:

PACKAGE_NAME="r8125"
PACKAGE_VERSION="9.009.01"
BUILT_MODULE_NAME[0]="$PACKAGE_NAME"
DEST_MODULE_LOCATION[0]="/updates/dkms"
AUTOINSTALL="yes"
MAKE[0]="'make' -C src/ all"
CLEAN="'make' -C src/ clean"
  • PACKAGE_NAME PACKAGE_VERSION :定义了模块的名称和版本,这是DKMS识别和管理它的依据。
  • BUILT_MODULE_NAME[0] :指定编译后生成的模块文件名(不含 .ko 后缀)。
  • DEST_MODULE_LOCATION[0] :指定编译好的模块安装到内核模块目录的哪个子路径下。 /updates/dkms 是一个常见位置,优先级高于系统自带模块。
  • AUTOINSTALL="yes" 最关键的一行 。设置为 yes 后,每当系统安装新内核时,DKMS会自动尝试为此新内核重新编译并安装此模块。
  • MAKE[0] CLEAN :定义了编译和清理所用的命令。

如果你使用的是官方源码,你需要手动在源码目录(如 /usr/src/r8125-9.009.01/ )创建这个文件。如果使用GitHub的DKMS包,这一步可以跳过。

3.3 执行DKMS编译与安装

配置好 dkms.conf 后,就可以将模块添加到DKMS系统并进行编译安装了。在驱动源码目录(即包含 dkms.conf 的目录)下,执行以下命令序列:

# 将模块添加到DKMS管理树中
sudo dkms add -m r8125 -v 9.009.01
# 为当前内核编译模块
sudo dkms build -m r8125 -v 9.009.01
# 将编译好的模块安装到当前内核
sudo dkms install -m r8125 -v 9.009.01

请确保 -v 参数后的版本号与 dkms.conf 中的 PACKAGE_VERSION 完全一致。执行成功后,你可以用以下命令验证DKMS状态:

dkms status

输出应类似:

r8125, 9.009.01, 5.15.0-91-generic, x86_64: installed

这表明 r8125 驱动版本 9.009.01 已经为内核 5.15.0-91-generic 成功安装。

最后,手动加载新驱动模块,并更新模块依赖关系:

sudo modprobe r8125
sudo depmod -a

现在,再次运行 ip link 命令,你应该能看到一个新的以太网接口(例如 enp4s0 )出现,并且状态可能是 UP DOWN 。使用 lspci -nnk 查看, Kernel driver in use 应该已经变成了 r8125

4. 解决驱动冲突与黑名单永久设置

完成上一步,你的网卡在本次开机应该已经能工作了。但如果你现在重启,有很大概率会发现网卡又失灵了。这是因为在系统启动的早期阶段,内核可能仍然自动加载了那个“讨厌”的 r8169 通用驱动,它抢占了我们的R8125硬件,导致 r8125 驱动无法正常接管。

为了解决这个问题,我们需要将 r8169 驱动加入系统的 黑名单 ,阻止它在启动时加载。

4.1 创建黑名单配置文件

/etc/modprobe.d/ 目录下创建一个配置文件,例如 blacklist-r8169.conf

sudo nano /etc/modprobe.d/blacklist-r8169.conf

在文件中添加以下内容:

# 禁止自动加载与Realtek RTL8125冲突的r8169驱动
blacklist r8169

保存并退出编辑器(在nano中按 Ctrl+X ,然后按 Y 确认,再按回车)。

这个操作的意义是 :告诉Linux内核的模块加载系统,在任何情况下都不要自动加载名为 r8169 的模块。这并不会删除这个模块,只是禁止其自动加载。

4.2 更新初始RAM磁盘镜像

黑名单配置需要被整合到系统启动时使用的初始RAM磁盘镜像(initramfs)中才能生效。执行以下命令来更新它:

sudo update-initramfs -u

这个命令会重新生成启动镜像,将新的黑名单规则包含进去。

4.3 验证与重启

在重启之前,我们可以先手动验证一下黑名单是否已生效,并卸载可能已加载的 r8169 模块:

# 检查r8169模块是否正在使用
lsmod | grep r8169
# 如果上面命令有输出,说明模块已加载,尝试卸载它(如果网卡现在由r8125驱动,则可以卸载)
sudo modprobe -r r8169
# 再次检查r8125模块是否已加载
lsmod | grep r8125

现在,可以放心地重启你的系统了:

sudo reboot

系统重启后,再次登录,请按顺序执行以下检查:

  1. 检查驱动加载 lsmod | grep r8125 应该显示 r8125 模块已加载。 lsmod | grep r8169 应该没有输出。
  2. 检查PCI设备驱动绑定 lspci -nnk | grep -A3 -i ethernet 应该显示 Kernel driver in use: r8125
  3. 检查网络接口 ip link show 应该能看到你的有线网卡接口(如 enp4s0 ),并可以尝试用 sudo dhclient enp4s0 获取IP地址(如果你使用DHCP),或者配置静态IP。

至此,你已经成功安装并永久配置好了Realtek R8125网卡驱动。无论是日常重启,还是未来通过 sudo apt upgrade 升级系统内核,你的网卡驱动都会通过DKMS自动保持可用状态。

5. 高级维护、故障排查与性能调优

即使一切配置妥当,了解如何进行日常维护和问题排查也是必要的。此外,对于2.5G网络,一些简单的调优可能带来更好的体验。

5.1 DKMS日常管理命令

掌握几个常用的DKMS命令,便于管理:

  • 查看所有DKMS模块状态 dkms status 。这是你最常用的命令,确保 r8125 显示为 installed
  • 卸载某个版本模块 :如果未来需要升级驱动版本,可能需要先移除旧版。例如: sudo dkms remove r8125/9.009.01 --all
  • 仅为新内核重新编译 :如果驱动安装后内核又更新了,可以手动触发编译: sudo dkms install -m r8125 -v 9.009.01 -k 新内核版本号

5.2 常见故障排查

如果某次内核升级后网络再次失效,请按此流程排查:

  1. 检查DKMS状态 dkms status | grep r8125 。如果状态不是 installed ,而是 built 或没有记录,说明自动编译安装可能失败了。可以尝试手动执行 sudo dkms install -m r8125 -v 你的版本号
  2. 检查内核头文件 :自动编译失败常见原因是新内核的头文件未安装。运行 sudo apt install linux-headers-$(uname -r) 后再试。
  3. 检查黑名单 :确认 /etc/modprobe.d/blacklist-r8169.conf 文件内容是否正确。
  4. 查看内核日志 :使用 dmesg | grep r8125 sudo journalctl -k | grep r8125 查看驱动加载时的详细日志,可能包含错误信息。

5.3 网络性能基础调优

对于2.5G网络,确保你的网线(至少Cat5e,推荐Cat6)、交换机或路由器端口也支持2.5G。在系统内,可以使用 ethtool 工具进行一些检查和设置:

# 安装ethtool(如果尚未安装)
sudo apt install ethtool
# 查看网卡详细信息,关注“Speed”和“Duplex”
sudo ethtool enp4s0
# 如果协商速度不对,可以尝试强制设置(慎用,可能导致断开)
# sudo ethtool -s enp4s0 speed 2500 duplex full autoneg off
# 启用巨帧(Jumbo Frames),如果你的局域网设备都支持,可以提升大文件传输效率
# sudo ip link set dev enp4s0 mtu 9000

提示 :修改MTU(巨帧)等高级设置前,请确保网络中的所有设备(交换机、另一台电脑等)都支持相同的MTU值,否则会导致网络不通。

整个配置过程中,最深的体会就是:在Linux桌面环境使用较新的硬件,有时确实需要一点“运维”思维。不能指望所有驱动都开箱即用,但通过DKMS这样的机制,我们可以把一次性的配置成本转化为长期的自动化便利。我的这台机器在配置好后,已经安然度过了数次内核安全更新,每次重启后2.5G网络都稳稳当当,再也没有出现过需要重新折腾驱动的情况。如果你在跟随本文操作时遇到了上面没覆盖到的问题,不妨多利用 dmesg 日志和DKMS的详细输出( sudo dkms build -m r8125 -v x.x.x.x --verbose )来寻找线索,大部分编译或加载错误都能从中找到答案。

本文标签: 执行以下命令编程