ARTICLE DETAIL

资讯详情

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

Linux下Realtek网卡驱动从识别到编译排错完整指南

Linux下Realtek网卡驱动从识别到编译排错完整指南 简介对于使用老旧发行版或定制内核的Linux环境官方驱动源码包往往比发行版自带的通用驱动更稳定面向Linux系统中使用Realtek RTL8168B网卡的用户这份驱动源码包提供官方版本r8168-8.013.00意在解决系统安装后网卡无法识别、网络连接不稳定或缺少专用驱动的问题。资源共11个文件压缩包约58KB其中包含3个C源文件和3个头文件配合Makefile、makefile_linux24x与readme方便在不同内核版本下编译加载另有下载说明htm文档对安装步骤作简要指引虽然体积小但功能完整适合快速部署。已有2869人学习适合已掌握基本Linux操作、希望深入驱动编译与内核模块管理的读者。通过实际编译与装载可以熟悉configure、make与modprobe等命令的配合使用理解驱动模块和内核的协作关系同时学会借助系统日志判断驱动是否工作正常从而建立一套排查网卡问题的基本方法。 玩Linux这些年网卡驱动的问题没少折腾。尤其是Realtek瑞昱的网卡10台机器里少说7台是它从老主板的RTL8111到这两年流行的2.5G网卡RTL8125还有一堆USB无线网卡全都能在Linux下遇到。问题也是老一套装完系统没网、系统升级完网卡丢了、千兆口协商成百兆、跑着跑着网卡掉线。这篇文章把我这些年处理Linux下Realtek网卡驱动的完整流程和踩过的坑整理出来从确认硬件型号、判断驱动状态到编译官方驱动、解决常见故障适合Linux新手、运维和经常装机的朋友直接照着操作。1. 先别急着编译驱动确认硬件型号和当前驱动状态很多人一上来就在网上搜个驱动包开始编译结果编译不过或者编译完还是没网。其实第一步不是找驱动而是搞清楚三件事硬件到底是什么型号、系统现在认不认识它、现在用的是哪个驱动。这三件事搞清楚了后面不管走哪条路都稳。1.1 用lspci和lsusb定位硬件有线网卡在Linux下直接用lspci就能看到建议加上-k参数会把内核驱动的信息一起打出来lspci -nnk | grep -iE ethernet|network以我手头这台X99-DS3主板为例输出是这样的02:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15) Subsystem: Gigabyte Technology Co., Ltd. Motherboard [1458:e000] Kernel driver in use: r8169 Kernel modules: r8169方括号里的10ec:8168就是关键信息。10ec是Realtek的厂商ID8168是芯片型号。看到这个基本就能确定这块板载是RTL8111/8168系列千兆网卡。如果是USB无线网卡用lsusblsusb | grep -i realtek常见的ID比如0bda:8188是RTL8188GU0bda:a811是RTL8811AU。Ubuntu、Debian系统还能用lsusb -v看更多芯片细节有时能看到固件版本对后面找驱动包有参考价值。这里有个经验lspci和lsusb不仅要看芯片型号还要看revrevision号。比如RTL8168有rev 11、rev 12等版本不同版本对驱动的兼容性略有差异。如果某些异常情况一直复现rev号往往是排查的关键线索。1.2 看系统到底加载了哪个驱动硬件确认了还得确认当前实际生效的驱动。别想当然因为同一块网卡既有内核自带驱动也有官方驱动甚至第三方驱动系统默认加载哪个不一定。ethtool -i eth0输出里能看到driver字段。如果是r8169说明用的是内核自带驱动如果是r8168或r8125说明之前装过Realtek官方驱动。再配合lsmod确认模块加载状态lsmod | grep r81 modinfo r8169modinfo能看到模块的版本和依赖关系。这里有个小坑有时候系统里既有r8169也有r8168模块而且两个都在尝试绑定同一块网卡这会导致网卡一会儿有IP一会儿没有。看到这种模块打架的情况不要继续排查别的先把冲突解决掉用blacklist把不需要的那个拉黑。还有一种常见情况网卡本身没被系统识别。这种时候lspci能看到硬件但Kernel driver in use那行是空的。先别慌大概率是内核里没有对应的驱动模块比如把驱动编成模块但没加载或者硬件被BIOS禁用、PCIe设备掉电之类的原因。2. 内核自带驱动能用就别折腾我见过太多人拿到Linux第一件事就是去Realtek官网下载驱动编译其实大多数场景内核自带的r8169驱动就够了。Realtek的驱动虽然官方维护但编译、加载、后续内核升级维护都需要成本。能用自带驱动解决问题就别自己制造工作量。2.1 r8169能覆盖哪些网卡先说清楚内核里这个r8169驱动的覆盖面比我早几年想象的大得多。它以RTL8168/8111系列为主同时也支持RTL8125系列2.5G网卡很多主流发行版在新内核里已经把RTL8125的驱动合并进了r8169。这张表基本能对照大部分常见网卡芯片型号常见位置内核自带驱动官方驱动包RTL8111/8168台式机、服务器板载千兆r8169r8168RTL8125/RTL8125B2.5G板载或PCIe网卡r8169新内核r8125RTL8152/RTL8153USB转千兆有线网卡r8152r8152或官方包RTL8188GU/8188FUUSB无线网卡rtl8xxxu官方8188GU包RTL8812AUUSB无线网卡无需第三方官方或github维护包以Ubuntu 22.04及以上为例RTL8111/8168装完系统后网卡直接就是通的r8169已经在运行。RTL8125在5.15以上内核Ubuntu 22.04默认就是5.15也能被识别只是2.5G的协商在部分主板上需要手动确认一下命令是ethtool eth0看到Speed: 2500Mb/s就说明识别正常。2.2 什么时候才需要放弃自带驱动自带驱动不是万能的我总结下来遇到下面几种情况才考虑换官方驱动第一老发行版内核太旧。比如CentOS 7默认内核3.10对RTL8125的支持非常不完整2.5G网卡经常被识别成1G甚至完全无法工作。这种场景不换官方r8125驱动根本没法用。第二r8169在实际运行中出现频繁断流。具体表现为网卡链路看起来是up的但ping延迟忽高忽低SSH时不时卡住dmesg里全是link up、link down的日志。这种问题在不同内核版本上出现过有的主板和电源管理、EEE节能以太网有关换官方驱动可以规避一部分。第三需要官方驱动的特有参数。比如某些测试工具、抓包工具对驱动的版本有要求或者内核自带的驱动缺少厂商提供的一些控制接口。这类需求多出现在网络设备测试、嵌入式开发领域。我自己定了个规矩先跑一轮iperf3测试如果自带驱动能达到网卡标称速度的90%以上且没有断流就坚决不换驱动。只有在性能明显不达标、日志频繁报错、或者老内核无法识别硬件时才走官方驱动的路线。3. 官方驱动的编译安装全程实录到了这一步说明你已经确认必须换官方驱动了。这篇我把从找包到DKMS管理的完整过程写一遍按这个顺序走基本不会出大问题。3.1 从哪下载驱动、怎么选对包Realtek官网的下载页面可以找到千兆和2.5G网卡的驱动包搜索型号时会看到两个最常下载的包r8168和r8125。对应关系很简单RTL8111/8168系列用r8168RTL8125/RTL8125B用r8125。千万别下反了我见过有人给8111硬装r8125折腾一下午没搞定。下载完成后养成校验文件完整性的习惯md5sum r8168-8.049.02.tar.bz2和官网页面的MD5值比对一下不一致的包大概率是下载中断了直接解压会报错或者编译不过。如果官网下载速度不理想GitHub上也有Realtek驱动包镜像和第三方维护的仓库但这里提醒一句尽量优先官网或官方镜像第三方仓库的代码经过二次修改能不能用在生产环境要谨慎验证。3.2 依赖安装与编译配置编译驱动需要内核头文件和编译工具链。Ubuntu/Debiansudo apt install build-essential dkms linux-headers-$(uname -r)CentOS/RHELsudo yum install gcc make dkms kernel-devel kernel-headers接下来解压源码包进入目录后先看一下README和MakefileRealtek的包在src目录里tar xjf r8168-8.049.02.tar.bz2 cd r8168-8.049.02/src ls编译安装的命令一般是make clean modules sudo make install sudo depmod -a执行完先别急着重启先加载模块看有没有报错sudo modprobe -r r8169 sudo modprobe r8168重点来了如果syslog里出现module verification failed: signature not found之类的报错说明内核模块签名校验没过但有些环境下模块还是能加载。最好再确认一下lsmod | grep r8168 ethtool -i eth0看到driver: r8168就说明官方驱动已经接管这块网卡了。这里有个容易踩的坑老的内核自带r8169模块还在系统里如果不做blacklist下次重启后两个模块可能再次打架。稳妥起见新建一个blacklist文件echo blacklist r8169 | sudo tee /etc/modprobe.d/blacklist-r8169.conf sudo update-initramfs -uCentOS上命令是dracut -f。这个步骤非常关键不做的话下次重启可能又变回r8169前功尽弃。3.3 用DKMS管好模块升级内核不再掉驱动直接make install的驱动只装在当前内核版本对应的目录里下一次升级内核后新内核没有这个模块网卡又没了。我头几次就因为这个在服务器上吃了大亏升级内核后SSH直接断开必须跑到机房接显示器才能救回来。DKMS就是干这个事的内核升级时自动为新内核重新编译一遍已注册的驱动模块。操作流程如下以r8168为例sudo cp -r r8168-8.049.02 /usr/src/r8168-8.049.02 sudo dkms add -m r8168 -v 8.049.02 sudo dkms build -m r8168 -v 8.049.02 sudo dkms install -m r8168 -v 8.049.02如果包里已经有dkms.confadd之后会自动识别配置。添加完可以验证dkms status显示installed状态就成功了。以后每次升级内核DKMS会自动处理再也不用担心内核升级后失联。4. 网卡不识别、千兆变百兆、模块加载失败我遇到的坑装了这么多年驱动真正让我头疼的往往不是编译本身而是编译完了之后各种稀奇古怪的现象。这里把几个高频问题整理成速查表再挑重点展开说说。4.1 装完驱动网卡还是没出现先确认硬件是不是被系统完全识别dmesg | grep -iE r8168|r8169|realtek如果dmesg里完全没有相关信息优先检查硬件层面。我遇到过一台老机器BIOS里把“LAN Boot ROM”改成关闭后整块板载网卡直接被禁用系统里怎么都看不到。这种情况和驱动无关先进BIOS确认网卡有没有被禁用或者干脆做个Live USB启动看看在标准环境下能不能识别网卡。如果dmesg里有PCIe相关的报错比如AER错误可能是PCIe供电或插槽接触问题换个插槽试试。另外外插网卡供电不足在部分服务器上也会导致驱动加载失败。4.2 千兆协商成百兆、跑着跑着断流这类问题优先怀疑物理链路其次才是驱动。我之前遇到过一根网线看起来没坏但内网速度怎么都是100Mbps换根线立刻恢复千兆。所以排查顺序很重要ethtool eth0看输出里的Speed字段。如果是100Mb/s先检查网线、水晶头、交换机端口。如果确认物理链路没问题再尝试手动协商sudo ethtool -s eth0 speed 1000 duplex full autoneg offRTL8125这类2.5G网卡还有个常见现象在部分主板上和交换机协商失败后速率会掉到100M此时需要手动指定速率。另外和网卡节能EEE相关的断流问题可以试试sudo ethtool --set-eee eth0 eee off真实案例我的一台RTL8125网卡的机器在r8169驱动下总是出现链路up/down反复跳换了官方r8125包后明显缓解但也没根治最后定位到板载网卡的电源管理策略在BIOS里关闭了节能选项才彻底稳定。4.3 Secure Boot 导致模块加载失败现在新装的Ubuntu和Fedora默认开启Secure Boot第三方编译的驱动模块如果没有正确签名加载时会被内核拒收。dmesg里看到Required key not available或者module verification failed基本就是这个问题。个人使用的话最省事的方案是进BIOS把Secure Boot关掉。生产环境如果强制要求开启Secure Boot就得走模块签名流程生成一对密钥用kmisc utils签名模块再把公钥通过mokutil导入到系统。这个流程相对繁琐真需要的时候可以专门写一篇这里不展开。4.4 常见故障速查表现象可能原因快速处置网卡完全不存在BIOS禁用、PCIe接触不良检查BIOS/Live USB验证模块加载报verification failedSecure Boot拦截关Secure Boot或签名模块速度上不去网线/交换机物理问题换线、手动协商升级内核后网卡消失驱动没走DKMS用DKMS重新安装两个驱动抢设备r8169和r8168冲突blacklist其中一个链路up/down反复跳EEE或电源管理关闭EEE、调整BIOS节能5. 几个容易踩坑的真实场景5.1 服务器/PXE装机时网卡驱动注入在服务器上装系统尤其是PXE批量装机时如果板载网卡是Realtek启动盘和PXE引导阶段经常会找不到网卡驱动。这跟系统安装完之后的驱动加载完全是两码事。比如安装CentOS或Ubuntu server版时提示找不到设备就需要在安装引导时用linux dd的方式加载厂商提供的驱动盘或者在生成initramfs时把r8168/r8125驱动打进去。在CentOS上是这样dracut --add-drivers r8168 -f在Ubuntu上是echo r8168 | sudo tee -a /etc/initramfs-tools/modules sudo update-initramfs -u有服务器装机需求的话这个细节能省掉很多现场跑机房的时间。5.2 USB无线网卡的驱动坑USB无线网卡比板载网卡更容易踩坑因为芯片型号多、内核驱动覆盖参差不齐。RTL8188GU是比较典型的一款内核自带的rtl8xxxu驱动虽然能识别但实测稳定性一般连接5G频段时掉线概率高。解决方式是去网卡厂商官网找对应型号的Linux驱动源码编译或者找GitHub上维护好的驱动包。这类驱动编译流程和r8168类似但通常需要依赖无线扩展相关的头文件建议先看一遍README再动手别直接make。还有个小坑USB无线网卡在NetworkManager下可能不被识别为Wi-Fi设备而是被当成ethernet。遇到这种情况先用nmcli查看设备状态必要时手动指定连接方式nmcli radio wifi on nmcli dev wifi connect SSID password password5.3 Windows下驱动干净迁移到Linux反而省心很多人从Windows迁移过来有个误区以为Windows下网卡驱动被搞乱Linux下也会受影响。其实两个系统的驱动栈完全独立Windows设备管理器里那一堆Realtek驱动状态跟Linux内核毫无关系。之前有同事遇到Windows下装某个随身WiFi工具把网卡驱动弄坏后来装了Linux系统网卡反而一次就识别出来了。所以别被Windows下的驱动困扰影响判断Linux这边该查什么查什么。最后说点实在的我这些年处理Realtek网卡驱动最深刻的体会是不要迷信官方驱动也不要一遇到问题就怪驱动。排查顺序永远是先硬件、再内核日志、最后才考虑替换驱动。动网卡驱动之前一定先确保有物理控制台或者备用网络通道不然改坏驱动导致SSH掉线就真的只能跑去机房了。如果遇到新内核引起断流回滚到上一个内核往往比折腾驱动更快更稳。凡是编译安装过官方驱动的机器记得一定配上DKMS这能省下未来无数次重复劳动。本文还有配套的精品资源点击获取
返回列表