RTL8111和RTL8168是Realtek推出的千兆以太网控制器芯片,广泛应用于嵌入式设备和消费级主板。这两款芯片虽然型号不同,但驱动架构高度相似,内核中通常使用r8169驱动模块统一支持。我在多个嵌入式项目中发现,很多开发者第一次接触这类网卡时,常会遇到驱动识别或固件加载问题。
为什么内核要用r8169驱动来兼容?这得从Realtek的驱动策略说起。早期内核为每款网卡单独维护驱动,后来Realtek将多个型号的驱动代码合并优化,形成了现在的r8169通用驱动。实测在Linux 4.4及以上内核中,该驱动对RTL8111H/RTL8168H等新款芯片的支持已经相当完善。
不过要注意硬件版本差异。去年我在一块工业主板上就遇到过特殊情况:同样是RTL8168芯片,但硬件版本是G而非H,此时需要手动加载rtl8168g.fw固件文件。建议先用lspci命令确认硬件详情:
bash复制lspci -nnk | grep -i realtek
典型输出会显示类似"Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller"的信息,并列出当前绑定的内核驱动。如果显示"Kernel driver in use: r8169"说明驱动已加载,但可能还需要固件支持。
进入内核配置菜单时,建议先通过make menuconfig的搜索功能快速定位配置项。按"/"键输入"RTL8169"会直接跳转到相关配置位置。关键配置路径如下:
code复制Device Drivers →
Network device support →
Ethernet driver support →
[*] Realtek devices
<M> Realtek 8169 gigabit ethernet support
这里有个实用技巧:如果找不到Realtek设备选项,可能是当前架构配置不完整。我遇到过x86架构下显示完整选项,但切换到ARM架构时部分选项消失的情况。这时需要检查以下依赖项是否启用:
code复制CONFIG_PCI=y
CONFIG_PCI_MSI=y
CONFIG_NET_VENDOR_REALTEK=y
驱动编译完成后,生成的r8169.ko文件通常位于以下路径之一:
code复制/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/r8169.ko
/usr/lib/modules/$(uname -r)/extra/r8169.ko
安装后建议执行depmod更新模块依赖关系:
bash复制sudo depmod -a
sudo modprobe r8169
有个容易忽略的细节:新版内核可能默认启用CONFIG_MODULE_SIG验证,导致第三方编译的模块无法加载。如果遇到"module verification failed"错误,可以临时关闭验证:
bash复制sudo insmod r8169.ko --force-vermagic
驱动加载时最常见的错误就是固件加载失败,日志中会出现类似提示:
code复制r8169 0000:01:00.0: Direct firmware load for rtl_nic/rtl8168h-2.fw failed
解决方法是将对应的固件文件放入/lib/firmware/rtl_nic/目录。Realtek官方提供的固件包通常包含这些文件,但需要注意版本匹配。我在实际项目中总结出这些经验:
有个实用技巧:如果找不到对应版本的固件,可以尝试相近版本的固件。曾在一台设备上用rtl8168g-2.fw替代h版本固件也成功驱动。
Linux内核通过request_firmware()接口加载固件,具体流程是:
可以通过内核参数调整加载行为:
bash复制echo 2 > /sys/module/firmware_class/parameters/timeout
这个值设置超时秒数,对于慢速存储设备可能需要增大。在嵌入式系统中,如果固件体积较大,建议编译时直接内置到内核:
code复制[*] Enable built-in firmware blobs
[*] rtl_nic/rtl8168h-2.fw
PCIe接口的供电设计直接影响网卡稳定性。如原文提到的3.3VAUX问题,我在多个定制载板项目中都遇到过。典型症状是:
用示波器测量PCIe插槽的3.3VAUX引脚,正常应有稳定3.3V电压。如果电压异常,可以尝试以下应急方案:
除了供电问题,PCIe信号质量也值得关注。有一次调试时发现网卡间歇性断开,最终发现是PCB走线长度不匹配导致。建议检查:
可以用PCIE分析仪测量眼图,或者简单通过lspci -vv查看链路状态:
bash复制lspci -vv -s 01:00.0 | grep LnkSta
正常应显示"Speed 5GT/s"和"Width x1"等关键参数。
RTL8168网卡默认使用MSI-X中断模式,在高负载场景下可以通过调整中断亲和性提升性能。查看当前中断分配:
bash复制cat /proc/interrupts | grep r8169
设置CPU亲和性(假设要将中断绑定到CPU2):
bash复制echo 4 > /proc/irq/XX/smp_affinity
其中XX是中断号。同时可以调整NAPI权重,增加网络栈处理效率:
bash复制echo 64 > /sys/class/net/eth1/weight
通过ethtool工具可以查看和调整各类缓冲区大小:
bash复制ethtool -g eth1
典型优化方案(根据内存大小调整):
bash复制ifconfig eth1 txqueuelen 2000
进行带宽测试时,这些参数组合效果更好:
bash复制iperf3 -c 192.168.1.100 -t 60 -P 4 -O 3 -R
参数说明:
在RK3399平台实测中,经过优化的RTL8168H网卡可以达到940Mbps的物理层速率,TCP吞吐量稳定在920Mbps左右。
如果modprobe失败,按这个流程排查:
常见错误解决方案:
code复制Unknown symbol in module → 执行depmod -a
Invalid module format → 重新编译相同内核版本的驱动
Device or resource busy → 先rmmod原有驱动
遇到时断时续的连接时,可以尝试:
bash复制ethtool -s eth1 wol d
bash复制ethtool -s eth1 speed 1000 duplex full autoneg off
bash复制mii-tool -v eth1
最近调试一个案例:RTL8111网卡运行一段时间后带宽从900Mbps降到300Mbps。最终发现是散热问题导致芯片降频。解决方法:
bash复制echo 5 > /sys/class/net/eth1/device/power/control
记得定期检查网卡温度:
bash复制ethtool -m eth1 | grep temperature