ARTICLE DETAIL

资讯详情

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

CentOS7物理机离线编译r8125驱动解决2.5G网卡识别问题

CentOS7物理机离线编译r8125驱动解决2.5G网卡识别问题 简介这份资源面向需要在物理机上离线部署CentOS 7的运维与网络工程师解决Realtek RTL8125 2.5GbE网卡在系统默认驱动缺失时无法联网的问题。资源包共51个文件、约55.41MB以rpm依赖包、C与头文件、Makefile及编译中间产物为主另含autorun.sh安装脚本、ko驱动模块与readme说明覆盖从编译工具链到驱动源码的完整离线环境。使用前需在BIOS中关闭Secure Boot再依次安装依赖、重建内核build软链接并执行autorun.sh成功后有线网络可自动连接。目前已有3257人学习下载适合缺少外网、需快速补齐网卡驱动并理解内核模块编译流程的读者参考。1. 物理机装 CentOS7 认不出 2.5G 网卡为什么离线装 r8125 是绕不开的一步机房里有台新配的物理机主板板载 Realtek 2.5G 网卡插上网线装完 CentOS7ip addr里只有 lolspci能看到设备但系统就是不给它分配接口名。这不是线的问题也不是交换机的问题是 CentOS7 内核自带的 r8169 驱动压根不认这颗 2.5G 芯片。CentOS7 的生命周期停在 3.10 内核而 Realtek 2.5G 系列RTL8125/8125B需要独立的 r8125 驱动才能跑起来。更麻烦的是很多生产环境不允许物理机连外网yum install kmod-r8125这条路直接堵死只能走离线安装。这篇笔记讲的就是在一台没有外网、只有 U 盘和本地源的 CentOS7 物理机上怎么把 r8125 驱动编译进去、让 2.5G 网卡正常拿到 IP。适合正在给新机器装 CentOS7 却卡在网卡识别这一步的运维和装机工程师也适合想搞清楚 Linux 网卡驱动离线编译流程的人。2. 先搞清楚 r8125 和 r8169 的关系为什么系统自带驱动救不了你2.1 r8169 是通用驱动但它不覆盖 2.5G 芯片CentOS7 内核里的r8169是一个覆盖面很广的 Realtek 千兆网卡驱动从 RTL8168 到 RTL8111 系列基本都能驱动。但 Realtek 在推出 2.5G 产品线RTL8125、RTL8125B之后并没有把支持合并进老内核的 r8169而是单独维护了一个r8125驱动包。这就导致一个很典型的现象lspci | grep -i realtek能看到Ethernet controller: Realtek Semiconductor Co., Ltd. Device 8125但ip link里没有对应的enpXsY接口dmesg | grep -i r8169可能会看到驱动加载了却报unknown chip XID之类的错误。判断你的机器是不是这个问题按下面几步确认# 1. 看 PCI 设备里有没有 Realtek 2.5G 控制器 lspci -nn | grep -i ethernet # 期望输出类似 # 03:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. Device [10ec:8125] # 2. 看当前内核加载了哪个驱动 lsmod | grep -E r8169|r8125 # 如果只有 r8169 没有 r8125基本可以确定是驱动缺失 # 3. 看 dmesg 里网卡相关的报错 dmesg | grep -iE r8169|r8125|eth # 常见报错r8169: unknown chip XID 641, aborting如果lspci里设备 ID 是10ec:8125而lsmod里只有 r8169那方向就明确了需要装 r8125。2.2 离线安装的核心思路源码编译 本地依赖在线环境下装 r8125 很简单Realtek 官方在 GitHub 上有维护仓库或者用 ELRepo 的kmod-r8125包一条yum install就完事。但离线环境没有这个条件只能走源码编译。源码编译需要三样东西r8125 驱动源码包通常是r8125-x.xxx.tar.bz2这种格式内核头文件和开发工具kernel-devel、kernel-headers、gcc、make和当前运行内核版本严格匹配的kernel-devel包这里有个血泪经验kernel-devel的版本必须和uname -r的输出完全一致差一个小版本号编译就会失败报/lib/modules/xxx/build: No such file or directory。所以离线安装的第一步不是拷驱动而是先确认目标机器的内核版本然后在有网的机器上把对应版本的kernel-devel和kernel-headers的 rpm 包下载下来。2.3 准备离线包的完整清单在一台能上网的 CentOS7 机器或者用容器上按目标机器的内核版本下载这些包。假设目标机器uname -r输出是3.10.0-1160.el7.x86_64# 在有网机器上创建离线包目录 mkdir -p /tmp/offline-r8125 cd /tmp/offline-r8125 # 下载和目标内核完全匹配的 kernel-devel 和 kernel-headers # 注意版本号必须和 uname -r 一致 yumdownloader --resolve kernel-devel-3.10.0-1160.el7.x86_64 yumdownloader --resolve kernel-headers-3.10.0-1160.el7.x86_64 # 下载编译工具链如果目标机器没装 gcc/make yumdownloader --resolve gcc makeyumdownloader来自yum-utils包如果没装先yum install -y yum-utils。--resolve参数会把依赖一起下载下来避免到目标机器上发现缺依赖。下载完成后把这些 rpm 和 r8125 源码包一起拷到 U 盘。提示如果目标机器连gcc、make都没有建议直接下载gcc、make、glibc-devel、cpp这几个基础包。有些最小化安装的 CentOS7 连tar和bzip2都没有也要一并带上。3. 在物理机上离线编译安装 r8125 的完整步骤3.1 挂载 U 盘并安装编译依赖物理机插上 U 盘CentOS7 一般会自动挂载到/run/media/用户名/卷标下如果没有自动挂载就手动来# 查看 U 盘设备名通常是 /dev/sdb1 或 /dev/sdc1 lsblk # 手动挂载 mkdir -p /mnt/usb mount /dev/sdb1 /mnt/usb # 进入离线包目录 cd /mnt/usb/offline-r8125先装编译依赖顺序有讲究先装kernel-devel和kernel-headers再装gcc、make。因为kernel-devel安装时会往/lib/modules/$(uname -r)/build建软链接如果内核版本不匹配这个链接会指向一个不存在的目录后面编译必然失败。# 安装内核开发包版本必须匹配当前运行内核 rpm -ivh kernel-devel-3.10.0-1160.el7.x86_64.rpm rpm -ivh kernel-headers-3.10.0-1160.el7.x86_64.rpm # 安装编译工具 rpm -ivh gcc-*.rpm make-*.rpm # 验证 build 链接是否指向正确 ls -l /lib/modules/$(uname -r)/build # 应该指向 /usr/src/kernels/3.10.0-1160.el7.x86_64如果ls -l显示build链接不存在或者指向错误说明kernel-devel版本不对必须换正确的版本重装。这一步是整个流程里最容易翻车的地方很多人卡在这里以为是驱动源码的问题其实是内核开发包版本没对上。3.2 解压源码并编译 r8125 模块依赖装好之后解压 r8125 源码包开始编译# 回到 U 盘目录解压驱动源码 cd /mnt/usb/offline-r8125 tar -xjf r8125-9.011.01.tar.bz2 -C /usr/src/ # 解压后目录名类似 r8125-9.011.01 cd /usr/src/r8125-9.011.01 # 编译驱动模块 make clean makemake执行过程中会调用内核的构建系统编译出r8125.ko这个内核模块文件。如果编译报错重点看这几类信息No such file or directory: /lib/modules/xxx/buildkernel-devel没装或版本不匹配error: implicit declaration of function源码和内核版本兼容性问题换一个 r8125 版本make: gcc: Command not foundgcc没装编译成功后当前目录下会出现src/r8125.ko这就是我们要的驱动模块。3.3 安装模块并让系统识别网卡编译出来的.ko文件需要安装到内核模块目录然后加载# 安装模块到 /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/ make install # 加载 r8125 模块 modprobe r8125 # 确认模块已加载 lsmod | grep r8125 # 确认网卡接口出现了 ip link show # 应该能看到类似 enp3s0 的接口如果modprobe r8125报Module not found说明make install没成功检查/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/下有没有r8125.ko然后手动depmod -a刷新模块依赖再试。网卡接口出现后配置 IP。如果是 DHCP 环境# 用 nmcli 或直接改配置文件 nmcli con add type ethernet ifname enp3s0 con-name enp3s0 nmcli con mod enp3s0 ipv4.method auto nmcli con up enp3s0如果是静态 IP编辑/etc/sysconfig/network-scripts/ifcfg-enp3s0设置BOOTPROTOstatic、IPADDR、NETMASK、GATEWAY、DNS1然后systemctl restart network。3.4 设置开机自动加载避免重启后网卡消失modprobe加载的模块重启后会丢失必须让它开机自动加载。同时要处理一个冲突系统默认会加载 r8169而 r8169 和 r8125 可能抢同一个 PCI 设备。# 方法一把 r8125 加入开机加载列表 echo r8125 /etc/modules-load.d/r8125.conf # 方法二把 r8169 加入黑名单防止它抢占设备 echo blacklist r8169 /etc/modprobe.d/blacklist-r8169.conf # 重建 initramfs确保开机时 r8125 能被加载 dracut -f /boot/initramfs-$(uname -r).img $(uname -r) # 重启验证 reboot重启后ip link show能看到网卡接口、lsmod | grep r8125有输出才算真正装好了。如果重启后网卡又没了大概率是dracut没执行或者blacklist没生效r8169 抢先加载了。4. 离线安装 r8125 最容易踩的 5 个坑4.1 坑一kernel-devel 版本和运行内核不一致现象make时报/lib/modules/3.10.0-1160.el7.x86_64/build: No such file or directory或者ls -l /lib/modules/$(uname -r)/build显示链接指向一个不存在的目录。原因下载的kernel-devel版本和目标机器uname -r输出不一致。CentOS7 的小版本更新很频繁3.10.0-1160和3.10.0-1127的kernel-devel不能混用。解决在目标机器上先执行uname -r拿到精确版本号再到有网机器上用yumdownloader下载完全一致的版本。如果实在找不到对应版本可以考虑升级内核到kernel-lt或kernel-ml但生产环境不建议随便动内核。4.2 坑二r8169 抢占设备导致 r8125 加载失败现象modprobe r8125没报错但ip link里还是没有网卡接口dmesg里看到 r8169 先加载并绑定了设备。原因r8169 是内核自带驱动启动时自动加载并抢占了 Realtek 的 PCI 设备。r8125 虽然加载了但设备已经被 r8169 绑定拿不到控制权。解决把 r8169 加入黑名单然后重建 initramfs。具体命令在 3.4 节已经写了。注意黑名单文件要放在/etc/modprobe.d/下文件名以.conf结尾否则不会生效。4.3 坑三U 盘文件系统不支持导致源码包损坏现象tar -xjf解压时报bzip2: (stdin) is not a bzip2 file或者解压出来的文件不完整。原因U 盘用的是 FAT32 或 exFAT 文件系统拷贝大文件时可能因为文件系统限制导致文件损坏尤其是超过 4G 的文件。r8125 源码包一般不大但如果是打包了多个版本的合集就可能超限。解决拷贝完成后用md5sum校验一下源码包的完整性和源文件对比。如果 U 盘是 FAT32考虑格式化成 ext4 或者用split命令分卷拷贝。4.4 坑四最小化安装缺少 bzip2 和 tar现象tar -xjf报tar: bzip2: Cannot exec: No such file or directory。原因CentOS7 最小化安装默认不带bzip2而 r8125 源码包通常是.tar.bz2格式。解决在有网机器上下载bzip2和bzip2-libs的 rpm 包一起拷到 U 盘。或者把源码包在有网机器上解压成.tar格式再拷过去用tar -xf解压就不需要 bzip2 了。4.5 坑五dracut 重建 initramfs 时空间不足现象dracut -f报No space left on device或者执行到一半失败。原因/boot分区太小CentOS7 默认/boot只有 1G如果之前有多个内核版本的 initramfs 文件空间可能不够。解决先清理旧内核的 initramfs 文件ls /boot/initramfs-*.img看看有哪些保留当前内核的删掉其他的。如果还是不够只能扩容/boot或者把/boot挂到更大的分区上。扩容/boot有风险操作前备份数据。5. 验证驱动稳定性与长期维护的几个实用技巧装完驱动能上网只是第一步生产环境更关心的是稳定性。我一般会做三件事来验证第一用ethtool -i enp3s0确认驱动版本和固件信息输出里driver: r8125、version: 9.011.01这些信息要记下来以后出问题好排查。第二跑一轮iperf3打流测试看 2.5G 带宽能不能跑满如果只能跑到千兆检查网线是不是超五类、交换机端口是不是 2.5G 协商成功。第三连续跑 24 小时ping -f或者iperf3 -t 86400观察有没有丢包和驱动报错dmesg -w挂在那里盯着。长期维护方面内核升级是最大的变量。CentOS7 如果通过yum update升级了内核新内核的kernel-devel版本变了之前编译的 r8125 模块在新内核下加载会报version magic不匹配。所以每次内核升级后都要重新编译安装 r8125。我的习惯是在/root下留一个r8125-rebuild.sh脚本内容就是解压、编译、安装、dracut 这几步内核一升级就跑一遍省得每次翻笔记。#!/bin/bash # r8125-rebuild.sh - 内核升级后重新编译安装 r8125 set -e KVER$(uname -r) SRCDIR/usr/src/r8125-9.011.01 # 检查 kernel-devel 是否匹配 if [ ! -d /lib/modules/${KVER}/build ]; then echo ERROR: kernel-devel for ${KVER} not found exit 1 fi cd ${SRCDIR} make clean make make install modprobe -r r8125 2/dev/null || true modprobe r8125 dracut -f /boot/initramfs-${KVER}.img ${KVER} echo r8125 rebuilt for ${KVER}这个脚本的关键点是set -e任何一步失败就停避免编译失败还继续安装导致系统状态混乱。modprobe -r r8125先卸载旧模块再加载新的如果模块正在被使用网卡在跑流量会卸载失败这时候需要先ip link set enp3s0 down再操作。还有一个容易被忽略的点如果机器有多张 Realtek 网卡r8125 和 r8169 可能各管一部分。比如板载 2.5G 用 r8125独立千兆网卡用 r8169这时候黑名单不能一刀切把 r8169 全禁了否则千兆网卡也用不了。正确的做法是用driverctl或者 udev 规则按 PCI 地址绑定驱动而不是简单粗暴地黑名单。这个场景在服务器上挺常见配之前先用lspci -nn把每张网卡的 PCI 地址和型号列清楚再决定哪个用哪个驱动。希望帮到你。本文还有配套的精品资源点击获取
返回列表