
简介一套面向CentOS 7用户的r8168网卡驱动安装配套资料包用于解决系统自带r8169驱动与Realtek网卡不匹配、必须降级使用r8168驱动的问题尤其适合内核升级后网卡失效的场景。整合包将官方驱动源码与一份图文并茂的离线安装教程放在一起并针对内核3.10和gcc12编译环境给出适配说明即使对内核模块编译不熟悉的读者也能按说明操作适合运维人员、实验机用户和Linux驱动学习者。压缩包共40个文件整体约1.37MB核心是r8168驱动源码包其余为HTML教程页面以及PNG、JPG、SVG、GIF、CSS、JS等网页素材其中截图清晰展示了安装过程中的关键状态和命令执行效果无网环境下也能完整对照阅读。截至目前已有272人浏览学习这份资源的最大价值在于把驱动文件、安装过程和排错经验打包成一份可直接查阅的整体围绕依赖检查、编译环境、模块加载失败等容易踩坑的环节给出了解决线索。对于网卡无法识别或网络不稳定的CentOS 7用户下载后可按图索骥完成驱动切换与验证省去四处找资料的时间。1. 先搞清楚 r8168-8.048.03.tar.gz 解决什么问题第一次看到 r8168-8.048.03.tar.gz 的人多半是刚装好 Linux发现有线网卡灯亮着系统里却找不到 eth0。lspci能看到 Ethernet controller: Realtek RTL8111/8168硬件在接口却不见影。这个 tar.gz 不是应用软件而是 Realtek 官方的 r8168 网卡驱动源码包8.048.03 是它的版本号。用途非常窄让 RTL8168、RTL8111、RTL8101 这一系列千兆有线网卡在内核里注册为一张正常工作的以太网设备。什么时候会需要它第一种是发行版内置的 r8169 驱动在你的网卡上表现不稳比如动不动掉千兆、一开机就只有百兆第二种是内核升级之后网卡驱动被冲掉系统只剩一个不工作的网卡第三种是玩软路由、NAS、虚拟化桥接希望网卡行为稳定到可以当生产设备用。下面的内容面向的就是这三类人我会按自己的落地顺序把选型、编译、持久化和排错一次讲完直接照做即可。2. r8169 与 r8168为什么系统能识别网卡还要再编译一次官方驱动2.1 先分清两个名字r8169 是内核自带r8168 是厂商官方很多人看到lspci输出里的 “Kernel driver in use: r8169”以为驱动已经在了没必要再折腾一个压缩包。注意这个 r8169 是 Linux 内核社区维护的驱动源码放在内核树的drivers/net/ethernet/realtek/r8169.c而我们手里这个 r8168-8.048.03.tar.gz 是 Realtek 自己维护的驱动编译产物叫 r8168.ko。两个名字相近但出身、更新节奏、寄存器处理方式都不同。怎么确认当前网卡到底在被谁驱动先用一条命令把设备与驱动对应关系看清楚# 查看 PCI 网卡以及它当前绑定的驱动 lspci -k | grep -A 3 -i ethernet # 查看已经加载到内核里的相关模块 lsmod | grep r816lspci输出里会有一行 “Kernel driver in use: r8169” 或 “r8168”。lsmod的结果如果同时出现 r8169 和 r8168说明系统里两个模块都被加载了这是后面很多奇怪现象的根源。建议安装前先把这行输出记下来后面排查时会反复用到。r8169 与 r8168 同为支持 RTL8168/8111 的驱动但差别不小对比项r8169r8168维护方内核社区Realtek 官方源码来源内核自带官方驱动包驱动架构基于 phylib/MDIO 抽象直接读写芯片寄存器适用芯片RTL8168、RTL8169、RTL8125 等主打 RTL8168/8111/8101 千兆系列获取方式装系统就有手动编译安装常见疑虑老芯片掉速、断流内核升级后需要重新适配2.2 r8169 兼容面很广但老芯片的稳定性要打问号r8169 之所以能流行是因为它一个驱动覆盖了瑞昱好几代网卡从百兆时代的 RTL8101 到千兆 RTL8168再到后来的 2.5G RTL8125都能识别。这样一个驱动要兼容这么多硬件就必须通过 phylib 做一层抽象把不同芯片的 PHY 差异藏起来。抽象层带来的副作用是遇到某个芯片的私有寄存器行为社区驱动不一定照顾得到。实际翻车最多的是比较早的 RTL8168/8111 批次。现象很典型开机一段时间网卡自己掉到 100Mbps怎么协商都回不到千兆或者 dmesg 里反复出现 “r8169: link down” 和 “link up”看起来像网线接触不良但换线换交换机都一样。有软路由玩家把这种问题叫网卡玄学其实多数是 r8169 对老 PHY 的省电策略太激进EEE节能以太网协商失败导致链路反复重置。这时候把驱动换成 Realtek 官方 r8168很多问题会直接消失。2.3 r8168 的设计取向不吃内核抽象直接咬住寄存器官方 r8168 驱动的基本思路是绕开 phylib直接用 MMIO 访问网卡寄存器对 PHY 的配置、链路协商、电源管理都按瑞昱自己的规格来。这样做的优点是行为预期更接近芯片原始设计尤其是链路协商和唤醒这类容易出问题的环节表现得比社区驱动更保守、更稳定。这也是为什么很多追求稳定的人宁可放弃内核自带驱动的便利也要手动编译这个 tar.gz。缺点是 r8168 官方驱动和内核内部 API 绑定得很紧。内核版本一升级驱动的源码可能就要跟着改至少也要重新编译。这也是本文后面要把 DKMS 配好的原因不解决持久化r8168 装好也只能高兴一个内核版本。2.4 什么时候不必折腾什么时候必须折腾如果你的发行版自带 r8169跑了一两周 ping 不丢包、速率稳定在千兆、dmesg 干净其实没必要换。多数家用桌面场景里r8169 完全够用换了反而增加维护成本。但碰到下面几种情况就建议用 r8168一是网卡频繁掉链子或速率上不去二是要做软路由、NAS、链路聚合这类长时间高负载网络三是在 Proxmox、ESXi 这类虚拟化平台上网卡行为异常且排除了其他硬件因素。我的经验是判断标准不要看网上说哪个驱动好而是看你自己的 dmesg 和 ethtool 统计里有没有异常。如果 r8169 稳定就让它稳定地跑如果不稳定再换 r8168并且用后面的章节把持久化和排错一起做掉避免装完了不知道怎么维护。3. 编译安装 r8168-8.048.03从 tar.gz 到网线通了的完整命令3.1 编译前检查三件事内核头文件、编译器与当前驱动占用编译内核模块不是编译普通 C 程序它需要和当前内核版本完全一致的内核头文件与编译配置。最常见翻车就是头文件没装或者装了一个版本对不上的 linux-headers。先确认三件事当前内核版本、gcc 是否可用、/lib/modules/$(uname -r)/build是否能找到构建目录。# 查看当前内核版本后续安装头文件时要用 uname -r # Debian / Ubuntu 系列安装编译工具和与内核匹配的头文件 sudo apt-get update sudo apt-get install -y build-essential linux-headers-$(uname -r) # RHEL / Rocky / AlmaLinux 系列按下面对应执行 sudo dnf install -y gcc make kernel-devel-$(uname -r)其中linux-headers-$(uname -r)会自动展开成当前内核对应的头文件包这是最省事的方式。部分 Ubuntu 内核用的是 HWE 栈包名可能叫linux-headers-generic-hwe-xx.x直接执行后如果提示找不到包再apt search linux-headers-$(uname -r)找精确名称。RHEL 系则要确认/lib/modules/$(uname -r)/build这个软链接存在且指向有效目录它指向的是 kernel-devel 的安装位置。同时检查一下当前设备被谁占用避免后面卸载旧驱动时措手不及lspci -k | grep -A 3 -i ethernet如果显示 “Kernel driver in use: r8169”后面卸载的就是它如果已经显示 r8168说明机器上之前装过老版本先记住这个状态。3.2 解压源码包并了解目录结构拿到r8168-8.048.03.tar.gz之后先解压再进目录。这系列驱动包的常见布局是一个顶层目录里面放着 Makefile、README、autorun.sh以及一个 src 子目录src 里就是真正的内核模块源码和它自己的 Makefile。# 解压 gzip 压缩的 tar 包 tar -xzvf r8168-8.048.03.tar.gz cd r8168-8.048.03 # 看一下顶层有哪些文件 ls -l # 快速浏览 Makefile 前 40 行确认构建入口 head -40 Makefiletar -xzvf的四个参数分别表示解压、用 gzip 解压缩、显示解压过程、指定归档文件。进目录后重点看 Makefile 里有没有KERNELDIR的定义常见默认值是/lib/modules/$(shell uname -r)/build表示用当前内核的构建目录作为编译环境。autorun.sh 的作用是自动完成编译安装和加载但生产环境我不建议直接跑它因为一旦编译失败它不会给你留太多中间状态手动分步执行更容易定位问题。3.3 编译内核模块make 之前先 clean进入目录后不要直接 make先执行一次make clean。原因很实际如果这个目录是从别人那里拷贝的或者之前编译过其他内核版本残留的 .o 文件和 .ko 会导致链接到错误的内核符号报错信息还特别难查。# 清理残留对象文件 make clean # 编译生成 src/r8168.ko make编译过程一般 1 到 3 分钟取决于机器速度。看到LD [M] src/r8168.ko或者目录里出现 r8168.ko 就说明编译通过。这里补充一个参数说明如果手动指定make KERNELDIR/usr/src/linux-headers-5.15.0-xxx可以强制让驱动针对另一个内核版本编译但普通机器不需要这个操作默认 uname -r 就够了。如果在 make 阶段遇到 header 相关的语法报错先回到 3.1 检查头文件而不是急着换驱动版本。3.4 卸载旧驱动并装载 r8168顺序很重要模块编译好之后先用make install把 r8168.ko 装进当前内核的模块目录再处理旧驱动。注意顺序先安装新模块再卸载旧驱动不然你的网卡会有一段空窗期远程操作时直接断连。# 把 r8168.ko 安装到 /lib/modules/$(uname -r)/ 下 sudo make install # 如果当前正在用 r8169卸载它|| true 防止卸载失败中断整个命令 sudo modprobe -r r8169 || true # 如果之前装过旧版 r8168也卸掉 sudo rmmod r8168 2/dev/null || true # 加载新的 r8168 模块 sudo modprobe r8168每条命令的含义modprobe -r r8169是按模块名卸载驱动并清理依赖rmmod r8168 2/dev/null || true是为了处理老系统的残留如果模块不存在错误信息直接丢进 /dev/null不阻塞后续步骤modprobe r8168会到/lib/modules/$(uname -r)/下找到刚安装的 r8168.ko 并加载。加载成功后网卡接口名可能从旧的 enp3s0 变成 eth0这由 udev 的命名规则决定不影响使用。注意如果你只能通过 SSH 远程操作请在服务器本地接显示器和键盘或者准备好 IPMI/串口后再执行卸载命令。网卡驱动被卸载的瞬间SSH 连接会立刻中断后悔药都来不及吃。这条是血泪经验。3.5 确认驱动接管成功加载完成后用三条命令确认驱动是否真正接管了网卡# 内核模块列表中应能看到 r8168 lsmod | grep r8168 # 网络接口应重新出现并且能看到对应的状态 ip link show # 内核日志里应有 r8168 的探测和 link up 记录 dmesg | tail -30 | grep -i r8168检查项期望结果异常时看什么lsmod出现 r8168 模块回顾 3.4 的加载命令ip link网卡接口出现且 state UP查 dmesg看是否被 r8169 抢占dmesgr8168: link up, 1000Mbps查看链路协商是否正常如果ip link里接口没有 UP多半是链路协商还没完成等待几秒再执行ip link set eth0 up。如果出现接口名但无法拿到 IP先确认 DHCP 客户端是否随网络重启受到影响多数时候换驱动不影响 DHCP。4. 让 r8168 在重启和内核升级后都活着DKMS 与 blacklist 一次配好4.1 为什么直接 make install 会在下次重启后失效在第 3 章做完make install后模块被放在了/lib/modules/5.15.0-xxx/kernel/drivers/net/ethernet/realtek/这样的路径下路径中间那串数字是当前内核版本号。内核一旦升级比如从 5.15 升到 5.15.0-86新内核的模块目录里没有 r8168.komodprobe r8168自然找不到。再加上很多发行版在升级内核时会保留旧内核你重启进新内核网卡驱动就消失表现就像网卡硬件坏了。这就是 DKMS 存在的意义DKMSDynamic Kernel Module Support会在每次安装或升级内核时自动用新内核的构建目录重新编译你注册过的模块。所以想让 r8168 长期可用不能只依赖第 3 章的 make install必须把源码注册给 DKMS。4.2 DKMS 注册三步add、build、install先安装 dkms再进入源码目录操作。注意注册前同样要先 make clean否则 dkms 会把旧的编译产物一起打包可能导致后续内核升级时用错对象文件。如果源码目录里还没有 dkms.conf先按 4.4 的方式创建再回来执行 add。# 以 Debian / Ubuntu 为例安装 dkms sudo apt-get install -y dkms # 以 RHEL / Rocky 为例安装 dkms sudo dnf install -y dkms # 进入源码目录并清理 cd r8168-8.048.03 make clean # 注册模块 sudo dkms add -m r8168 -v 8.048.03 # 为当前内核编译 sudo dkms build -m r8168 -v 8.048.03 # 安装到内核模块目录 sudo dkms install -m r8168 -v 8.048.03dkms add会去源码目录寻找dkms.conf配置文件里面记录了这个模块怎么编译、装到哪里、模块名是什么。-m r8168和-v 8.048.03分别对应包名和版本号必须和你解压目录名的规律一致否则 dkms 会报 not found。dkms build这一步实际上就是在源码目录里调用 make 并指定Msrc完成后会显示构建成功dkms install把生成的 .ko 安装到所有匹配内核的模块目录里。如果希望以后每个新内核都自动编译这个模块确认 dkms.conf 里AUTOINSTALLyes。4.3 屏蔽 r8169防止两个驱动抢同一个 PCI 设备r8168 和 r8169 的 PCI ID 表高度重叠这意味着两个驱动都支持 RTL8168 这个硬件。开机时内核模块加载顺序如果让 r8169 先下手设备就被 r8169 接管了r8168 虽然也加载但并没有绑定到网卡上。所以需要在 modprobe 层把 r8169 拉黑。# 在 modprobe.d 下建立一个黑名单文件文件名必须以 .conf 结尾 echo blacklist r8169 | sudo tee /etc/modprobe.d/blacklist-r8169.conf # 检查内容 cat /etc/modprobe.d/blacklist-r8169.conf注意不要把 r8168 自己写进黑名单这行配置的意思是系统加载任何需要 r8169 的模块时直接拒绝。如果你用的是 static 内核或自己有/etc/modprobe.conf效果一样但现代发行版都读取/etc/modprobe.d/*.conf。另外有些发行版的 initramfs 也会显式加载 r8169单纯写黑名单不一定覆盖启动早期阶段这就是下一节要重建 initramfs 的原因。4.4 配置 dkms.conf 并重建 initramfs这个系列的官方包里有时会带一份 dkms.conf 模板没有也不影响自己补一份就好。下面是一份能用的最小配置放在源码根目录即可# 若包里没有现成的 dkms.conf用这份最小配置创建 cat dkms.conf EOF PACKAGE_NAMEr8168 PACKAGE_VERSION8.048.03 MAKEmake -C src/ modules CLEANmake -C src/ clean BUILT_MODULE_NAME[0]r8168 DEST_MODULE_LOCATION[0]/kernel/drivers/net/ethernet/realtek AUTOINSTALLyes EOF逐行说明PACKAGE_NAME和PACKAGE_VERSION必须和dkms add -m r8168 -v 8.048.03的参数一致MAKE告诉 dkms 在 src 子目录执行 modules 目标CLEAN是卸载或清理时执行的动作BUILT_MODULE_NAME[0]r8168声明产物模块名DEST_MODULE_LOCATION[0]指定安装路径对应内核模块树里的 realtek 目录最后一行AUTOINSTALLyes是让新内核出现时自动编译的关键。然后执行模块依赖重建和 initramfs 更新# 重新生成模块依赖关系 sudo depmod -a # Debian / Ubuntu 重建 initramfs sudo update-initramfs -u # RHEL / Rocky 重建 initramfs sudo dracut -fdepmod -a会让内核知道 r8168.ko 在模块树里的位置解决modprobe r8168找不到模块的问题。update-initramfs -u或dracut -f则把模块打进启动镜像保证开机早期网络功能就能用。这两步做完再 reboot重启后重新执行lsmod | grep r8168确认加载的是 r8168 而不是 r8169整套持久化配置就完成了。5. 避坑指南r8168 装上之后最常见的 5 个翻车点下面这些坑我都踩过前三个属于换了驱动后大概率会遇到后两个属于装完一段时间才发现的。每条按现象、原因、解决的顺序写方便你对着排查。5.1 编译报错 fatal error: linux/compiler.h: No such file or directory现象执行 make 后编译直接中断报找不到 linux/compiler.h 或类似的内核头文件。原因系统里没有安装与当前内核匹配的 linux-headers / kernel-devel或者安装的头文件版本与uname -r不一致。解决重新安装对应头文件包并检查/lib/modules/$(uname -r)/build软链接是否有效。ls -l /lib/modules/$(uname -r)/build如果提示 target 不存在说明 kernel-devel 根本没装进去需要重装。sudo apt-get install -y linux-headers-$(uname -r) # RHEL 系用 sudo dnf install -y kernel-devel-$(uname -r)如果已经安装但仍然报错多半是头文件包与当前内核小版本不一致重启进对应内核或者按实际内核版本号手动指定包名。这条是最费时间的因为报错信息往往不会直接指向头文件缺失。5.2 重启之后 r8169 又抢回网卡现象配置完全按第 4 章做完重启后lsmod里同时出现 r8169 和 r8168但网卡接口没有了或者接口名称从 eth0 变成莫名其妙的命名。原因r8169 的黑名单没有生效或者 initramfs 里还残留旧的 r8169 模块启动早期就把设备占走了。解决先检查配置确认/etc/modprobe.d/下存在以.conf结尾的黑名单文件然后重新执行update-initramfs -u或dracut -f。Ubuntu 上尤其容易踩的是文件名写成了.conf.bak或者忘了 .conf 后缀系统会直接忽略。# 确认黑名单内容 cat /etc/modprobe.d/blacklist-r8169.conf # 检查 initramfs 里是否还有 r8169 的痕迹 lsinitramfs /boot/initrd.img-$(uname -r) | grep r816看到 initramfs 里有 r8169 相关的列出内容就重新生成 initramfs如果黑名单没生效把文件改名以 .conf 结尾再执行一次重建。5.3 Secure Boot 拒绝未签名模块现象modprobe r8168报Operation not permitted或者 dmesg 里出现Key was rejected by service模块明明编译成功却加载不进去。原因UEFI Secure Boot 开启时内核只允许加载有合法签名的模块官方 tar.gz 里的 r8168.ko 没有签名自然被拒绝。解决常见做法是给模块签名并让机器信任对应密钥或者进 BIOS 固件关闭 Secure Boot。对多数自用机器关闭 Secure Boot 最直接企业环境则建议走签名流程。DKMS 在部分发行版上会自动调用签名工具前提是装了 dkms 和对应签名包注册前建议先确认这个工具链存在。5.4 插拔网线或睡眠唤醒后网卡再也不 Link up现象平时千兆正常但只要拔一次网线再插回去或者机器从睡眠唤醒dmesg 里开始反复刷 r8168 link down、link up网卡灯亮但网络不通。原因这大多和 EEE 或电源管理策略有关链路重新协商时 PHY 状态没有恢复到正常模式。解决先用 ethtool 关掉 EEE再观察是否复现。# 查看 EEE 当前状态 sudo ethtool --show-eee eth0 # 关闭 EEE sudo ethtool --set-eee eth0 eee off如果关闭后不再掉链子可以把eee off写入网络配置或者通过 modprobe 传参给 r8168 模块具体参数名以驱动包自带 README 为准。另外检查交换机和网线千兆链路对线序和老化特别敏感这类问题有相当一部分其实是物理链路翻车别全赖驱动。5.5 换了 r8168 性能还是跑不满千兆别只盯驱动现象驱动正确加载ethtool 也显示 1000Mb/s但 iperf3 只能跑到五六百兆CPU 占用还不高。原因驱动只是链路的一部分环形缓冲区大小和中断聚合参数也会显著影响吞吐此外 PCIe 电源管理可能把网卡限制在低功耗状态。解决先用 ethtool 看当前的 ring buffer 和中断参数。# 查看接收/发送环形缓冲区大小 sudo ethtool -g eth0 # 调大环形缓冲区 sudo ethtool -G eth0 rx 4096 tx 4096 # 调整中断聚合rx-usecs 表示收到包后延迟多少微秒触发中断 sudo ethtool -C eth0 rx-usecs 30 tx-usecs 30rx 4096 tx 4096是常见的安全值太小容易在突发流量下丢包太大则增加延迟。中断聚合参数调整后用 iperf3 验证观察 CPU 占用与延迟是否可接受如果不合适就改回原值。性能问题很少是单一原因驱动、队列、中断、物理链路都要一起看。6. 验证与调优用 ethtool 和 iperf3 确认 r8168 真的装好了6.1 ethtool 看驱动名与链路状态ethtool eth0是装完驱动后第一件要做的事。输出里看三行driver:必须显示 r8168如果是 r8169 说明模块没换干净Speed:应该是 1000Mb/s如果只有 100Mb/s 先查网线和对端Duplex: Full表示全双工半双工对千兆来说基本就是协商异常。这一条命令可以把第 3 章的验证和第 5 章的坑都串起来值得养成习惯。6.2 iperf3 跑一次双向吞吐链路是否真的达到千兆不靠感觉靠 iperf3 数据。一台电脑当服务端另一台当客户端在同一个交换机下测试# 服务端监听 iperf3 -s # 客户端发起 60 秒测试4 个并发流 iperf3 -c 服务器IP -P 4 -t 60 # 反向测试验证上行 iperf3 -c 服务器IP -P 4 -t 60 -R千兆有线环境里单流跑满 940Mbps 有点难4 并发流跑到 920Mbps 以上是正常水平。如果结果只有 500Mbps回头查第 5 章的环形缓冲区和中断聚合参数再查对端网卡。注意两端 iperf3 版本最好一致否则某些旧版本的窗口设置会压低吞吐。6.3 我给 r8168 做调优的习惯模块装好、吞吐验证通过之后我一般会用 udev 规则或 systemd 网络配置固化参数而不是写进 /etc/rc.local。很多发行版的 rc.local 默认不执行或者执行顺序太晚网卡先以默认参数启动再被改中间会有几秒钟的不稳定窗口。我的习惯是先跑基线确认默认参数没问题再调中断聚合和 ring buffer每改一次跑一次 iperf3记录延迟和吞吐最后把确认有效的命令写进 systemd service 或 ethtool 对应的网络脚本里。这样即使以后重装或换内核网络参数也能跟着配置走。有一台机器我当初图省事让 r8169 跑了大半年天天夜里掉一次线换过交换机、排查过 DHCP最后换回官方 r8168同一个交换机、同一根网线再没出过问题。驱动这东西不是越新越好也不是越底层越好而是要和硬件同厂家。希望这些命令和坑能让你少走一次我的弯路希望帮到你。本文还有配套的精品资源点击获取