ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CentOS 7 离线编译安装 Realtek RTL8125 2.5G 网卡驱动全攻略

CentOS 7 离线编译安装 Realtek RTL8125 2.5G 网卡驱动全攻略 简介面向需要在无外网或内网环境下为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 7ifconfig 一看只有 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] nameLocal CentOS 7 ISO baseurlfile:///mnt/cdrom enabled1 gpgcheck0接下来安装编译工具链yum --disablerepo* --enablerepolocal 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别急着 makeRealtek 官方的 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 上我踩过它的坑脚本默认启用 DKMSDynamic 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 CCgcc-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 加载后没设备可绑。处理办法是黑名单 r8169echo 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.confecho 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 模块还依赖其他模块比如mdiodracut 会自动分析依赖并一起打包。如果你之前手动删过/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 -Sethtool -S enp4s0 | grep -E tx_bytes|rx_bytes这个输出里的tx_bytes和rx_bytes是网卡硬件统计的累计字节数和ip -s link里的软件统计不同能反映驱动是否把数据正确交给了硬件。如果这两个数值长时间不增长但 ping 是通的那很可能是驱动中断处理有问题或者是网卡进入了某种省电模式。第二个技巧是检查网卡的中断分布确认多队列RSSReceive 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三板斧确认版本、队列数、硬件计数器都没问题才交付。希望这个习惯对你有用。本文还有配套的精品资源点击获取
返回列表