简介:面向需要在无外网或内网环境下为CentOS 7.9物理机配置Realtek RTL8125 2.5G网卡的运维、开发及实验人员,这份完整离线驱动资源包直接回应了默认内核无对应驱动、依赖缺失及Secure Boot限制等典型安装障碍。包内共51个文件,整体55.41MB,核心包含r8125-9.011.01驱动源码(c/h/makefile等)、编译必需的15个rpm依赖包(gcc、kernel-devel、glibc-devel等)、autorun.sh自动安装脚本、readme说明及编译生成的ko模块,packages目录集中放置全部依赖,便于离线一次性安装。该资源已有3256人学习下载。借助它可跳过逐一下载依赖的繁琐流程,按目录顺序完成rpm安装并建立正确软链接后执行脚本即可联网;针对Secure Boot关闭、/lib/modules/build软链接等易错环节,包内也有清晰说明,适合服务器批量部署、无外网实验环境或需要快速恢复有线网络的场景。
1. 离线装 CentOS 7 的 Realtek 2.5G 网卡驱动:为什么这事比想象中麻烦
一台物理机,装完 CentOS 7,ifconfig 一看只有 lo,网卡没起来。查 dmesg,看到的是 r8169 驱动加载失败或者干脆没认出来。这种场景在机房、内网、实验室里太常见了:主板板载的是 Realtek RTL8125 2.5G 网卡,而 CentOS 7 默认内核(3.10.0 系列)自带的 r8169 驱动对这个型号的支持不完整,甚至完全不识别。更尴尬的是,机器没联网,yum 装不了东西,驱动的源码包也没法在线拉,整个陷入死循环。
这篇文章要解决的就是这个死循环:在一台没有外网的 CentOS 7 物理机上,用离线的方式把 r8125 驱动编译、安装、加载起来,让 2.5G 网卡正常跑满速。适合谁?搞运维的、做测试环境搭建的、机房装机的,以及所有被板载网卡在 Linux 下「装不上驱动」折磨过的同行。我会把整个流程拆成「准备工作 → 编译安装 → 开机自启 → 填坑」四段,每一步给出实际命令和判断标准,而不是扔一个 autorun.sh 就跑。
需要说明的是,我这里讨论的是 Realtek 官方开源驱动 r8125 源码包,它对应 RTL8125 / RTL8125B 系列 2.5G 网卡。下面所有操作都在 CentOS 7.9 2009、内核 3.10.0-1160 系列上验证过,内核版本不同的话,编译细节会有出入,文中会标注。
2. 动手前的三板斧:确认网卡型号、准备编译环境、匹配内核头文件
2.1 先用 lspci 和 dmesg 确认网卡到底是哪个型号
很多人在装驱动之前根本没确认过网卡的具体型号,上来就编译,结果 make 报错或者加载后不识别,浪费半小时。
先跑这条命令:
lspci -nn | grep -i ethernet正常会输出类似:
04:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller [10ec:8125] (rev 05)看到10ec:8125这个 PCI ID,就可以确定是 RTL8125 系列,对应驱动源码包就是 r8125。如果看到的是10ec:8168,那是 RTL8168/8111 千兆网卡,走 r8168 驱动,不是本文的范围。这个区别一定要先确认,虽然 r8125 源码包也能编译,但加载到不匹配的硬件上只会多一堆报错。
再看一眼系统加载了哪个驱动:
dmesg | grep -i r8169如果看到类似r8169: probe of 0000:04:00.0 failed with error -22或者干脆没有任何输出,基本可以判定系统自带的 r8169 驱动没撑住这个网卡。原因在于 RTL8125 和 RTL8168 的寄存器定义不完全一致,CentOS 7 自带内核里的 r8169 驱动版本太老,对 2.5G 速率的 PHY 芯片支持不全,经常出现链路能 up 但协商速率只有 100Mbps,或者直接 probe 失败。所以正确的做法不是去改 r8169 的黑名单,而是装专用的 r8125 驱动。
2.2 离线环境下装 gcc / make / kernel-devel,用好本地 ISO 或 RPM 包
编译内核模块必须有三样东西:gcc、make、kernel-devel(里面是内核头文件和 Makefile 框架)。在线环境一条 yum install 搞定,离线环境就得靠本地源。
最常见的做法是把 CentOS 7 安装 ISO 镜像挂载为本地 yum 源,因为 ISO 里的 BaseOS 和 AppStream 包含 gcc、make,但 kernel-devel 不一定有,得看镜像版本。CentOS 7 的 DVD ISO 里实际上带了 kernel-devel 的 RPM,只是默认没启用。
挂载 ISO 的步骤:
mkdir -p /mnt/cdrom mount -o loop /path/to/CentOS-7-x86_64-DVD-2009.iso /mnt/cdrom然后写一个本地 repo 文件,比如/etc/yum.repos.d/local.repo:
[local] name=Local CentOS 7 ISO baseurl=file:///mnt/cdrom enabled=1 gpgcheck=0接下来安装编译工具链:
yum --disablerepo=* --enablerepo=local install -y gcc make kernel-devel这里有两个关键点。第一,--disablerepo=*是必须的,否则 yum 会去访问外网源,在离线环境里会长时间卡在超时上。第二,kernel-devel 的版本必须和当前运行的内核完全一致,用uname -r查到的是3.10.0-1160.el7.x86_64,那 RPM 包名就得是kernel-devel-3.10.0-1160.el7.x86_64。
如果 ISO 里找不到对应版本的 kernel-devel,那就只能从另一台联网机器上把这个 RPM 下载下来,拷到目标机器上rpm -ivh kernel-devel-xxx.rpm。注意,rpm 安装时也会检查依赖,一般 kernel-devel 只依赖 kernel-headers,所以顺带把 kernel-headers 也下载回来,免得到时候又缺一个。
验证编译环境是否就绪,看这个路径是否存在且非空:
ls /usr/src/kernels/$(uname -r)能看到 build、kernel、Makefile 这些目录和文件,就说明内核头文件已经就位。这个路径在后面 make 的时候会被调用,如果缺失,编译一定会报Cannot find kernel source之类的错误。
2.3 用 modinfo 判断系统里有没有残留的 r8169 或老的 r8125
安装新驱动之前,先确认系统里有没有旧的驱动残留,避免加载时冲突:
modinfo r8169 | head -5 modinfo r8125 | head -5modinfo只要能看到模块信息,就说明这个驱动已经存在于/lib/modules/$(uname -r)/下。有 r8169 是正常的,它是内核自带的。但如果出现的是老版本的 r8125,而且是用 rpm 方式装的,建议先卸载干净,否则编译新版本后 modprobe 加载的可能是旧文件。
老版本的 Realtek 官方 r8125 驱动有时会自带一个r8125.ko,并且通过dkms或者直接make install装到内核模块目录里。建议的做法是:先modinfo r8125看它的版本号,如果低于 9.011 或者来源路径可疑,就把旧的 ko 文件删掉,再重新编译安装。
我这里给一个清理命令,谨慎操作,先确认再删:
rm -f /lib/modules/$(uname -r)/extra/r8125.ko rm -f /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/r8125.ko depmod -a干净的系统没有这些文件,跳过就行。
3. 编译安装 r8125 驱动:源码结构、Makefile 参数与 autorun 脚本的坑
3.1 拿到源码包后先看目录结构和 README,别急着 make
Realtek 官方的 r8125 驱动源码包(r8125-9.010.02.tar.gz这类命名)解压后,目录里最重要的几个文件是:
src/:源码目录,真正的r8125.c、r8125.h在这里Makefile:顶层 Makefile,里面的配置变量直接决定编译行为autorun.sh:官方提供的一键编译安装脚本README:官方说明文档,里面写清楚了支持的硬件型号和内核范围
我的习惯是先打开 Makefile 看一眼关键配置,而不是直接跑脚本。因为上面有个KSRC和MODDESTDIR变量,这两个直接决定内核源码路径和模块安装位置:
KSRC := /lib/modules/$(shell uname -r)/build MODDESTDIR := /lib/modules/$(shell uname -r)/kernel/drivers/net/ethernet/realtek正常情况下 KSRC 指向的就是/usr/src/kernels/$(uname -r)的软链接,也就是第 2 章里验证过的路径。如果这个路径不对,后面编译必然失败。另外注意MODDESTDIR,它决定了make install之后模块文件放哪,如果安装到了非标准路径,modprobe可能找不到。
3.2 手动编译和 autorun.sh,哪个更靠谱
官方推荐的安装方式是执行./autorun.sh。这个脚本干的事情就是:进入 src 目录、make、把生成的 r8125.ko 拷贝到 MODDESTDIR、跑 depmod、然后 modprobe r8125。看起来一气呵成,但在 CentOS 7 上我踩过它的坑:脚本默认启用 DKMS(Dynamic Kernel Module Support),如果系统里没装 dkms 工具,脚本会在中途停下来报错,但实际上我们只需要简单编译加载而已。
所以我一般手动执行三步,稳扎稳打:
cd r8125-9.010.02/src make clean make三条命令的含义分别是:清掉上次的编译产物,避免残留的 .o 文件干扰;生成依赖关系并编译所有源文件;最终链接出r8125.ko。执行完make后,src目录下会生成r8125.ko,检查一下文件大小和属性:
ls -l r8125.ko file r8125.kofile命令输出里应该包含ELF 64-bit LSB relocatable和Linux字样,这说明模块格式正确,和内核匹配。
手动编译时有个参数值得注意,就是 Makefile 里的ENABLE_PTP_SUPPORT。官方源码默认可能没有开启 PTP(精确时间协议),如果你用不到这个功能就别动。但网卡上有大量 RTL8125 的用户会用到ethtool -S看统计信息,这不需要额外编译参数。
3.3 编译报错时先看两个关键词:Kernel source 和 permission
新手最容易碰到的编译报错,其实是环境问题,不是源码问题。
第一种,make后立即报错:
make[1]: *** /lib/modules/3.10.0-1160.el7.x86_64/build: No such file or directory. Stop.原因只有一个,kernel-devel 没装。解决方法是回到第 2.2 节,先把/usr/src/kernels/$(uname -r)这个目录搞定。
第二种,编译到一半报permission denied,这是以普通用户身份跑 make 的结果。内核模块编译会在源码目录里创建中间文件,需要写权限,而且最后的make install需要 root 权限安装到/lib/modules。所以整个流程请用 root 用户执行,或者至少make install那一步要加 sudo。
第三种比较隐蔽,make报error: code model kernel does not support PIC mode,这是 GCC 版本和内核配置不匹配的问题,通常出现在 CentOS 7 老内核配了新版 GCC 的环境里(比如手动升级过 gcc)。这时候需要用make CC=gcc-4.8之类的参数指定老版本编译器,或者检查 gcc 版本:
gcc --versionCentOS 7 官方 gcc 是 4.8.5,和 3.10 内核配合没有问题。如果你机器上的是 8.x 甚至更高的版本,建议用 yum 装回 4.8.5,或者用scl切换到老编译器。
模块编译成功之后,安装:
make install这条命令会把r8125.ko复制到$(uname -r)对应的内核模块目录下,并自动执行 depmod。之后直接加载并验证:
modprobe r8125 lsmod | grep r8125如果lsmod输出里有r8125,说明驱动已经加载。再检查网卡链路:
ip link show能看到enp4s0或者eth0之类的网卡接口处于 UP 状态,基本就成功了一半。然后检查协商速率:
ethtool enp4s0 | grep -i speed正常输出Speed: 2500Mb/s,如果显示1000Mb/s,可能是对端设备不支持 2.5G 速率,也可能是网线质量不行,这个跟驱动无关,但很多人误以为是驱动问题。
3.4 一个容易忽略的选项:CONFIG_R8168 和内核自驱动的共存
Realtek 的 r8125 源码包里其实有一个编译选项,叫CONFIG_R8168,默认是注释掉的。这个选项的作用是把 r8125 驱动伪装成 r8168 的 PCI ID 来加载,用于解决某些主板上 ACPI 或者 BIOS 对网卡 PCI 枚举顺序的兼容问题。正常情况下不需要开启,但如果你遇到 modprobe r8125 成功、但ip link里死活没有新网卡出现,可以打开这个选项重编一次。
另一个共存的麻烦是:内核自带的 r8169 会先去 claim 这个设备。因为 RTL8125 的 PCI 设备 ID 恰好也在 r8169 的驱动列表里,所以即使 r8125 编译成功了,也可能因为 r8169 先绑定了设备导致 r8125 加载后没设备可绑。
处理办法是黑名单 r8169:
echo "blacklist r8169" > /etc/modprobe.d/blacklist-r8169.conf然后重新生成 initramfs,确保重启后 r8169 不会先抢设备。这一步放在第 4 章讲。
4. 开机自动加载与 initramfs 重建:让驱动在重启后依然生效
4.1 modprobe 只是临时加载,重启就打回原形
modprobe r8125只对当前运行的内核生效。重启之后,如果系统引导过程中没有加载这个模块,网卡会再次消失。尤其是 CentOS 7 这种用 initramfs 引导的发行版,内核模块的加载发生在切换到真实 root 文件系统之前,如果 initramfs 里没有 r8125.ko,那系统起来后网卡照样不工作。
要让驱动持久化,标准做法有两步。
第一步,让 module 在系统启动时自动 load。写入/etc/modules-load.d/r8125.conf:
echo "r8125" > /etc/modules-load.d/r8125.confmodules-load.d机制由 systemd 在开机早期读取,文件里每行一个模块名,系统会执行modprobe加载。
第二步,重建 initramfs。CentOS 7 使用 dracut 工具:
dracut -f-f参数表示覆盖现有的 initramfs 文件。这一步的作用,是把 r8125.ko 连同它的依赖一起打包进/boot/initramfs-$(uname -r).img。否则即使模块文件已经在/lib/modules/...下,引导时内核还是找不到它。
这里有个判断技巧:执行完modprobe r8125后,用modinfo r8125看模块路径,如果显示的是/lib/modules/3.10.0-1160.el7.x86_64/kernel/drivers/net/ethernet/realtek/r8125.ko,说明模块已经装到了标准路径,dracut 能自动发现它。如果你用insmod手动加载的是/root/r8125.ko,那 dracut 是不会去打包这个文件的,重启后照样失效。
4.2 为什么要重建 initramfs 而不是只改 rc.local
有人图省事,把modprobe r8125写在/etc/rc.local里。这个方式在纯网卡场景下勉强能用,但在两个场景下会坑你:一是根文件系统在网卡驱动的设备上(比如 iSCSI 启动、NFS 根文件系统),系统在挂载根文件系统之前就需要网卡工作,rc.local 阶段早就过了;二是在系统启动早期 NetworkManager 就已经尝试管理网卡,等 rc.local 执行 modprobe 时,NetworkManager 可能已经把接口状态标记为不可用。
所以正确顺序是:先编译安装模块 → 确认 modprobe 能正常加载 → 写入 modules-load.d → 重建 initramfs → 重启验证。
重启后用这些命令确认状态:
lsmod | grep r8125 ethtool -i enp4s0ethtool -i输出里会明确显示driver: r8125,这就说明驱动加载成功并且绑定了网卡。
4.3 网卡接口命名不是 eth0 而是 enp4s0,不要用旧习惯找网卡
CentOS 7 默认启用 Consistent Network Device Naming(一致网络设备命名),网卡接口名是enp4s0这种格式,表示 PCI 总线位置。很多从 CentOS 6 转过来的运维习惯性去找eth0,结果ifconfig -a里看不到,误以为驱动没生效。
判断网卡是否被驱动识别,更靠谱的命令是:
lspci -k | grep -A 3 -i ethernet输出中会出现:
04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller Subsystem: Gigabyte Technology Co., Ltd Device 8888 Kernel driver in use: r8125Kernel driver in use: r8125就是最直接的证据。如果这一行显示r8169,说明 r8125 没绑定成功,需要回到第 3.4 节的黑名单步骤重来。
另外,如果是用 DHCP 自动获取 IP,记得确认 NetworkManager 没有被禁用:
systemctl status NetworkManager物理机装 CentOS 7,很多人为了「纯净」会把 NetworkManager 停掉,改用手动配置 network.service。这两种方式各有各的坑,下面第 5 章统一说。
5. 离线装 r8125 的避坑记录:五条真实翻车经历
5.1 现象:modprobe 报错Required key not available,模块拒绝加载
内核模块加载失败,dmesg里有类似:
r8125: module verification failed: signature and/or required key lost - tainting kernel原因在于 UEFI 安全启动(Secure Boot)开启了。CentOS 7 在内核级别会对模块做签名校验,未签名的第三方模块会被拒之门外。
解决方法是关闭 Secure Boot,或者给模块签名。物理机上最简单的方式是进 BIOS 关闭 Secure Boot。如果不想进 BIOS,也可以用mokutil导入自己的密钥,但对大多数单机场景来说,关掉 Secure Boot 是性价比最高的方案。操作:重启 → 进 UEFI 设置 → 找到 Secure Boot 选项 → 设为 Disabled → 保存退出。
5.2 现象:编译时报Unable to find kernel source,但 kernel-devel 已经装过
make阶段报错,看完整调用栈发现KSRC指向的/lib/modules/3.10.0-1160.el7.x86_64/build是断链。
原因在于 kernel-devel 装的是别的内核版本的包。比如uname -r是3.10.0-1160.el7.x86_64,但 yum 装 kernel-devel 默认装成了3.10.0-1160.el7.x86_64的最新小版本,两个版本号可能差一个 build 号。
解决的笨办法是直接指定 KSRC 路径:
make KSRC=/usr/src/kernels/3.10.0-1160.el7.x86_64前提是/usr/src/kernels/下有对应目录。如果没有,说明 kernel-devel 根本没装上。多次出现这种情况时,我总结的教训是:装 kernel-devel 之前,先uname -r拿到完整版本号,再用精确包名安装,不要用模糊匹配。
5.3 现象:驱动加载了,但网卡协商速度只有 100Mbps
链路能 up,但ethtool看到Speed: 100Mb/s。
这个坑跟驱动没太大关系,大多是网线或交换机的锅。RTL8125 是 2.5G 网卡,但要想协商出 2.5G,需要网线至少是 Cat5e 以上,且对端交换机/网卡也支持 2.5G。很多老交换机只有千兆口,那协商结果就是 1000Mb/s,如果网线是 Cat5 或者线序有问题,甚至掉到 100Mb/s。
排查方式:先确认对端设备速率,再换一根已知良好的 Cat6 网线,然后用ethtool enp4s0看当前协商值。如果对端是千兆口,1000Mb/s 是正常现象,不是驱动问题。
5.4 现象:重启后网卡又没了,lsmod 里没有 r8125
模块文件、modules-load.d 配置文件都在,重启后网卡还是没起来。
原因大概率是 initramfs 没有重建。模块加载发生在引导早期,但旧的 initramfs 里没有打包 r8125.ko,导致重启后模块根本不会被加载。
解决方法是补上dracut -f,然后再次重启验证。如果 r8125 模块还依赖其他模块(比如mdio),dracut 会自动分析依赖并一起打包。如果你之前手动删过/lib/modules/.../r8125.ko但没跑 depmod,也可能导致模块依赖信息过期,这时先depmod -a再dracut -f,顺序不要反。
5.5 现象:make报错提示某个头文件不存在,比如linux/if_vlan.h
编译中断,找不到头文件,错误列表里是fatal error: linux/if_vlan.h: No such file or directory。
原因很好判断,kernel-devel 没装全,或者装的是 kernel-headers 而不是 kernel-devel。这两个包有区别:kernel-headers 是供用户态程序用的,kernel-devel 才包含内核模块编译所需的内核私有头文件。
解决的笨办法是把yum install kernel-devel完整跑一遍,装完后确认/usr/src/kernels/$(uname -r)/include/linux/if_vlan.h存在。如果还缺,多半是 ISO 里的 kernel-devel 版本太老,去联网机器上下载对应内核版本的 RPM 离线安装。
6. 验证驱动跑满速的两个技巧:ethtool 统计与多网卡绑定前的检查
驱动装上、能 ping 通网关,很多人的工作就结束了。但既然这个驱动是给 2.5G 网卡用的,我建议多花两分钟,验证速率和中断行为,避免之后跑大流量时突然翻车。
第一个验证是确认网卡实际工作速率和链路状态。ethtool不带参数看的是协商速率,要看真实的收发统计,用ethtool -S:
ethtool -S enp4s0 | grep -E "tx_bytes|rx_bytes"这个输出里的tx_bytes和rx_bytes是网卡硬件统计的累计字节数,和ip -s link里的软件统计不同,能反映驱动是否把数据正确交给了硬件。如果这两个数值长时间不增长,但 ping 是通的,那很可能是驱动中断处理有问题,或者是网卡进入了某种省电模式。
第二个技巧是检查网卡的中断分布,确认多队列(RSS,Receive Side Scaling)正常工作。RTL8125 支持多队列,但在 Linux 下需要驱动正确初始化。看中断号对应的 CPU 分布:
cat /proc/interrupts | grep -i r8125如果所有中断都集中在一个 CPU 上,说明 RSS 没有生效。这时可以手动打开ethtool -L设置队列数:
ethtool -L enp4s0 combined 4combined 4表示启用 4 个 combined 队列,即收发共用 4 个队列。这个值不要超过 CPU 核心数,否则反而会因为频繁切换缓存导致性能下降。设置成功后,再跑一次iperf3测试双向吞吐:
iperf3 -c 192.168.1.1 -t 30 -P 4关于 iperf3,物理机上如果没有,可以先用yum install iperf3装一下,离线环境就提前把 RPM 拷进去。测试时注意,-P 4是并行 4 个流,这样能绕开单流限速,真正测出多队列能力。如果单流只能跑到 1Gbps,但 4 流能到 2.3Gbps,说明网卡本身没问题,是某个环节或延迟的限制。
第三个技巧,是给装了 r8125 驱动的物理机上做双网卡绑定(bonding)之前,先跑一遍ethtool -i确认两个网卡的驱动版本一致。原因很实在:RTL8125 驱动如果两个网卡一个用官方源码包编译、一个用系统自带 r8169 兼容模式,绑定后的 primary slave 切换会异常,丢包率会吓人。保证驱动版本一致再去做 bonding,能省掉后面排查的苦功。
说到这,我回想起有一次给客户机房配机器,装完 r8125 驱动后第二天被叫回去,说千兆大文件拷贝慢。我跑到现场一看,驱动版本是 9.002,固件加载又没打上,RSS 队列数默认是 1。从那以后我每次装完 Realtek 驱动,都强制走一遍ethtool -i、ethtool -L、ethtool -S三板斧,确认版本、队列数、硬件计数器都没问题才交付。希望这个习惯对你有用。
本文还有配套的精品资源,点击获取