ARTICLE DETAIL

资讯详情

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

Realtek网卡驱动重装全攻略:DKMS与auto_run.sh深度解析

Realtek网卡驱动重装全攻略:DKMS与auto_run.sh深度解析 1. 重装网络驱动这件事远比想象中复杂网络驱动重装听起来像是“卸载再安装”这么简单但真正动过手的人都知道这里面的坑一个接一个。尤其是当你面对的是Realtek系列网卡——无论是板载的PCIe GbE Family Controller还是USB接口的RTL8811CU、RTL8812BU无线网卡——驱动问题往往不是“重装”两个字能概括的。我见过太多人卡在“设备管理器里找不到网卡”“驱动装完没网络”“DKMS编译失败”这些环节上最后只能重装系统了事。这篇文章要聊的就是围绕Realtek网卡驱动重装这件事把整个流程拆开揉碎。从为什么需要重装、驱动包怎么选、DKMS机制怎么运作、auto_run.sh脚本到底干了什么到装完之后没网络怎么排查我都会按实际操作顺序一步步讲清楚。适合那些正在折腾Linux服务器网卡、Windows老机器网卡驱动、或者USB无线网卡驱动的人参考。不管你是刚接触驱动安装的新手还是已经踩过几次坑的老手这里应该都能找到一些有用的东西。Realtek的网卡芯片出货量极大从台式机板载的RTL8111/8168系列到笔记本常见的RTL8821CE、RTL8852BE再到USB外接的RTL8811CU、RTL8812BU覆盖面非常广。但Realtek官方驱动和内核自带驱动之间的关系一直很微妙——内核自带的r8169驱动虽然能驱动大部分RTL8168网卡但在某些版本上存在稳定性问题、性能损失或者功能缺失。这就是为什么很多人宁愿手动编译安装Realtek官方驱动也不愿意用内核自带的。而手动安装就涉及到DKMS、auto_run.sh这些工具和脚本每一步都有讲究。2. 为什么你的Realtek网卡需要重装驱动2.1 内核自带驱动和官方驱动的差异Linux内核自带了一个名为r8169的驱动它支持Realtek RTL8168/8111系列千兆网卡。理论上插上网线就能用不需要额外装驱动。但实际使用中r8169驱动存在几个让人头疼的问题一是某些内核版本下网卡会频繁断连dmesg里刷满“link up/down”的日志二是大流量传输时性能不如官方驱动尤其是千兆满速跑的时候CPU占用偏高三是部分新批次的RTL8168芯片r8169识别有问题直接不认网卡。Realtek官方提供的r8168驱动就是针对这些问题的。它由Realtek自己维护更新频率虽然不算高但对自家芯片的兼容性和性能优化明显更好。官方驱动包通常以tar.gz格式发布里面包含源码、DKMS配置文件、auto_run.sh安装脚本等。安装之后系统会优先加载r8168而不是r8169网卡工作状态也会更稳定。那怎么判断当前用的是哪个驱动一条命令就能看出来lspci -k | grep -A 3 -i ethernet输出里会显示“Kernel driver in use: r8169”或者“r8168”。如果是r8169且你遇到了网络问题那重装官方驱动就是值得尝试的方案。2.2 什么情况下必须重装驱动不是所有网络问题都需要重装驱动但以下几种情况基本可以确定是驱动层面的问题网卡在设备管理器或lspci中能看到但ifconfig/ip link里没有对应的网络接口网卡能识别但连接速度只有100Mbps甚至10Mbps换线换交换机都没用网络时断时续dmesg里大量“eth0: link up/down”或“r8169: eth0: link down”系统更新内核后网卡直接不工作因为DKMS没有正确重建模块USB无线网卡插上后系统完全不识别lsusb能看到设备但iwconfig没有无线接口这些问题的根源往往是驱动版本不匹配、驱动模块没有正确加载、或者内核更新后模块签名/编译出了问题。重装驱动是最直接的解决方式但前提是你要选对驱动版本、用对安装方法。2.3 驱动包里的关键文件都是干什么的Realtek官方驱动包解压后通常会看到这些文件文件名作用r8168-x.xx.x.tar.bz2驱动源码压缩包dkms.confDKMS配置文件定义模块名、版本、编译规则auto_run.sh自动安装脚本封装了编译、安装、加载流程README安装说明和参数解释src/源码目录包含r8168.c、r8168.h等其中auto_run.sh是最常被用到的。它本质上是一个Shell脚本内部会调用make、make install、modprobe等命令把驱动编译并加载到当前内核。但如果你直接运行它而不理解它做了什么遇到问题就很难排查。后面我会详细拆解这个脚本的执行逻辑。3. DKMS机制驱动与内核版本的爱恨情仇3.1 DKMS到底解决了什么问题DKMS全称Dynamic Kernel Module Support翻译过来就是动态内核模块支持。它的核心作用是当系统内核更新时自动重新编译并安装第三方内核模块让驱动不会因为内核升级而失效。没有DKMS的时候你手动编译安装了一个网卡驱动某天系统自动更新了内核重启之后网卡直接不工作了。因为旧驱动模块是针对旧内核编译的新内核加载不了。你只能重新下载驱动、重新编译、重新安装。如果管理的是几十台服务器这简直是噩梦。有了DKMS之后驱动源码和编译配置被注册到DKMS框架里。每次内核更新DKMS会自动触发重新编译把新模块安装到新内核的模块目录下。你只需要保证DKMS服务正常运行、源码目录没有被删除就行。Realtek官方驱动包从r8168-8.048版本开始就自带了dkms.conf说明官方也意识到了DKMS的重要性。但很多人安装时直接跑auto_run.sh脚本内部会判断系统有没有DKMS有就注册没有就普通编译安装。这就导致一个问题如果安装时DKMS没装好驱动虽然当时能用但内核一升级就废了。3.2 DKMS的安装和配置要点在Debian/Ubuntu系上安装DKMS很简单sudo apt update sudo apt install dkms build-essential linux-headers-$(uname -r)在RHEL/CentOS系上sudo yum install epel-release sudo yum install dkms gcc make kernel-devel-$(uname -r)这里有个关键点linux-headers或kernel-devel的版本必须和当前运行的内核版本完全一致。很多人编译失败就是因为头文件版本对不上。用uname -r确认当前内核版本然后安装对应版本的头文件包。DKMS的配置文件dkms.conf通常长这样PACKAGE_NAMEr8168 PACKAGE_VERSION8.051.02 BUILT_MODULE_NAME[0]r8168 DEST_MODULE_LOCATION[0]/kernel/drivers/net/ethernet/realtek AUTOINSTALLyes MAKE[0]make -C src/ clean MAKE[1]make -C src/ modules CLEANmake -C src/ cleanPACKAGE_NAME和PACKAGE_VERSION定义了模块在DKMS中的标识。BUILT_MODULE_NAME是编译出来的模块名。DEST_MODULE_LOCATION指定模块安装到内核模块目录的哪个位置。MAKE数组定义了编译命令序列。这些配置决定了DKMS能否正确编译和安装模块。3.3 DKMS常见故障和处理方法DKMS出问题的时候dkms status命令是你的第一诊断工具。正常输出应该是这样的r8168/8.051.02, 5.15.0-91-generic, x86_64: installed如果显示built而不是installed说明编译成功了但没安装到内核模块目录。如果显示added但后面没有内核版本说明还没编译。如果直接报错那就要看/var/lib/dkms/r8168/8.051.02/build/make.log里的编译日志。最常见的DKMS故障是内核更新后自动编译失败原因通常是新内核的头文件还没安装。解决办法是手动安装新内核头文件然后重新触发DKMSsudo apt install linux-headers-$(uname -r) sudo dkms autoinstall另一个常见问题是DKMS模块和内核自带模块冲突。比如r8168和r8169同时存在系统可能加载了r8169而不是r8168。这时候需要把r8169加入黑名单echo blacklist r8169 | sudo tee /etc/modprobe.d/blacklist-r8169.conf sudo update-initramfs -u重启后再确认加载的是哪个驱动。4. auto_run.sh脚本拆解它到底做了什么4.1 脚本执行流程逐行分析Realtek驱动包里的auto_run.sh看起来不起眼但它封装了整个安装流程。我把它核心逻辑拆开讲一下这样你遇到问题就知道卡在哪一步。脚本开头通常会检查当前用户是不是root不是就提示用sudo运行。然后检测系统架构和内核版本确定源码目录路径。接着检查DKMS是否存在如果存在就执行dkms add、dkms build、dkms install这一套。如果不存在就退回到传统的make、make install方式。关键步骤包括# 检查root权限 if [ $(id -u) ! 0 ]; then echo 请使用root权限运行 exit 1 fi # 检测DKMS if command -v dkms /dev/null 21; then dkms add -m r8168 -v ${VERSION} dkms build -m r8168 -v ${VERSION} dkms install -m r8168 -v ${VERSION} else make -C src/ clean make -C src/ modules make -C src/ install fi # 加载模块 modprobe r8168脚本还会处理模块黑名单、更新initramfs、重启网络服务等收尾工作。但不同版本的脚本细节有差异有的版本会直接覆盖/etc/modprobe.d/下的配置文件有的会备份原文件。4.2 手动执行比脚本更可控虽然auto_run.sh方便但我个人更推荐手动执行每一步。原因很简单脚本出错了你只能看它打印的日志而手动执行你能精确控制每个环节出错时也更容易定位。手动安装的完整流程是这样的# 解压驱动包 tar -xjf r8168-8.051.02.tar.bz2 cd r8168-8.051.02 # 清理旧编译产物 make -C src/ clean # 编译模块 make -C src/ modules # 安装模块到内核目录 sudo make -C src/ install # 加载模块 sudo modprobe r8168 # 确认加载成功 lsmod | grep r8168如果要用DKMS管理手动注册的流程是sudo cp -r r8168-8.051.02 /usr/src/ sudo dkms add -m r8168 -v 8.051.02 sudo dkms build -m r8168 -v 8.051.02 sudo dkms install -m r8168 -v 8.051.02这样安装之后DKMS会接管后续的内核更新重建工作。4.3 安装后的验证和收尾工作驱动装完不代表万事大吉必须做几项验证第一确认模块加载的是r8168而不是r8169lsmod | grep r816如果两个都加载了说明黑名单没生效需要检查/etc/modprobe.d/下的配置文件。第二确认网络接口存在ip link show应该能看到eth0或enp3s0之类的接口状态是UP或者DOWN。第三检查驱动版本和网卡信息ethtool -i eth0输出里的driver: r8168和version: 8.051.02就是当前驱动信息。第四测试网络连通性ping -c 4 223.5.5.5如果ping不通先检查IP配置、路由表、DNS设置再回头看驱动层面。5. 重装驱动后没网络排查思路和实战案例5.1 从底层到上层的排查顺序驱动装完没网络很多人第一反应是“驱动没装好”但实际上问题可能出在更上层。我习惯按这个顺序排查物理层网线插好了吗网口灯亮不亮换根线、换个交换机口试试驱动层lsmod看模块加载没有dmesg | grep r8168看有没有报错接口层ip link看接口是否存在状态是UP还是DOWNIP层ip addr看有没有IP地址ip route看路由表DNS层cat /etc/resolv.conf看DNS配置防火墙层iptables -L或nft list ruleset看有没有拦截规则这个顺序的核心逻辑是先确认硬件和驱动正常再往上查网络配置。如果驱动层就有问题上面几层根本不用看。5.2 常见问题速查表现象可能原因排查命令解决方法lspci能看到网卡ip link没有接口驱动未加载或加载失败dmesg | grep -i r816手动modprobe检查编译日志接口存在但状态DOWN网线未插好或协商失败ethtool eth0检查网线尝试ethtool -s eth0 autoneg on接口UP但无IPDHCP未获取或静态IP未配置dhclient eth0或检查netplan配置IP地址能ping通IP但域名解析失败DNS配置问题cat /etc/resolv.conf添加nameserver网速只有100Mbps协商速率问题ethtool eth0 | grep Speed检查网线质量强制千兆内核更新后网卡消失DKMS未重建模块dkms status安装新内核头文件dkms autoinstallUSB无线网卡不识别驱动未编译或VID/PID不匹配lsusb、dmesg确认驱动支持该VID/PID5.3 两个真实案例的完整排查过程案例一RTL8168网卡频繁断连一台Debian 11服务器板载RTL8168网卡每隔几小时断连一次dmesg里大量“r8169 0000:03:00.0 eth0: Link is Down”然后马上“Link is Up”。换了网线、交换机都没用。排查过程ethtool -i eth0显示驱动是r8169版本是内核自带的。下载Realtek官方r8168驱动按DKMS方式安装黑名单r8169重启后驱动变成r8168。观察一周断连问题消失。根本原因是r8169驱动对这批RTL8168芯片的电源管理处理有缺陷官方驱动修复了这个问题。案例二RTL8812BU USB无线网卡在Linux下不识别一个用户拿RTL8812BU USB网卡插到Ubuntu 22.04上lsusb能看到“Realtek 802.11ac NIC”但iwconfig没有无线接口。dmesg显示“rtw_8822bu: probe failed”。排查过程内核自带的rtw88驱动对RTL8812BU支持不完整需要安装第三方驱动。从GitHub找到对应的驱动源码编译安装后问题解决。关键点是确认VID/PID匹配——lsusb输出里的0bda:c812就是RTL8812BU的标识驱动源码的os_dep/linux/usb_intf.c里必须包含这个VID/PID对。6. 驱动安装的独家经验和避坑指南6.1 编译环境准备的那些坑编译Realtek驱动需要完整的编译工具链和内核头文件。我踩过的坑包括gcc版本不匹配某些老驱动包在新版gcc下编译报错需要加-Wno-error参数或者打补丁内核头文件缺失/lib/modules/$(uname -r)/build目录不存在编译直接失败DKMS版本过旧老版本DKMS不支持某些配置语法需要升级Secure Boot拦截启用了Secure Boot的系统会拒绝加载未签名的第三方模块需要在BIOS里关闭Secure Boot或者给模块签名提示编译之前先跑一遍sudo apt install build-essential linux-headers-$(uname -r) dkms把基础环境装齐能省掉一半的报错。6.2 驱动版本选择的经验法则Realtek官网的驱动版本很多不是越新越好。我的经验是板载RTL8168/8111系列选最新稳定版通常8.05x系列都没问题USB RTL8811CU/8812BU优先用GitHub上活跃维护的第三方驱动官方驱动更新太慢笔记本RTL8821CE/8852BE内核自带驱动如果能用就别折腾不能用再找对应驱动下载驱动时注意区分源码包和二进制包。Linux下必须用源码包Windows下才用exe安装包。有些第三方网站会把源码包和二进制包混在一起下载前看清楚文件扩展名。6.3 内核更新后的自动恢复策略如果你用DKMS管理驱动内核更新后DKMS会自动重建模块。但前提是DKMS服务正常运行、源码目录还在、新内核头文件已安装。我建议在服务器上配置一个简单的监控脚本每次重启后检查驱动状态#!/bin/bash DRIVER$(ethtool -i eth0 2/dev/null | grep driver | awk {print $2}) if [ $DRIVER ! r8168 ]; then echo 警告当前驱动为$DRIVER不是r8168 | mail -s 网卡驱动异常 adminexample.com fi这个脚本可以放到crontab里定时执行或者做成systemd服务在启动时运行。对于管理大量服务器的场景这种自动化检查能省很多事。6.4 关于Realtek音频驱动的题外话搜索热词里出现了不少Realtek音频相关的内容比如“realtek audio console”“realtek high definition audio没有输出设备”。虽然和网络驱动不是一回事但底层逻辑有相似之处都是Realtek的芯片都涉及驱动安装和系统识别。Windows下Realtek音频驱动装完没声音常见原因是驱动版本和Windows版本不匹配或者音频服务没有启动。可以尝试卸载设备管理器里的音频设备勾选“删除驱动程序软件”然后重新扫描硬件改动让系统重新安装驱动。如果还是不行去主板厂商官网下载对应型号的音频驱动而不是用Realtek通用驱动。Linux下Realtek音频通常由snd_hda_intel驱动处理aplay -l能列出音频设备。如果没有输出设备检查dmesg | grep snd看驱动加载情况有时候需要在/etc/modprobe.d/里加options参数指定模型。7. 不同系统下的驱动重装策略7.1 Windows系统下的Realtek网卡驱动Windows下重装Realtek网卡驱动相对简单但有几个细节要注意。首先设备管理器里右键网卡选择“卸载设备”时如果勾选了“删除此设备的驱动程序软件”重启后系统会尝试自动安装驱动。如果自动安装的版本有问题就需要手动指定驱动路径。Windows 10/11下Realtek PCIe GbE Family Controller的驱动安装推荐从主板厂商官网下载而不是Realtek官网的通用包。因为主板厂商会针对自家板型做适配兼容性更好。安装时如果提示“已安装更新的驱动”选择“让我从计算机上的可用驱动程序列表中选取”然后点“从磁盘安装”手动指向解压后的驱动目录。32位系统现在很少见了但如果有老机器跑32位Windows注意下载对应位数的驱动包。64位驱动装到32位系统上会直接报错。7.2 Linux系统下的DKMS管理流程Linux下我强烈建议用DKMS管理Realtek驱动。完整流程如下# 1. 安装依赖 sudo apt install dkms build-essential linux-headers-$(uname -r) # 2. 解压驱动到/usr/src sudo tar -xjf r8168-8.051.02.tar.bz2 -C /usr/src/ # 3. 注册到DKMS sudo dkms add -m r8168 -v 8.051.02 # 4. 编译 sudo dkms build -m r8168 -v 8.051.02 # 5. 安装 sudo dkms install -m r8168 -v 8.051.02 # 6. 黑名单旧驱动 echo blacklist r8169 | sudo tee /etc/modprobe.d/blacklist-r8169.conf # 7. 更新initramfs sudo update-initramfs -u # 8. 重启 sudo reboot重启后验证dkms status lsmod | grep r8168 ethtool -i eth0这套流程走下来驱动就由DKMS接管了后续内核更新会自动重建。7.3 USB无线网卡的驱动安装特殊性USB无线网卡如RTL8811CU、RTL8812BU的驱动安装和板载网卡有些不同。USB网卡的驱动通常是独立维护的不在内核主线里需要从GitHub等渠道获取。安装时要注意确认VID/PID匹配lsusb输出的ID要和驱动源码里定义的一致可能需要禁用内核自带的冲突驱动比如rtw88和rtl88x2bu可能冲突USB网卡的热插拔特性要求驱动支持动态加载卸载以RTL8812BU为例安装第三方驱动的流程git clone https://github.com/xxxx/rtl88x2bu.git cd rtl88x2bu make sudo make install sudo modprobe 88x2bu如果编译报错通常是内核版本太新驱动源码还没适配。可以尝试切换到旧版内核或者找更新的驱动分支。8. 驱动重装后的性能验证和长期维护8.1 怎么确认驱动真的在工作驱动装完网卡能上网不代表驱动就完美工作了。我通常会做几项性能验证第一检查协商速率ethtool eth0 | grep -E Speed|Duplex千兆网卡应该显示“Speed: 1000Mb/s, Duplex: Full”。如果显示100Mb/s说明协商有问题检查网线是否是超五类以上。第二测试实际吞吐量iperf3 -c 服务器IP -t 30在局域网内跑iperf3千兆网卡应该能跑到940Mbps左右。如果只有几百兆可能是驱动性能问题或者CPU瓶颈。第三检查错误计数ethtool -S eth0 | grep -i errorRX/TX errors和dropped计数应该接近零。如果持续增长说明驱动或硬件有问题。8.2 驱动更新的时机和策略Realtek驱动不需要频繁更新。我的策略是能用就不动出问题再更新。但以下几种情况需要考虑更新内核大版本升级后旧驱动编译失败发现网卡有稳定性问题官方发布了修复版本需要新功能支持比如Wake-on-LAN的改进更新驱动前先备份当前驱动和配置。可以用dkms status记录当前版本用ethtool -i eth0保存驱动信息。更新后如果出问题可以快速回滚。8.3 长期维护的自动化方案对于需要长期稳定运行的服务器我建议配置一套自动化维护方案用DKMS管理驱动确保内核更新后自动重建配置监控脚本定期检查驱动状态和网络连通性保留一份驱动源码和编译好的模块备份紧急情况下可以快速恢复记录每次驱动变更的版本、时间和原因方便回溯这套方案不复杂但能避免很多半夜被叫起来处理网络故障的情况。我在实际运维中就是靠这些看似简单的措施把网卡相关的故障率降到了很低。踩过几次坑之后我最大的体会是驱动这东西装的时候多花十分钟把原理搞清楚比出问题后花十个小时排查要划算得多。尤其是DKMS和auto_run.sh这两个东西理解了它们的工作机制大部分驱动问题都能自己解决。
返回列表