简介:Realtek RTL8125 2.5G网卡驱动离线安装包,面向需要在物理机上运行CentOS 7系统、且外网受限的运维人员,用于解决网卡无法识别、无法联网的典型问题。压缩包共51个文件,其中15个rpm依赖包覆盖gcc编译器、kernel-devel内核开发包、glibc运行库等组件,为离线编译提供基础工具链;另有驱动核心源码的c/h文件、makefile编译配置、编译生成的ko内核模块以及自动化安装sh脚本,整体大小55.41MB,能够完整覆盖从环境准备到驱动加载的全部环节。已有3256人学习、下载,说明该场景在CentOS 7用户中具有一定普遍性。资源包将r8125官方驱动与各类编译依赖统一整合,省去逐一查找rpm包或源码的步骤,也无需配置yum源即可离线完成安装;同时兼顾Secure Boot导致驱动无法加载等常见问题,适合物理机网卡驱动部署与应急联网恢复时使用。
1. 物理机装CentOS7装完发现没有2.5G网卡:离线安装r8125驱动就是一场自救
给一台物理机装 CentOS7,系统起来后ip link里只有 lo,板载的 Realtek 2.5G 网卡根本没出现。查lspci确认是 RTL8125 芯片,而 CentOS7 自带的内核驱动 r8169 对这个芯片支持不完整,驱动加载失败。更尴尬的是这台机器没有其它网口,也没有可用的软件源,陷入“没驱动就没网,没网就装不了驱动”的死循环。这就是离线安装物理机 CentOS7 系统 Realtek2.5G 网卡驱动(r8125) 的经典起点。下面把驱动选型、源码编译、安装引导阶段注入和踩坑排查一次性讲清楚,适合和我一样要跟物理机离线环境死磕的运维。
2. 先认清网卡芯片和内核依赖:r8125离线驱动包选型前要做的四件事
2.1 为什么CentOS7默认的r8169驱动救不了RTL8125
CentOS7 默认带的以太网驱动模块是 r8169,它主要对应 Realtek 的千兆 PCIe 网卡 RTL8168/8111 系列。RTL8125 是 Realtek 的 2.5G 多千兆网卡,芯片内部的 PHY 配置、中断处理、电源管理和 EEE 节能逻辑都和 8168 差了不少。内核社区的 r8169 驱动虽然试图向后兼容,但在 3.10 这种老内核上,对 RTL8125 的识别经常半失灵:要么模块加载后网卡不亮,要么链路能起来但速率锁死在 1000Mbps,甚至会出现 dmesg 里反复报 timeout。
解决这个问题不能靠改内核参数,得用 Realtek 官方发布的 r8125 源码包自己编译。这个源码包编译出的内核模块名同样叫 r8125,和驱动的包名一致。它的 Makefile 会针对当前内核版本做适配,比老 r8169 多出了针对 2.5G 的 PHY 初始化代码。选型时要注意:不要看到 Realtek 就下 r8168,也不要拿某些第三方打包好的 r8125 RPM 直接装,因为 RPM 里的模块可能编译时用的内核 config 和你机器不一样,离线装完照样翻车。
在动手之前,先确认网卡确实是 RTL8125。物理机上敲一下:
lspci -nn | grep -i realtek输出里如果能看到类似10ec:8125的 PCI ID,就说明这是 RTL8125。有些主板会显示为Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller,那就更确定了。顺便把lspci -v -s <设备号>看一下当前真正加载的驱动是内核模块还是空着,如果显示Kernel driver in use: r8169,说明它被千兆驱动接管了,后面避坑章节会专门处理这个冲突。
2.2 离线获取r8125源码包的三种可靠路径
离线环境下最首要的问题是怎么把源码包和编译依赖弄到目标机器上。我一般会按机器条件选下面三种之一。
第一种是 U 盘拷贝,适合任何物理机。找一台有网络的电脑,从 Realtek 官网或可信的软件源把 r8125 源码包下载下来,拷进一个 FAT32 格式的 U 盘,再插到目标机器上。目标机器上这样挂载:
sudo mkdir -p /mnt/usb sudo mount /dev/sdb1 /mnt/usb ls /mnt/usb sudo cp /mnt/usb/r8125-<版本号>.tar.gz /root/ sudo umount /mnt/usb这里/dev/sdb1是 U 盘设备名,不固定,先敲lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT看清楚再挂,免得把硬盘分区误挂上来。源码包文件名里的<版本号>是占位符,不同时期下载到的构建号不一样,这没关系,关键是解压后的目录名要和包名对应。
第二种是借道临时联网。很多物理机带板载千兆口或者 IPMI 管理口,如果这些口能上网,就不需要完全离线。先把系统里的基础源配好,然后用yum install -y gcc make kernel-devel把编译依赖拉下来,再wget下载 r8125 源码包。这个做法虽然简单,但要注意:临时联网时装好的 kernel-devel 版本必须和最终离线运行时一致,不然编译出来的模块还是没法用。
第三种是本地 yum 源,适合 CentOS7 镜像就在手边的场景。把 CentOS7 的 DVD ISO 上传或挂载到机器上,做一个 file:// 的本地 repo:
sudo mount -o loop CentOS-7-x86_64-DVD.iso /media/cdrom然后把下面的 repo 文件写到/etc/yum.repos.d/local.repo:
[base] name=CentOS7-Mount baseurl=file:///media/cdrom gpgcheck=0 enabled=1这个方案的好处是,除了 kernel-devel,后续还会用到ethtool、pciutils、tar这些工具,都能从本地源安装。对于一台完全没有网口的物理机,这是最靠谱的依赖来源。
2.3 离线编译前检查:内核版本、kernel-devel、gcc三件套
r8125 源码包编译时,Makefile 会通过/lib/modules/$(uname -r)/build这个路径去读当前内核的编译配置和头文件。这个路径正常情况下是一个软链接,指向/usr/src/kernels/<完整内核版本>。如果没安装和当前内核精确同版本的 kernel-devel,这个软链接就是坏的,make开头就会报错。
先做三件套检查:
uname -r ls -l /lib/modules/$(uname -r)/build gcc --versionuname -r得到的是完整内核版本,比如3.10.0-1160.el7.x86_64。ls -l如果看到No such file or directory或者broken symlink,就说明头文件没就位。gcc 版本只要和系统自带的一致,一般不会有问题。CentOS7 官方编译内核用的是 4.8.5,你换成 devtoolset-7 的 7.x 编译出的模块,有时会碰到 hidden symbol 之类的问题,不建议在离线环境里给自己加戏。
如果有本地 yum 源,直接执行:
yum install -y kernel-devel-$(uname -r)注意一定要用$(uname -r)精确指定,因为yum install kernel-devel默认装的可能不是当前内核版本。装完后重新跑一遍ls -l /lib/modules/$(uname -r)/build,确认链接指向存在。
2.4 看清r8125源码包结构:Makefile、autorun.sh和src目录
下载到的 r8125 源码包是一个 tar.gz 压缩包,解压后目录结构大概是:
tar -xvf r8125-<版本号>.tar.gz ls -la r8125-<版本号>里面通常有Makefile、autorun.sh、src/目录,以及一个README或README.md。autorun.sh是把make、make install和modprobe串在一起的便捷脚本,适合网络正常的情况。离线物理机上我更喜欢手工执行三步,因为哪一步失败都能看到明确的报错。src/目录里就是驱动源码,真正的编译对象是它生成的r8125.ko。
打开 Makefile 看前几行,会看到类似CONFIG_R8125_DEBUG之类的开关。默认关闭。如果你想让驱动打印更多 PHY 协商信息,可以把它置为y,但一般用户不需要开。另一个常见开关是关于 ASPM 的,某些主板开启 ASPM 后 2.5G 网卡会断流,这个后面会讲。源码包里的 README 还写着支持的芯片列表,下载后先花两分钟对照一下,能避免很多无效编译。
3. 编译安装r8125驱动:从解压源码到modprobe出2500Mbps的全过程
3.1 解压源码包后先读README,不要急着make
把源码包放到目标机器上之后,先解压再读文档:
tar -xvf r8125-<版本号>.tar.gz cd r8125-<版本号> ls -la less READMEREADME 里至少要看三处。一是 “Supported Chipset” 列表,确认 RTL8125 在列。二是 “Installation” 部分,它会写明当前版本支持哪几种编译安装方式,通常有 autorun.sh、make/make install、dkms 三条路。离线环境除非你已经装好了 dkms 和对应内核头文件,否则别选 dkms,它会在内核升级时自动重建模块,但第一次安装还需要额外依赖。三是 “Load the driver” 部分,看它是否要求先modprobe -r r8169,或者只建议modprobe r8125。
注意,r8125 源码包真正源码在src下。看清目录结构后,这一步的目标是确认当前的默认编译配置,而不是急着跑命令。如果之前编过别的版本,先make clean把残留清掉,否则对象文件里的头文件路径会带到新编译里。物理机上的内核 config 其实跟你是否开启过CONFIG_NET之类有关系,但一般不用手动干预。
3.2 编译安装:gcc、make、kernel-devel三件套缺一不可
确认完文档后,进入源码目录执行编译安装:
sudo yum install -y gcc make kernel-devel-$(uname -r) sudo make clean sudo make sudo make installmake clean会把上一次编译生成的对象文件和临时模块删掉。特别是你在同一台机器上换过内核版本,或者从别处拷贝了一个非干净的源码目录时,这步必须执行。make会调用内核头文件里的编译脚本,把 r8125.ko 生成在src/目录下。make install则负责把生成的r8125.ko复制到/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/,同时调用depmod更新模块依赖。如果make install结束后没有看到 “install” 的完成提示,而是报权限或路径错误,多半是内核头文件路径不对。
编译过程中常见的报错是linux/version.h找不到或Kernel configuration is invalid。前者是 kernel-devel 没装好,后者是内核头文件 config 不完整,常见于从网上随便下了一个不完整 kernel-devel 包。这时回到上一章,把ls -l /lib/modules/$(uname -r)/build查清楚,确认它指向的/usr/src/kernels目录里确实有.config和include/linux。
编译参数这里不需要额外指定,Makefile 默认就是按你当前uname -r来的。但如果你希望驱动编译时开启调试日志,可以临时在 Makefile 开头加一行CONFIG_R8125_DEBUG = y,编出来的模块会在 dmesg 里输出更详细的 PHY 读写过程。这个开关会降低一点性能,排查完就关掉重新编译。
3.3 用depmod、modprobe、ethtool三步确认驱动真正生效
编译安装完,先重建模块依赖,再加载模块:
sudo depmod -a sudo modprobe r8125 lsmod | grep r8125depmod -a会扫描/lib/modules/$(uname -r)/kernel下所有模块,生成modules.dep。如果不执行这步,直接modprobe r8125也可能成功,但如果模块间有依赖关系,就会提示module not found。modprobe相比insmod的优点是会自动处理依赖,还能读到 depmod 生成的别名。加载完成后,lsmod应该能看到一行r8125,引用计数可能是 0,这不代表没生效,而是还没有网口被它接管。
接着看内核日志:
dmesg | tail -n 30如果看到r8125: probe device with mac: ...或r8125: Link is UP,说明驱动已经找到网卡并且链路协商成功。此时再配合ip link show找出网卡接口名,比如enp2s0,用ethtool确认速率:
sudo ip link set enp2s0 up ethtool enp2s0 | grep -E "Speed|Duplex"Speed: 2500Mb/s说明 2.5G 协商成功。如果显示Speed: 1000Mb/s或Unknown!,不要急着改参数,先看网线交换机。如果接口名没出现,可以ip -a link或者ls /sys/class/net逐个找,不要靠eth0的旧印象。物理机主板在 BIOS 里把集成网卡 disable 了,也会导致系统根本看不到 PCI 设备;那种情况下驱动再对也没用,要先去 BIOS 确认网卡已启用。
4. 把驱动塞进CentOS7安装引导:制作离线r8125驱动盘的完整做法
4.1 为什么要在安装系统阶段就加载驱动
如果你在一台只有 2.5G 网卡的物理机上全新安装 CentOS7,安装程序 Anaconda 默认不带 r8125 模块,所以进入安装界面后网卡是黑的。这不影响你完成本地安装,但装完系统后你还是要用 U 盘去处理驱动,而且安装程序在装包阶段无法通过网络源安装任何依赖。更麻烦的是,如果你的安装方式是 kickstart 或远程自动安装,网卡不识别就直接断掉,根本进不了安装流程。
所以在安装引导阶段把一个预先编译好的 r8125.ko 做成驱动盘,通过inst.dd加载给 Anaconda,是更省事的做法。Anaconda 在加载内核模块后,会像正常机器一样枚举出网卡,后面无论是手动网络配置还是 kickstart,都按常规步骤走,少一次重启。这个做法在大量同型号主板装机时尤其省事,一次做好驱动盘就可以反复用。
注意:安装程序运行的内核和你最终装完的系统内核不一定完全同版本。在 CentOS7 上,安装镜像的内核往往比最终系统的新或旧。稳妥的办法是不要硬求完全一致,而是在驱动盘里放一个较通用的 r8125.ko,但驱动盘本身不保证所有内核都能用。最稳的是找一台已经用同一镜像装好的机器,在它上面编译 r8125.ko,再拷到驱动盘里,这样和安装器内核的匹配度最高。
4.2 用dracut还是纯小分区?驱动盘的正确制作方法
网上很多教程会告诉你用dracut -a r8125 -f /tmp/driver.img生成一个 initramfs 驱动盘。这个命令本身没问题:
sudo dracut -a r8125 -f /tmp/r8125-driver.img $(uname -r)它会把 r8125 模块和依赖打进一个 initramfs 镜像。但 Anaconda 的inst.dd更常见、也更容易被识别的方式,是提供一个包含单个.ko文件的普通文件系统分区。因为安装器扫描驱动盘时,会遍历分区的根目录,查找.ko文件。你不需要给它一个完整 initramfs,只要给它一个 vfat 或 ext2/4 分区上的 r8125.ko 即可。做法很简单:
sudo mkfs.vfat -F 32 /dev/sdb1 sudo mount /dev/sdb1 /mnt/usb sudo cp /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/r8125.ko /mnt/usb/ sync sudo umount /mnt/usb如果没有mkfs.vfat,用mkfs.ext4也可以,但 FAT32 在 UEFI 和传统 BIOS 的兼容性最好。.ko文件大小只有几百 KB,完全不用担心 FAT32 的 4GB 限制。注意一个坑:不要把 U 盘原本的分区表删光,否则有些板卡固件会不识别。直接在 U 盘第一个分区上重建文件系统即可。
4.3 在安装引导菜单用inst.dd=加载驱动盘
把写好的驱动盘插到目标物理机上,放入 CentOS7 安装盘,开机引导。等出现安装引导菜单,选中第一项,按e进入编辑模式。找到以linux或linuxefi开头的那一行,在行尾追加一个参数:
inst.dd如果需要指定设备,也可以写成inst.dd=/dev/sdb1,但如果同一台机器上 U 盘设备名不确定,最好不带设备路径,让 Anaconda 在启动过程中弹窗问你要选择哪个驱动盘。按Ctrl+X启动后,安装程序会扫描可移动设备,如果只看到一个驱动盘,直接勾选r8125.ko即可。加载完成后,那个 2.5G 网卡应该出现在安装器网络的设备列表里。
这里的核心参数就是inst.dd,Anaconda 支持从本地磁盘、U 盘、HTTP 或 NFS 路径加载驱动。inst.dd=/path的路径可以是目录或具体.ko文件。如果是目录,安装器会递归扫盘找.ko。我建议在引导参数里直接什么都不给,交互选择最稳妥,因为你没法确保 U 盘在目标机器上是/dev/sdb1还是/dev/sdc1,写死设备名反而容易翻车。
4.4 物理机U盘引导的格式与BIOS开关
物理机安装比虚拟机多两道坎。一是 U 盘启动模式,如果主板是 UEFI,安装盘和驱动盘的媒体格式都要能被 UEFI 固件识别,FAT32 是最保险的;传统 BIOS 模式下,U 盘有可能被识别成硬盘,这时要确认主板启动顺序里的 USB 选项。二是 Secure Boot,很多新主板默认开启,未签名或者只有 Realtek 测试签名的 r8125.ko 会被拒绝加载,表现为modprobe: ERROR: could not insert 'r8125': Required key not available。
遇到 Secure Boot 拦截,最直接的物理机办法是进 BIOS 暂时把它关掉,等系统装好、驱动固化后再看是否恢复。如果你必须保留 Secure Boot,那就得自己生成一个签名密钥,用sign-file给模块签名,再把公钥加进 MOK 数据库。这个流程在 CentOS7 下可用mokutil --import,但离线环境里操作繁琐,不是每条网卡都值得这么搞。对装机运维来说,临时关闭 Secure Boot 反而是最常见、最省时间的路径。
5. 离线安装r8125后的避坑排查:从ping不通到协商降速的四个真实现场
5.1 装了驱动还是无法ping通百度:先分清是驱动、IP还是网关
现象:ethtool显示 Speed 2500Mb/s,ip link也显示 state UP,但ping baidu.com丢 100% 或提示Name or service not known。
原因:驱动只负责把网卡拉起来,网络能否通还取决于 IP 配置、路由、网关、DNS。CentOS7 默认安装后网卡配置文件是/etc/sysconfig/network-scripts/ifcfg-enp2s0,里面ONBOOT往往是no,所以 DHCP 不会自动跑。另外物理机接的交换机若开了端口安全或 VLAN,也会出现链路 UP 但 ping 不通。
解决:先按顺序排查,不要一上来就怀疑驱动。
ip link show enp2s0 ip addr show enp2s0 ip route show如果ip addr里没有 192.168.x.x 这类 IP,说明没拿到地址。配置 DHCP:
nmcli device status nmcli device connect enp2s0或者直接改 ifcfg 文件,把ONBOOT=yes和BOOTPROTO=dhcp设好,再systemctl restart network。然后先ping网关,再ping 8.8.8.8,最后尝试域名。注意离线环境里ping baidu.com可能因为 DNS 没配而失败,但这是网络配置问题,不是驱动的锅。很多同事在这个环节卡了半天,其实驱动早就好了。
5.2 make时报kernel header not found:kernel-devel版本没和uname -r对上
现象:make编译到一半,报类似于/lib/modules/3.10.0-1160.el7.x86_64/build: No such file or directory,有时还附带linux/version.h: No such file or directory。
原因:当前系统内核是 A 版本,装的 kernel-devel 是 B 版本。CentOS7 更新内核后,/lib/modules/$(uname -r)/build指向的目录不存在,或指向另一个版本的头文件。
解决:离线环境里最可靠的是本地 yum 源精确安装。确认镜像里有没有当前版本:
uname -r ls /usr/src/kernels/ yum install -y kernel-devel-$(uname -r)如果没有本地源,就需要在另一台有网的机器上用yumdownloader --resolve kernel-devel-<版本>把 rpm 下载后拷过来,再rpm -ivh。安装完必须重新ls -l /lib/modules/$(uname -r)/build确认软链接正常。很多教程只说装 kernel-devel,没说版本匹配,离线环境最容易栽在这个细节。
5.3 模块加载冲突:r8169先接管了网卡,r8125插不进去
现象:modprobe r8125没有任何报错,lsmod也有 r8125,但ip link始终看不到网卡,或者 dmesg 里同时出现 r8169 和 r8125 的 probe 记录。
原因:内核在开机时按 PCI ID 自动匹配驱动,老内核把 RTL8125 识别成了 r8169 支持的设备,所以 r8169 先绑定了网络接口。r8125 再 probe 时发现设备已被占用,接口也就起不来。
解决:先卸载 r8169,再加载 r8125,并把它写入黑名单:
sudo modprobe -r r8169 sudo modprobe r8125 echo "blacklist r8169" | sudo tee /etc/modprobe.d/blacklist-r8169.conf sudo dracut -f sudo reboot注意modprobe -r r8169可能会把 eth0 连着一起删掉,如果这台机器是通过 SSH 访问的,执行完这步 SSH 会断开,只能控制台操作。黑名单写入后,下次开机内核就直接跳过 r8169,给 r8125 留出设备。如果你需要保留 r8169 给其它千兆网卡,就不要全局黑名单,而是针对这个 PCI 设备写一个 udev 规则绑定到 r8125,但复杂度高不少,大多数物理机没必要。
5.4 协商速率只有1Gbps:网线、交换机和PHY节能参数
现象:ethtool enp2s0显示Speed: 1000Mb/s,但你买的网卡和交换机都支持 2.5G。
原因:第一可能是网线,2.5G 虽然只要求 Cat5e,但劣质网线或过长链路协商不到 2.5G。第二可能是交换机端口速率或当前交换机只支持 1G。第三是链路两端的 PHY 节能策略。
解决:先换一根六类成品线,直连单端口 2.5G 交换机,排除链路问题。如果链路是好的,仍然协商为 1G,尝试手动指定:
sudo ethtool -s enp2s0 speed 2500 duplex full autoneg on然后再查ethtool enp2s0。如果手动指定失败,多半是 PHY 或链路硬件不支持。另一个隐藏因素是 EEE 和 Green Ethernet,部分主板 BIOS 有类似 “Realtek PXE” 或 “Power Saving” 选项,会限制 2.5G 协商。在 BIOS 里关掉节能选项再试。驱动参数里的 EEE 可以通过ethtool --set-eee关闭,但不同内核版本支持程度不一样,别过度依赖。
如果确认链路能协商到 2500,但重启后又掉回 1000,说明 ethtool 手动设置的参数没有被保存。把它写到 ifcfg 文件:
ETHTOOL_OPTS="-s enp2s0 speed 2500 duplex full autoneg on"这样 NetworkManager 在激活网卡时会自动执行。
6. 收尾技巧:用dmesg和ethtool做驱动回归,并把r8125固化进系统
驱动装好、网络通了之后,还必须做一件事:让 r8125 在每次重启后都可靠加载。很多人在物理机上装完驱动当时能用,重启后网卡又消失,就是因为只做了modprobe没有固化模块。
固化分两步,第一步先把模块加入系统默认加载列表:
echo "r8125" | sudo tee /etc/modules-load.d/r8125.conf sudo depmod -a sudo dracut -f第二步是确认 initramfs 里确实包含 r8125:
lsinitrd | grep r8125如果 grep 不到,说明模块没被收进 initramfs,重启后大概率起不来。原因通常是 dracut 执行时没有配置 include,或者模块本身没有被 depmod 索引。遇到这情况,用dracut --add-drivers r8125 -f强制添加,再复查。
回归验证建议按下面的顺序连跑,观察输出:
lsmod | grep r8125 dmesg | grep -i r8125 | tail -n 10 ethtool enp2s0 | grep -E "Speed|Duplex" ip route show只要四条命令的结果分别显示模块存在、驱动 probe 成功、速率 2500Mbps、默认路由存在,这个驱动就算真正落地。以后如果需要升级内核,先装好新内核的 kernel-devel,再进源码目录跑一遍make clean && make && make install,最后重新 depmod 和 dracut,别直接拿旧模块顶上。
我个人的习惯是,在离线安装时把驱动源码包、编译好的 .ko 文件、kernel-devel 的 rpm 包全部留在一个专用 U 盘里,和整机的装机记录放一起。这样做的好处是下次换硬盘或重装系统时,不需要再去翻驱动,直接按这个流程快速复现。物理机离线装系统本来就没有后悔药,能提前多留一份物料,就能少踩一个坑。希望帮到你。
本文还有配套的精品资源,点击获取