1. 项目背景与核心需求拆解
手里有一台跑着 CentOS 7 的机器,主板自带的网口只有千兆,内网传输大文件的时候速度卡在 110MB/s 左右上不去,换了一块 2.5G 的独立网卡插上去,结果系统根本不认。ip addr里看不到新接口,lspci能看到硬件但ifconfig -a里就是没有对应的网络设备。这个场景我相信不少折腾家庭服务器、小型工作室内网、或者做视频剪辑素材同步的朋友都遇到过。
CentOS 7 的内核版本停留在 3.10 这个老底子上,虽然红帽一直在往回移植新驱动,但 2.5G 网卡这个品类大规模普及的时间点比 CentOS 7 的生命周期要晚不少。Realtek 的 2.5G 系列芯片(常见的有 RTL8125、RTL8125B、RTL8125BG 等,市面上很多标着“3000”字样的卡其实用的就是这一套方案)在原版 CentOS 7 内核里没有内置驱动,系统装完就是认不出来。这不是硬件坏了,也不是卡插错了,纯粹是驱动没跟上。
这篇文章要解决的问题很明确:在 CentOS 7 上把 Realtek 2.5G 网卡驱动装好,让系统正常识别并跑满 2.5G 的协商速率。我会从硬件识别、驱动来源选择、编译安装、参数调优、到常见故障排查,完整走一遍。适合手里有 CentOS 7 机器、买了 2.5G 网卡但装不上驱动的朋友参考,也适合想了解 Linux 下网卡驱动编译流程的读者。整个过程不需要重装系统,也不需要升级内核,跟着做基本都能搞定。
需要提前说明的是,Realtek 官方对 Linux 驱动的维护态度一直比较微妙,官网放出来的驱动包版本更新不算勤快,但好在能用。社区里也有基于官方源码做改进的版本,稳定性更好一些。我下面会以官方驱动为主线来讲,同时把社区版本的取舍逻辑说清楚,你可以根据自己的情况选。
2. 硬件识别与驱动方案选型
2.1 先确认网卡到底认没认出来
装驱动之前,第一步永远是确认硬件层面系统有没有看到这块卡。很多人一上来就急着找驱动,结果折腾半天发现是卡没插紧或者 PCIe 插槽有问题,白白浪费时间。
用lspci命令来看:
lspci | grep -i ethernet如果输出里出现了类似Ethernet controller: Realtek Semiconductor Co., Ltd. Device 8125这样的行,说明 PCIe 层面系统已经识别到硬件了,只是缺驱动来把它变成一个可用的网络接口。如果lspci里压根没有新设备,那就要检查卡是不是插好了、插槽是不是好的、BIOS 里有没有禁用对应的 PCIe 通道。
再确认一下当前内核版本:
uname -rCentOS 7 常见的内核版本是3.10.0-1160系列。记住这个版本号,后面编译驱动的时候需要用到对应的内核头文件。
还可以看看系统有没有自动加载什么不匹配的驱动:
lsmod | grep -i r816有时候系统会错误地加载老旧的r8169驱动去尝试驱动 2.5G 芯片,结果就是接口出不来或者出来了但速率不对。这种情况需要先把老驱动黑名单掉。
2.2 驱动来源怎么选
Realtek 2.5G 网卡的 Linux 驱动,来源主要有三个:
| 来源 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Realtek 官方驱动包 | 官方维护,版本明确 | 更新慢,部分版本有已知 bug | 追求稳定、不想折腾 |
| 内核社区 r8169 新版本 | 集成度高,无需额外编译 | CentOS 7 内核太老,需要自行移植 | 有内核编译经验 |
| 社区改进版驱动 | 修复了官方版的一些问题 | 来源需自行甄别 | 官方驱动跑不稳时尝试 |
我的建议是:优先用 Realtek 官方驱动。官方驱动虽然更新不勤,但至少来源可靠,编译流程标准化,出问题了也好排查。社区改进版适合在官方驱动确实跑不通的情况下作为备选,但下载之前一定要确认来源的可信度。
官方驱动的获取方式是从 Realtek 官网下载对应的 Linux 驱动源码包,通常是一个 tar.gz 压缩包,里面包含src目录和Makefile。文件名一般类似r8125-9.xxx.tar.gz这种格式,版本号越大越新。下载的时候注意区分,Realtek 官网有时候会把不同芯片的驱动放在不同页面,2.5G 系列认准 r8125 这个前缀就行。
提示:下载驱动包之前先确认自己的芯片型号。
lspci -nn可以看到设备的 PCI ID,比如10ec:8125就对应 RTL8125。如果 PCI ID 是10ec:8168那是千兆的 r8168,别下错了。
2.3 编译环境准备
CentOS 7 最小化安装的话,编译工具链和内核头文件都不一定有。先把依赖装齐:
yum install -y gcc make kernel-devel kernel-headers这里有个关键点:kernel-devel的版本必须和当前运行的内核版本完全一致。如果你之前yum update过内核但没重启,那uname -r显示的是老内核,而kernel-devel装的是新内核的头文件,编译的时候就会报找不到内核源码路径的错误。
确认版本一致的方法:
uname -r rpm -q kernel-devel两个输出的版本号应该完全一样。如果不一致,要么重启切换到新内核,要么手动安装对应版本的kernel-devel:
yum install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r)如果 yum 源里找不到对应版本(CentOS 7 已经停止维护,部分镜像源可能缺包),可以去 vault 源里找,或者用elrepo源补充。这一步是很多新手卡住的地方,编译报错十有八九是这里没对齐。
另外确认一下gcc版本:
gcc --versionCentOS 7 默认的 gcc 是 4.8.5,编译 Realtek 驱动足够了。不需要升级到更高版本,升级反而可能引入兼容性问题。
3. 驱动编译与安装实操
3.1 解压与编译
把下载好的驱动包传到机器上,解压:
tar -xzf r8125-9.xxx.tar.gz cd r8125-9.xxx进入源码目录后,先看一眼Makefile里的目标内核路径配置。正常情况下它会自动读取/lib/modules/$(uname -r)/build这个路径,如果kernel-devel装好了,这个路径是存在的。
直接编译:
make clean makemake clean先清理一下之前可能残留的编译产物,避免旧对象文件干扰。编译过程大概几十秒到一两分钟,取决于机器性能。如果一切顺利,最后会在src目录下生成r8125.ko这个内核模块文件。
编译过程中常见的报错及原因:
make: *** /lib/modules/3.10.0-xxx.el7.x86_64/build: No such file or directory:kernel-devel没装或者版本不对,回到 2.3 节检查。error: implicit declaration of function 'xxx':驱动源码和内核版本不兼容,通常是驱动太老或者内核太新,换个驱动版本试试。warning: ...一堆警告但最后编译成功:警告一般可以忽略,Realtek 的代码风格就这样,只要生成了.ko文件就行。
3.2 安装模块与加载
编译成功后,把模块安装到系统模块目录:
make install这个命令会把r8125.ko拷贝到/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/下面,同时更新模块依赖关系。
然后加载模块:
modprobe r8125加载之后立刻检查:
lsmod | grep r8125 ip addr如果lsmod里能看到r8125,并且ip addr里多出来一个enpXsY这样的接口,说明驱动加载成功了。接口名字里的X和Y是 PCIe 总线号和槽位号,每台机器可能不一样,不用纠结。
注意:如果之前系统自动加载了
r8169驱动,需要先把它卸载掉再加载r8125,否则两个驱动会打架。卸载命令是modprobe -r r8169,如果提示模块正在使用,先ip link set <接口名> down再卸载。
3.3 设置开机自动加载
modprobe加载的模块重启后就没了,需要配置开机自动加载。创建配置文件:
echo "r8125" > /etc/modules-load.d/r8125.conf同时把r8169加入黑名单,防止它抢着加载:
echo "blacklist r8169" > /etc/modprobe.d/blacklist-r8169.conf这两个文件建好之后,重启系统验证一下:
reboot重启后再次lsmod | grep r8125和ip addr,确认接口还在。如果接口没了,检查上面两个配置文件路径和内容是否正确。
3.4 接口配置与速率验证
接口出来之后,默认可能是 down 状态,需要启用:
ip link set enp3s0 up然后配置 IP。如果是 DHCP 环境:
dhclient enp3s0如果是静态 IP,编辑/etc/sysconfig/network-scripts/ifcfg-enp3s0,按照标准格式填写IPADDR、NETMASK、GATEWAY、DNS1等参数,然后systemctl restart network。
验证协商速率:
ethtool enp3s0输出里关注Speed这一行,正常应该是2500Mb/s。如果显示1000Mb/s甚至100Mb/s,说明协商有问题,检查网线是不是超五类以上(2.5G 至少需要超五类线,六类更稳)、对端设备是不是支持 2.5G、网口有没有插紧。
还可以看Supported link modes和Advertised link modes,确认 2500baseT 在支持列表里。如果Supported link modes里压根没有 2500baseT,那说明驱动虽然加载了但没正确识别芯片能力,可能需要换驱动版本。
4. 性能调优与稳定性加固
4.1 中断合并与队列调优
驱动装好能跑之后,默认参数不一定是最优的。2.5G 网卡的中断频率如果太高,会大量占用 CPU;太低又会影响小包转发性能。可以通过ethtool调整中断合并参数:
ethtool -c enp3s0看看当前的rx-usecs和tx-usecs值。默认可能是 0 或者比较小的值。对于文件传输为主的场景,可以适当调大:
ethtool -C enp3s0 rx-usecs 50 tx-usecs 50这个值不是越大越好,调太大延迟会明显上升。50 微秒是一个比较平衡的值,实测在文件服务器场景下 CPU 占用能降下来不少,延迟增加也在可接受范围内。
如果机器 CPU 核心多,还可以看看多队列支持:
ethtool -l enp3s0Realtek 2.5G 驱动一般支持多队列,可以根据 CPU 核心数调整Combined队列数。不过 CentOS 7 默认的irqbalance服务会自动分配中断,一般不需要手动绑核。
4.2 MTU 调整的取舍
有人喜欢把 MTU 调到 9000 来提升大文件传输效率,这个在 2.5G 环境下确实有效果,但前提是整条链路的所有设备都支持巨帧。中间只要有一个交换机或者对端设备不支持,就会出现丢包、连接不稳定甚至完全不通的情况。
我的建议是:内网环境完全可控的情况下可以试,先在一台机器上改:
ip link set enp3s0 mtu 9000然后 ping 对端测试:
ping -M do -s 8972 <对端IP>-M do表示禁止分片,-s 8972是 9000 减去 ICMP 头(8字节)和 IP 头(20字节)。如果能 ping 通说明链路支持,ping 不通就老老实实改回 1500。
提示:MTU 改动要两端同时改,只改一端会导致大包被丢弃。生产环境改之前先在测试环境验证,别直接上。
4.3 驱动参数微调
Realtek 驱动支持一些模块参数,可以在加载时传入。查看可用参数:
modinfo r8125常见的可调参数包括speed、duplex、autoneg、aspm等。其中aspm值得关注,ASPM(Active State Power Management)在某些主板上会导致网卡频繁掉线或者速率协商不稳定。如果遇到随机断连,可以尝试关闭 ASPM:
echo "options r8125 aspm=0" > /etc/modprobe.d/r8125.conf然后重新加载模块或者重启。这个参数对功耗有一点点影响,但稳定性优先。
另外s5wol参数控制关机唤醒功能,如果不需要网络唤醒可以关掉,减少待机功耗。
4.4 固件更新
Realtek 2.5G 网卡有些批次存在硬件层面的兼容性问题,表现为特定交换机下协商不到 2.5G 或者频繁掉线。这种情况可以看看有没有固件更新。Realtek 官网偶尔会放出固件更新工具,但 Linux 下的更新工具不如 Windows 下完善。
如果固件更新这条路走不通,可以尝试在驱动层面强制指定速率:
ethtool -s enp3s0 speed 2500 duplex full autoneg on或者关掉自协商强制 2.5G:
ethtool -s enp3s0 speed 2500 duplex full autoneg off强制速率是最后的手段,因为关掉自协商后如果对端不支持 2.5G,链路直接起不来。优先还是让自协商工作。
5. 常见故障排查速查
5.1 驱动加载失败排查
| 现象 | 可能原因 | 排查方法 | 解决方式 |
|---|---|---|---|
modprobe r8125报错Module not found | 模块没安装到正确路径 | find /lib/modules -name "r8125*" | 重新make install |
加载后lsmod看不到 | 模块加载被拒绝 | `dmesg | tail -20` 看内核日志 |
| 接口出不来 | 驱动和芯片不匹配 | lspci -nn确认 PCI ID | 换对应驱动版本 |
| 接口出来但速率不对 | 协商问题或线缆问题 | ethtool看协商结果 | 换线、检查对端、调 ASPM |
dmesg是排查驱动问题最重要的工具。加载模块后立刻dmesg | tail -30,里面会显示驱动版本、芯片型号、初始化过程中的错误信息。比如r8125: This product is covered by one or more of the following patents这种是正常信息,而r8125: probe of 0000:03:00.0 failed with error -5这种就是出问题了,错误码-5通常表示 I/O 错误,可能是硬件或者插槽问题。
5.2 网络不通的排查顺序
接口出来了、速率也对了,但网络不通,按这个顺序查:
- 接口状态:
ip link show enp3s0,确认是UP状态。如果是DOWN,ip link set enp3s0 up。 - IP 配置:
ip addr show enp3s0,确认有 IP 地址。没有的话检查 DHCP 或者静态配置。 - 路由:
ip route,确认默认路由存在。 - ARP:
arp -n,看能不能解析到网关的 MAC 地址。解析不到说明二层不通。 - 物理层:
ethtool enp3s0看Link detected是不是yes。是no的话检查网线和对端设备。 - 防火墙:
iptables -L -n或者firewall-cmd --list-all,确认没有拦截。
这个顺序是从底层往上查,每一步确认没问题再往下走,比盲目 ping 效率高得多。
5.3 性能不达标的调优思路
2.5G 网卡实际跑不到 2.5G 是常见问题,原因可能有很多层:
- 磁盘瓶颈:如果是对拷文件,机械硬盘的顺序读写可能只有 150-200MB/s,2.5G 网络的理论上限是 312MB/s,磁盘先成了瓶颈。用
dd或者fio测一下磁盘实际速度。 - CPU 瓶颈:老机器的 CPU 处理 2.5G 流量的软中断可能吃满一个核。
top看si这一列,如果接近 100% 说明 CPU 是瓶颈。可以尝试开启多队列或者调整中断合并。 - PCIe 带宽:2.5G 网卡一般是 PCIe 2.0 x1,理论带宽 500MB/s,足够 2.5G 使用。但如果插在 PCIe 1.0 的槽上,带宽只有 250MB/s,就会成为瓶颈。确认一下插槽版本。
- 交换机瓶颈:如果中间经过交换机,确认交换机端口支持 2.5G。很多老交换机只有千兆口,插上去自动降速到 1000Mb/s。
- 测试方法问题:用
iperf3测纯网络性能,排除磁盘干扰。iperf3 -s在一端起服务,另一端iperf3 -c <IP> -t 30 -P 4,多线程测试。单线程可能跑不满,多线程更容易压满带宽。
我实测下来,RTL8125 在 CentOS 7 上跑 iperf3 多线程,稳定在 2.3-2.4Gbps 左右是正常水平,受限于 PCIe 和协议开销,很难跑到理论满速 2.5Gbps。如果只有 1.5Gbps 以下,那就需要按上面的思路逐项排查了。
5.4 系统日志里的线索
/var/log/messages里会记录网卡相关的内核消息。如果遇到随机断连,可以:
grep -i "r8125\|enp3s0" /var/log/messages | tail -50看看有没有link down、link up反复出现的记录。频繁的 link flap 通常是线缆质量差、接口接触不良、或者 ASPM 兼容性问题。先换线,再关 ASPM,最后考虑换卡。
还有一个容易忽略的点:NetworkManager和传统的network服务可能会冲突。CentOS 7 默认用NetworkManager,但很多服务器习惯用network服务。两个都开着的话,接口配置可能被互相覆盖。确认一下:
systemctl status NetworkManager systemctl status network建议只保留一个。服务器环境我一般用network服务,配置直观,排查方便。
6. 实操心得与避坑经验
6.1 编译环境的坑
kernel-devel版本不匹配是最高频的编译失败原因,没有之一。CentOS 7 的yum update会更新内核但不会自动重启,导致运行内核和头文件版本错位。养成习惯:装驱动之前先uname -r和rpm -q kernel-devel对一下版本,不一致就先解决这个问题,能省掉大量无效折腾。
另外 CentOS 7 已经停止维护,默认的 yum 源可能已经失效。如果yum install报 404,需要把源地址换成 vault 源。具体操作是编辑/etc/yum.repos.d/CentOS-Base.repo,把mirrorlist行注释掉,baseurl指向vault.centos.org对应的路径。这个操作网上教程很多,照着改就行。
6.2 驱动版本的选择
Realtek 官网的驱动版本号从 9.003 到 9.011 都有,不是越新越好。我遇到过 9.009 版本在某些主板上导致系统休眠后网卡不恢复的问题,换回 9.007 就正常了。如果最新版有问题,往前退一两个版本试试。
社区改进版驱动(比如某些 GitHub 上维护的分支)修复了官方版的一些电源管理问题,但代码改动没有经过官方验证,稳定性需要自己评估。我的做法是:官方版能用就不折腾社区版,官方版确实有问题再考虑。
6.3 网线和水晶头别省钱
2.5G 对线缆质量比千兆敏感得多。超五类线在短距离(10米以内)跑 2.5G 一般没问题,但长距离或者线材质量差的话,协商不到 2.5G 或者跑起来丢包。六类线是更稳妥的选择,尤其是走线距离超过 20 米的情况。
水晶头压接质量也很关键。我遇到过一根线千兆能跑满但 2.5G 死活协商不上,换了一根成品六类线立刻就好了。后来检查发现是水晶头压接时线序有轻微问题,千兆下勉强能用,2.5G 下就暴露了。所以调试 2.5G 网络时,先换一根确认质量好的成品线,排除线缆因素再查其他。
6.4 备份原始配置
装驱动之前,把当前的网络配置备份一下:
cp -r /etc/sysconfig/network-scripts /root/network-scripts-backup万一驱动装完网络起不来,还能通过带外管理或者本地终端恢复。如果是远程操作,更要小心,驱动加载后如果网络不通,远程连接就断了。有条件的话先在本地终端或者 IPMI 里操作,确认没问题再远程搞。
6.5 内核升级后的处理
CentOS 7 如果后续升级了内核,之前编译的r8125.ko是针对老内核的,新内核下加载会失败。需要重新编译安装:
cd r8125-9.xxx make clean make make install然后重启。所以驱动源码包别删,留着备用。或者把编译好的.ko文件备份到/root/drivers/下面,升级内核后如果编译环境还在,重新make install就行。
如果升级内核后不想重新编译,也可以考虑用 DKMS(Dynamic Kernel Module Support)来管理。DKMS 能在内核升级时自动重新编译模块,省去手动操作。CentOS 7 装 DKMS 需要epel源:
yum install -y epel-release yum install -y dkms然后把驱动源码放到/usr/src/r8125-9.xxx/下面,创建dkms.conf配置文件,dkms add、dkms build、dkms install三步走。配置稍微麻烦一点,但一劳永逸。对于经常升级内核的机器,值得花时间配一下。
6.6 温度与散热
2.5G 网卡芯片发热量比千兆大不少,尤其是长时间满速传输的时候。如果机箱风道不好,网卡芯片温度可能到 70 度以上,导致降速或者断连。摸一下网卡散热片烫不烫手,烫的话加个小风扇吹着。很多便宜的 2.5G 卡散热片就是一块薄铝片,散热效果有限,自己换个厚一点的散热片或者加个 4cm 小风扇,稳定性会好很多。
这个细节很少有人提,但我在夏天遇到过好几次网卡跑着跑着掉速,排查半天最后发现是温度问题。加了个小风扇之后再也没有复现过。