
简介这份资源面向在 CentOS 7内核 3.10环境下需要为 Realtek 网卡安装 r8168 驱动的运维与 Linux 学习者重点解决系统自带 r8169 驱动兼容性不佳、网卡无法正常识别或联网的问题。压缩包共 40 个文件约 1.37MB以 png、svg、gif、jpg 等截图与图标为主辅以 js、css 等网页样式脚本并包含 r8168-8.048.03.tar.gz 驱动源码包及一份 r8169 降级 r8168 的图文教程页面便于对照操作。资源围绕驱动解压、内核模块编译环境配置、gcc12 编译、模块加载与网卡状态验证等环节展开同时整理了编译报错、模块加载失败等常见问题的排查思路适合需要快速定位驱动版本匹配与编译依赖问题的读者参考。目前已有 272 人学习下载。1. 网卡不认、驱动装不上这份 r8168-8.048.03 源码包到底能救什么场机房里有台老服务器装完 CentOS 7 之后ip addr只看到一个 lo网卡像人间蒸发了一样。lspci能查到 Realtek 的千兆网卡但lsmod里就是没有r8169或者更气人的是——r8169在链路却死活起不来插网线灯不亮ethtool看 Speed 是 Unknown。这种场景我遇到过不止一次最后基本都是靠 r8168 源码包重新编译驱动解决的。r8168-8.048.03.tar.gz 就是 Realtek 官方放出的 r8168 系列网卡驱动源码包版本号 8.048.03专门用来替换内核自带的 r8169 驱动。它解决的核心问题很明确内核自带的 r8169 对部分 RTL8111/8168/8411 芯片兼容性差表现为丢包、断流、协商速率上不去甚至直接不识别。适合谁用手里有 CentOS 7 环境、网卡是 Realtek 千兆系列、被 r8169 折磨过的运维和嵌入式工程师。如果你正在搜 linux centos7 r8168 相关的解决方案这份源码包就是那个能让你少走弯路的起点。2. 先搞懂 r8169 和 r8168 的恩怨为什么内核自带的反而不能用2.1 两个驱动抢同一块芯片的底层逻辑Realtek 的千兆网卡芯片比如 RTL8111、RTL8168、RTL8411在 Linux 内核里其实有两套驱动可以驱动它们一套是内核主线自带的r8169另一套是 Realtek 官方维护的r8168。这两套驱动针对的是同一批硬件但代码来源和维护节奏完全不同。r8169是社区逆向和长期维护的产物追求的是通用性和内核兼容性代码进主线早覆盖面广但代价是对某些特定芯片版本的时序、电源管理、PHY 寄存器配置不够精细。r8168是 Realtek 自己写的针对自家芯片的细节拿捏得更准尤其是 RTL8111/8168 的某些修订版本在链路协商、节能以太网、中断处理上表现更稳。问题就出在“同一块芯片被两个驱动认领”这件事上。内核启动时PCI 设备匹配驱动r8169和r8168的 PCI ID 表有重叠谁先加载谁就绑定设备。CentOS 7 默认内核里编进了r8169所以系统一启动网卡就被r8169抓走了。你想用r8168就得先把r8169拉黑再编译安装r8168否则两个驱动会互相抢设备出现“驱动加载了但网卡不工作”的玄学现象。2.2 什么情况下必须换 r8168不是所有 Realtek 网卡都需要换驱动。我一般按下面这个判断流程走现象大概率原因是否该换 r8168lspci能看到网卡ip addr无接口r8169 未加载或匹配失败是接口存在但链路灯不亮ethtool显示 Link detected: noPHY 配置问题是能连但频繁丢包、速率只有 100Mbps协商或节能特性异常是dmesg出现 r8169 报错、timeout驱动 bug是网卡是 RTL8125 等 2.5G 芯片需要 r8125 而非 r8168否注意r8168 只覆盖千兆系列2.5G 的 RTL8125 得用 r8125 驱动别下错了包。另外如果你用的是 CentOS 7 的默认内核 3.10r8168-8.048.03 这个版本是能编的但如果你升级过内核到 4.x 或 5.x编译前得确认源码里的 API 是否还兼容后面避坑章节会细说。2.3 源码包和 DKMS 版本的区别Realtek 官方放出来的驱动有两种形态一种是纯源码 tar 包就是 r8168-8.048.03.tar.gz 这种解压后make编译另一种是 DKMS 包能在内核升级后自动重编。源码包的好处是透明、可控你能看到每一行代码编译参数自己调坏处是每次内核更新都得手动重来一遍。我一般先在源码包上把驱动跑通确认稳定了再考虑要不要转成 DKMS 管理。对于 CentOS 7 这种内核不常动的环境源码包足够用。3. 从解压到 maker8168-8.048.03 编译安装全流程3.1 编译前的依赖检查与环境准备在动手之前先把编译工具链和内核头文件装齐。CentOS 7 最小化安装默认没有 gcc 和 make内核头文件也可能缺。我习惯先跑一遍检查# 检查 gcc、make、kernel-devel 是否就位 rpm -q gcc make kernel-devel kernel-headers # 如果缺用 yum 补齐需要本地源或已联网 yum install -y gcc make kernel-devel kernel-headers这里有个关键点kernel-devel的版本必须和当前运行的内核版本完全一致。用uname -r看当前内核再用rpm -q kernel-devel看装的头文件版本两者对不上编译必挂。如果对不上要么yum update kernel后重启要么装对应版本的kernel-devel-$(uname -r)。# 确认版本一致 uname -r rpm -q kernel-devel参数说明uname -r输出的是当前运行内核的完整版本号比如3.10.0-1160.el7.x86_64rpm -q kernel-devel查的是已安装的开发包版本。两者字符串必须一模一样差一个字符都不行。3.2 解压、编译、安装三步走依赖齐了之后把 r8168-8.048.03.tar.gz 传到机器上找个目录解压。我一般放在/usr/local/src下方便后面找。# 解压源码包 tar -zxvf r8168-8.048.03.tar.gz -C /usr/local/src/ # 进入源码目录 cd /usr/local/src/r8168-8.048.03/ # 查看目录结构确认有 Makefile 和 src ls -l解压后你会看到src/目录和Makefile有些版本还有README。接下来直接make# 编译驱动模块 make clean makemake clean是先清掉可能残留的旧对象文件避免上次编译的缓存干扰。make会调用内核的构建系统把src/下的 C 文件编成r8168.ko。如果这一步报错八成是kernel-devel路径不对或版本不匹配看报错里有没有No such file or directory指向/lib/modules/$(uname -r)/build。编译成功后安装模块# 安装到内核模块目录 make installmake install做的事包括把r8168.ko复制到/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/跑depmod -a更新模块依赖有些版本还会尝试配置modprobe黑名单。但别指望它全自动搞定黑名单那步经常漏得手动补。3.3 屏蔽 r8169 并加载 r8168这是整个流程里最容易翻车的一步。r8169不拉黑r8168加载了也绑不上设备。手动创建黑名单文件# 屏蔽内核自带的 r8169 cat /etc/modprobe.d/blacklist-r8169.conf EOF blacklist r8169 EOF然后重建 initramfs让黑名单在启动早期就生效# 重建 initramfsCentOS 7 用 dracut dracut -f /boot/initramfs-$(uname -r).img $(uname -r)参数说明-f强制覆盖现有 initramfs第二个参数指定内核版本。这一步不做的话重启后r8169可能还是会在r8168之前加载。接下来加载r8168# 加载新驱动 modprobe r8168 # 确认驱动已绑定 lsmod | grep r8168 lspci -k | grep -A 3 Ethernetlspci -k会显示每个 PCI 设备正在使用的内核驱动看到Kernel driver in use: r8168才算真正成功。如果显示的还是r8169说明黑名单没生效或者 initramfs 没重建。最后重启网络服务确认接口起来# 重启网络CentOS 7 用 network 或 NetworkManager systemctl restart network # 查看接口和链路状态 ip addr show ethtool eth0 | grep -E Speed|Duplex|Link detectedethtool输出里Speed: 1000Mb/s、Duplex: Full、Link detected: yes三个都对了才算彻底跑通。4. 避坑指南r8168 编译加载中最容易翻车的五个点4.1 编译报错 “No such file or directory: /lib/modules/.../build”现象make一开始就报找不到/lib/modules/$(uname -r)/build目录。原因kernel-devel没装或者装的版本和当前运行内核不一致。CentOS 7 的kernel-devel包名带版本号yum install kernel-devel默认装的是最新版可能比你当前运行的内核新。解决先uname -r看运行版本再yum install kernel-devel-$(uname -r)装对应版本。如果 yum 源里没有这个版本去 vault 源找或者直接升级内核后重启。4.2 驱动加载了但网卡不出现现象lsmod能看到r8168但ip addr里没有对应接口。原因r8169没被彻底屏蔽两个驱动抢设备内核把设备分给了先加载的那个。或者r8168加载了但没绑定到正确的 PCI 设备。解决确认/etc/modprobe.d/blacklist-r8169.conf存在且内容正确然后dracut -f重建 initramfs重启。重启后先lsmod | grep r8169如果还有说明黑名单没进 initramfs。另外检查dmesg | grep r8168看驱动有没有报错。4.3 链路起不来ethtool 显示 Link detected: no现象驱动绑定成功接口存在但插网线灯不亮ethtool显示无链路。原因PHY 配置问题常见于某些 RTL8111 修订版。r8168 驱动默认的 PHY 参数可能和你的硬件不匹配。解决先试ethtool -s eth0 autoneg on强制开启自协商。如果不行在加载驱动时传参数modprobe r8168 speed1000 duplexfull autonegon。还不行的话检查网线和水晶头别笑我遇到过三次都是线的问题。4.4 内核升级后驱动失效现象yum update升级内核后重启网卡又没了。原因r8168.ko是编给特定内核版本的内核升级后模块路径变了旧模块不兼容新内核。解决每次内核升级后重新进源码目录make clean make make install然后dracut -f重建 initramfs。嫌麻烦就转 DKMS但 DKMS 在 CentOS 7 上配置也有坑后面进阶章节说。4.5 make install 后 modprobe 报 “Module r8168 not found”现象make install没报错但modprobe r8168说找不到模块。原因depmod没跑或者模块装到了非标准路径modprobe索引不到。解决手动跑depmod -a然后modprobe r8168。如果还不行find /lib/modules -name r8168.ko看模块到底在哪确认路径在/lib/modules/$(uname -r)/kernel/drivers/net/下。不在的话手动复制过去再depmod -a。5. 进阶技巧用 DKMS 管住内核升级让 r8168 自动重编源码包手动编译的痛点就一个内核一升级驱动就废得重新来一遍。CentOS 7 虽然内核不常动但安全更新偶尔会推新内核每次手动重编太折腾。我后来的习惯是先用源码包把驱动跑通确认稳定后转成 DKMS 管理。DKMS 的全称是 Dynamic Kernel Module Support它能在内核升级时自动触发模块重编省掉手动步骤。5.1 把 r8168 源码接入 DKMS先装 DKMS# CentOS 7 需要 EPEL 源 yum install -y epel-release yum install -y dkms然后把 r8168 源码放到 DKMS 规定的目录结构里。DKMS 要求源码放在/usr/src/模块名-版本/下# 创建 DKMS 源码目录 mkdir -p /usr/src/r8168-8.048.03/ cp -r /usr/local/src/r8168-8.048.03/* /usr/src/r8168-8.048.03/接着创建 DKMS 配置文件/usr/src/r8168-8.048.03/dkms.confcat /usr/src/r8168-8.048.03/dkms.conf EOF PACKAGE_NAMEr8168 PACKAGE_VERSION8.048.03 BUILT_MODULE_NAME[0]r8168 DEST_MODULE_LOCATION[0]/kernel/drivers/net/ethernet/realtek/ AUTOINSTALLyes MAKE[0]make -C \${kernel_source_dir} M\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build modules CLEANmake -C \${kernel_source_dir} M\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build clean EOF参数说明BUILT_MODULE_NAME是编译出来的模块名DEST_MODULE_LOCATION是安装目标路径MAKE[0]里的${kernel_source_dir}是 DKMS 自动替换的内核源码路径。注意M后面指向的是 DKMS 构建树里的源码目录不是原始解压目录。5.2 注册、构建、安装一条龙配置文件写好后用 DKMS 命令注册并构建# 注册模块 dkms add -m r8168 -v 8.048.03 # 构建模块 dkms build -m r8168 -v 8.048.03 # 安装模块 dkms install -m r8168 -v 8.048.03三条命令跑完r8168.ko就装到了当前内核下。之后每次内核升级DKMS 会自动为新内核重编并安装。验证 DKMS 状态# 查看 DKMS 管理的模块状态 dkms status输出里应该看到r8168/8.048.03, 内核版本: installed。如果显示built但没installed手动跑dkms install。5.3 验证驱动是否真正生效DKMS 装完后别急着重启先确认当前内核下驱动能加载# 卸载旧驱动如果已加载 modprobe -r r8168 # 重新加载 modprobe r8168 # 确认绑定 lspci -k | grep -A 3 Ethernet ethtool eth0 | grep -E Speed|Duplex|Link detected如果lspci -k显示Kernel driver in use: r8168ethtool三个指标正常说明 DKMS 这条路走通了。之后内核升级DKMS 会在后台自动处理你只需要重启后确认一下dkms status和ethtool就行。从那以后我每次给 CentOS 7 装 Realtek 千兆网卡驱动都强制走一遍“源码编译验证 → DKMS 接管”的流程再也没被内核升级后的驱动失效坑过。希望帮到你。本文还有配套的精品资源点击获取