ARTICLE DETAIL

资讯详情

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

CentOS 7下RTL8111/8168网卡驱动r8168安装与调优指南

CentOS 7下RTL8111/8168网卡驱动r8168安装与调优指南 简介面向 CentOS 7 下需为 Realtek 以太网卡安装或降级驱动的运维、网管与开发人员这份资源围绕 r8168 驱动在 3.10 内核与 gcc12 编译环境下的部署需求整理了离线可用的安装教程、图文步骤和对应驱动源码包解决内置 r8169 驱动在特定场景下的兼容性问题。资源以 zip 包形式交付共 40 个文件大小约 1.37MB内含 1 个 gz 驱动源码包、1 个保存自博客园的 HTML 图文教程并配有 15 张 png 操作截图、9 个 svg 图标/示意以及若干 js/css 文件用于离线展示完整教程页面避免排版或图片失效。已有 272 人学习下载。使用者解压后可获得从编译环境准备、驱动模块编译加载到网络接口状态验证的完整操作指引并覆盖 r8169 降级 r8168 的注意事项与常见排错思路整体体积小、目录简明特别适合内网环境或应急维护时作为随身参考资料。1. r8168-8.048.03.tar.gzCentOS 7 下 RTL8111/8168 网卡驱动的一次到位安装r8168-8.048.03.tar.gz 是 Realtek 官方发布的 RTL8111/8168/8411 系列板载网卡 Linux 驱动源码包。CentOS 7 用户搜到这个包的原因通常很一致系统自带的 r8169 内核模块在这颗芯片上千兆协商不下来或者大流量时 ping 抖动、偶尔断流换装 r8168 之后网络才真正稳定下来。我自己在 kernel 3.10 的机器上把两个驱动反复对比过r8168 在寄存器初始化、中断处理和 EEE 握手上的细节做得更完整这也是它在运维圈口碑不错的原因。这份资源适合两类人一类是网卡识别正常但带宽跑不满的运维另一类是板载 Realtek 网卡、开机后网络反复掉线的桌面用户。下面围绕 8.048.03 这个具体版本展开从选型、编译、参数到避坑一次说透。2. 动手前先分清 r8168 和 r8169选型不对装完白干2.1 两个驱动的血缘关系与真实差异r8168 和 r8169 名字只差一位但代码路线完全不同。r8169 是内核自带的驱动长期跟随内核源码维护r8168 是 Realtek 官方维护的厂商驱动以 tar.gz 源码包形态发布。两者驱动的是同一批物理芯片——RTL8111、RTL8168、RTL8411 以及这些芯片的 B/C/D/E/F/G 子型号差别在于代码维护主体和适配精度。r8169 的驱动名是从早期 RTL8169 芯片沿用下来的后来扩展支持到 8168/8111 家族。这个历史包袱决定了它在旧内核里对新芯片的适配不够细腻。拿 CentOS 7 的 kernel 3.10 来说r8169 在访问新芯片寄存器时初始化序列相对简单遇到 RTL8111G、RTL8168G 这类带 EEE 节能功能的型号老代码在 EEE 握手、中断合并、NAPI 轮询触发条件上处理得比较粗糙。实际表现就是千兆协商上去了但跑不稳定或者低流量时延迟偶尔波动大流量时中断频繁导致 CPU 软中断升高。判断当前驱动是否有问题可以顺带看一眼 dmesg。如果启动日志里出现r8169: cant disable ASPM或者链路反复 up/down 的记录基本上就是驱动与芯片适配不到位可以直接考虑换 r8168。ASPM 是 PCIe 的电源管理省电机制老驱动在 ASPM 和 EEE 同时开启时容易出竞态表现就是启动后网卡偶尔失联几十秒又自动恢复。r8168 的 8.048.03 版本是 Realtek 针对这批芯片出的修复版本寄存器初始化、中断处理、电源管理细节更完整。所以很多运维在 CentOS 7 上坚持换装 r8168不是 r8169 完全不能用而是同样硬件条件下r8168 的链路稳定性和吞吐表现更好。但选型不是越折腾越好。如果你用的是 CentOS 8 或者更新发行版内核已经在 4.x/5.xr8169 经过多年迭代已经成熟很多旧问题在新内核里被原厂修复。此时换 r8168 收益有限反而多一个需要维护的第三方驱动。所以搜索到这个包之后第一件事不是下载解压而是确认自己是否真的在 CentOS 7 这类 3.10 内核环境。2.2 先确认网卡芯片与当前驱动占用安装之前按顺序做三件事确认网卡芯片型号、确认当前驱动占用、确认内核版本。这三步漏掉一步后面的编译加载大概率翻车。先用 lspci 确认网卡芯片lspci | grep -i ethernet正常输出是类似Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 0c)这样一行。看RTL8111/8168/8411这一段就能判断该不该装 r8168如果显示的是 Intel、Broadcom、Atheros 这类厂商那这份资源不适合你。rev 后面那个 0c 是硬件版本号对应的是 RTL8111G/RTL8168G 这一代属于旧 r8169 上问题比较多的型号也正是换装 r8168 收益最大的场景。多网卡机器要多看一眼。lspci | grep -i ethernet会列出所有网卡控制器假如机器上有 Intel 和 Realtek 两块网卡输出的就是两行。按 PCI Bus 编号区分清楚哪块是板载 Realtek避免后面操作对错接口。第二步用 ethtool 查看当前网卡被哪个驱动占用ethtool -i eth0输出中的driver: r8169表示当前占用的是内核自带模块driver: r8168则表示驱动已经装过不需要重复操作。这里注意网卡的接口名和物理插槽不一定一一对应多网卡机器最好先用ip addr把所有接口名列出来再逐个接口执行 ethtool -i完全确认之后再动手。第三步记录内核版本和系统版本uname -r cat /etc/redhat-releaseuname -r输出的版本号典型是3.10.0-1160.el7.x86_64决定了 kernel-devel 的安装版本也决定了编译出的 .ko 模块最终装进哪个内核目录。cat /etc/redhat-release则用来确认系统确实是 CentOS 7而不是 CentOS 8——后者内核已经是 4.18r8169 的表现完全不同选择也要重新考虑。这两个信息记在终端旁边的笔记里后面编译、排错、找路径全都要用到。3. 编译安装 r8168-8.048.03从解压到开机自启的完整流程3.1 准备编译环境与内核头文件内核模块必须拿到当前内核的构建头文件才能编译这一步对应 CentOS 7 的 kernel-devel 包。缺了这个包make 阶段会直接报错fatal error: linux/version.h: No such file or directory。看到这个报错先别怀疑源码包十有八九是编译环境没配齐。安装编译工具链和头文件yum install -y gcc make kernel-devel装完确认头文件目录存在ls /usr/src/kernels/$(uname -r)如果这个目录存在并且里面能看到Makefile、include子目录说明头文件已经就位。如果目录不存在说明 kernel-devel 的版本和当前内核不一致。此时用显式版本号安装yum install -y kernel-devel-$(uname -r)这条命令的关键在于$(uname -r)命令替换它会把当前内核版本号带入包名保证安装的 headers 和运行内核完全对齐。如果 yum 提示找不到这个包名一般是本地源里没有对应版本先yum update kernel升级内核重启后再装。编译环境还有两个检查点。一个是确认 gcc 和 make 可用执行gcc --version、make --version看输出能正常打印版本号就说明工具链在。另一个是内核模块支持开关确认当前内核没有关闭模块加载功能grep CONFIG_MODULES /boot/config-$(uname -r)输出CONFIG_MODULESy说明内核支持模块加载可以继续。如果这个配置是# CONFIG_MODULES is not set说明内核编译时直接把模块支持禁掉了这种内核下所有 modprobe 操作都不可用只能换内核这也是 CentOS 7 上比较少见但存在的情况。3.2 解压、make 与 make install 的执行细节源码包解压后是一个r8168-8.048.03目录内部是经典的 Makefile 加 src 结构编译流程很固定tar -zxvf r8168-8.048.03.tar.gz cd r8168-8.048.03 make clean maketar -zxvf中的-z按 gzip 格式解压-x是解压动作-v显示解压过程-f指定文件名。make clean是保险动作用来清掉上次可能残留的 .o 文件首次编译时会提示没有任何可清理的目标这属于正常现象直接忽略。make 编译正常结束时目录下会生成src/r8168.ko。用以下命令确认模块文件存在顺便看一下文件大小ls -lh src/r8168.ko文件一般是几百 KB 到 1MB 左右过大或者只有 0 字节都说明编译有问题不要继续往下走。确认无误后执行安装make installmake install做的事是把 r8168.ko 复制到/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/然后调用 depmod 刷新模块依赖关系。执行输出会看到INSTALL ...和DEPMOD ...两行这两个标记出现就说明安装成功。如果没有 DEPMOD 行手动执行一次depmod -a也行。这里有一个常见的坑如果机器上安装了多个版本的内核make install会按当前uname -r安装。下次重启进另一个内核这个模块目录就不匹配驱动加载会失败。我自己的习惯是每次 make install 后执行一次find /lib/modules -name r8168.ko确认模块实际分布在内核目录的哪些位置心里有数再继续。3.3 卸载 r8169、加载 r8168 与开机自启编译和安装完成后要做驱动切换。先卸载当前占用的 r8169modprobe -r r8169 modprobe r8168 lsmod | grep r816modprobe -r r8169卸载内核自带驱动。这一步会导致网卡短暂掉线——如果你是通过这台机器 SSH 登录的命令执行瞬间连接就会断开所以强烈建议在物理控制台、IPMI 或者带外管理下操作避免命令没跑完就断连。modprobe r8168加载新驱动lsmod | grep r816确认模块列表中同时只有 r8168、没有 r8169。加载后检查驱动是否真正接管ethtool -i eth0重点看driver字段是否变成r8168同时看version和firmware-version字段。firmware-version显示类似rtl8168g-3的编号说明驱动正确读取了网卡固件。如果 driver 还是 r8169说明加载顺序有问题重新按顺序执行一次 modprobe。开机自启方面要把 r8169 屏蔽掉防止下次开机被内核抢先加载echo blacklist r8169 /etc/modprobe.d/r8168.conf然后重建 initramfs让开机阶段直接排除 r8169dracut -fdracut -f是 CentOS 7 上强制重建 initramfs 镜像的命令-f表示覆盖已有镜像。这一步做完再重启模块加载顺序才是可控的。非 dracut 的发行版比如 Debian/Ubuntu对应命令是update-initramfs -u但 CentOS 7 场景下用 dracut 就够了。4. 模块参数与 ethtool装完驱动后还能调什么4.1 r8168 的核心模块参数r8168 8.048.03 暴露的模块参数不多先看具体情况modinfo r8168 | grep parm输出会列出该版本支持的参数名、类型和默认值。常见的是rx_copybreak、tx_copybreak这类拷贝策略参数。以rx_copybreak为例它控制接收路径的拷贝阈值收到的数据包小于这个字节数时驱动把数据拷贝到线性 skb减少 DMA 页碎片大于阈值时走零拷贝路径省去一次内存拷贝。默认值由驱动编译时定好一般在 200 字节附近。这个参数影响的是小包场景的 CPU 占用不影响吞吐上限所以日常使用不用动它。以下是 8.048.03 里比较常见的参数具体以 modinfo 输出为准参数名含义建议rx_copybreak接收路径拷贝阈值保持默认tx_copybreak发送路径拷贝阈值保持默认dash_enable网卡远程管理硬件开关保持关闭gre_enableGRE 隧道加速默认关闭需要再开一个常见的误解是驱动装好后网速慢就到处找模块参数调。实际上 r8168 把真正影响性能的调节项都放到了 ethtool 接口模块参数只是保留的关键开关调参重点应该在 ethtool 上。如果 modinfo 输出里没有你想找的参数说明这个版本没开放别去乱改源码里的宏定义除非你做好了重编译的准备。4.2 用 ethtool 调整速率、双工与节能特性速率和双工模式调整用 ethtool 的-s参数ethtool -s eth0 speed 1000 duplex full autoneg on这条命令把 eth0 设为千兆、全双工、自协商开启。speed可选值有 10、100、1000duplex可选 half/full。如果对端设备只支持百兆把 speed 改成 100 即可。注意autoneg on与手动指定 speed 可以同时设置驱动会把自协商作为主策略手动值是约束条件。ethtool -s是临时修改重启失效。想持久化CentOS 7 的常规做法是写入网卡配置文件vi /etc/sysconfig/network-scripts/ifcfg-eth0在文件里追加一行ETHTOOL_OPTSspeed 1000 duplex full autoneg on然后systemctl restart network让配置生效。注意 ifcfg-eth0 里 DEVICE 字段必须和实际接口名一致否则配置文件会被忽略。硬件卸载特性的调整也很常见。先查看当前状态ethtool -k eth0 | grep -E tx-checksum|rx-checksum|tcp-segmentation这里-k是查看网卡特性开关。对于 RTL8111/8168 这类板载网卡在虚拟化或软路由场景下TCP 分段卸载tso偶尔会引发数据包重组异常表现是传输速率上不去但 CPU 占用很高。此时关闭 tsoethtool -K eth0 tso off-K修改特性tso off关闭 TCP 分段卸载让 CPU 负责分片发送。对多数应用服务器影响不大但对跑 Open vSwitch 或 docker 网桥的机器能明显减少偶发的大包丢包。持久化方式同样是把ETHTOOL_OPTStso off写入 ifcfg 文件。还有一个容易被忽略的节电项EEE节能以太网。某些主板在 BIOS 层默认开启 EEE网卡低流量时进入节能状态握手恢复有延迟表现就是 ping 偶尔延迟偏高。关闭命令ethtool --set-eee eth0 eee off如果输出Cannot get EEE status说明驱动或固件不支持这套接口忽略即可。关闭 EEE 后延迟曲线会平滑很多这也是很多 r8168 用户在排查间歇性高延迟时的第一个动作。5. 避坑r8168 安装中最常见的 5 个翻车现场5.1 现象make 报错找不到 linux/version.h表现是编译一开始就中断控制台输出fatal error: linux/version.h: No such file or directory。原因很简单kernel-devel 没装或者版本不匹配编译时内核头文件路径缺失。解决方法是先执行yum install -y kernel-devel-$(uname -r)然后确认/usr/src/kernels/$(uname -r)目录存在。如果目录存在还报错检查是否在 make 前执行过make clean——残留的编译缓存也可能指向错误路径clean 后重新 make 一次。5.2 现象modprobe 报 Unknown symbol 或 module not found表现是modprobe r8168执行后系统报Unknown symbol in module或者直接module r8168 not found。原因是编译时使用的内核头文件与当前运行内核不一致生成的 .ko 引用了错误的内核符号表也可能是 make install 把模块装到了别的内核目录。解决办法是重新按顺序执行uname -r核对版本 →make clean→make→make install→modprobe r8168。每次编译前都强制走一遍这个流程能避免大部分加载失败问题。5.3 现象网卡灯亮但网络不通表现是驱动加载成功、ethtool -i 显示 r8168、网卡物理灯亮但 ping 网关完全不通。最常见的原因是接口名或 MAC 发生变化换驱动后网卡可能从 eth0 变成 eth1而 IP 配置还写在旧接口上另一种情况是交换机的 ARP 表项还绑定着旧 MAC。解决方法是先ip addr查看当前接口名和 MAC再修改/etc/sysconfig/network-scripts/ifcfg-ethX里的 DEVICE 和 HWADDR 字段最后systemctl restart network。如果机器开了克隆 MAC把克隆选项关掉再试。5.4 现象重启后驱动又变回 r8169表现是重启后lsmod | grep r816输出的是 r8169 而不是 r8168。原因是 blacklist 没生效或者 dracut 没刷新initramfs 里在开机阶段就把 r8169 加载了。解决办法分两步确认/etc/modprobe.d/r8168.conf里确实有blacklist r8169这一行然后执行dracut -f重建 initramfs。这里要提醒一句如果刚执行过yum update kernel升级后的新内核需要重新编译一次 r8168 并重新执行 dracut顺序不能省。5.5 现象大流量下载时断流或丢包表现是持续下载或 iperf3 压测时每隔几十秒出现一次丢包或者吞吐直接掉到几百 Mbps 上不去。原因通常是 EEE 节能握手超时或者硬件卸载特性在大流量下处理异常。解决顺序建议这样先执行ethtool --set-eee eth0 eee off关闭节能再执行ethtool -K eth0 tso off关闭分段卸载再用 iperf3 压测对比。如果还不行检查对端交换机端口是否强制千兆、双工模式是否一致。多数情况下前三步就能解决问题。6. 验证驱动是否真正接管dmesg、ethtool 与 iperf3 三板斧6.1 dmesg 确认驱动加载与链路协商装完驱动不是看到 ethtool 显示 r8168 就完事还要确认驱动真正接管了中断和链路状态。dmesg 是内核日志的直接证据dmesg | grep -i r8168正常输出里应该有两条关键记录一条是r8168: This product is supported说明驱动识别了芯片型号另一条是r8168: 1: eth0: link up说明链路层协商成功。如果只有加载记录但看不到 link up说明物理链路有问题先查网线和交换机端口不要急着怀疑驱动。如果 dmesg 里出现r8168: eth0: link down后跟着又 link up 的记录说明链路在抖动。优先排查网线质量、交换机端口协商和 EEE 设置必要时关掉 EEE 再看。6.2 ethtool 与 iperf3 双向压测dmesg 确认加载后做一轮双向压测才算最终验证。常用组合ethtool eth0 ping -c 100 -i 0.2 网关IP iperf3 -c 对端IP -t 60ethtool eth0看 Speed、Duplex、Link detected 三项。Speed 应该是 1000Mb/sDuplex 是 FullLink detected 是 yes。ping 100 个小包延迟应该在 1ms 以内不能有丢包。iperf3 -c跑 60 秒观察带宽是否稳定在 940Mbps 附近。反向测试加-R参数如果正向正常但反向明显偏低重点查对端网卡和交换机端口协商。这套验证流程看着简单但能暴露大部分安装残留问题。从那以后我每次给 CentOS 7 机器换 r8168 驱动都强制自己走一遍lspci 核对芯片型号、ethtool -i 确认驱动名、dmesg 查链路协商再上 iperf3 压一轮双向带宽。一开始觉得麻烦后来发现这个三板斧流程在排查「驱动装好了但问题依旧」的场景时能省下大量时间。希望帮到你。本文还有配套的精品资源点击获取
返回列表