折腾Ubuntu 20.04系统的人,最怕看到的就是这种画面:无线网卡插上去,灯也亮了,但右上角WiFi图标死活不动,设置里翻遍也找不到“无线”两个字。腾达U6就是这么一块让人血压升高的USB网卡,Windows下插上就能用,到了Ubuntu 20.04下面却得自己花时间搞定RTL8192FU芯片的驱动问题。这篇文章把我实测走过的完整过程写出来,包括最开始的设备识别判断、驱动源码选择、编译安装、模块加载和常见报错排查,给拿着同款网卡的朋友一条能直接走通的路。
适合看这篇内容的朋友有两类:一类是刚在台式机上装好Ubuntu,手边只有USB无线网卡可用,但系统完全不识别;另一类是已经尝试过各种教程、自己编译过驱动但一直报错,正在四处找原因。不管你是哪种情况,跟着下面的操作走一遍,大概率能解决。
1. 问题诊断:为什么腾达U6在Ubuntu 20.04下不被识别
1.1 RTL8192FU芯片的尴尬地位
腾达U6这块网卡用的芯片是Realtek RTL8192FU,双频600M的USB无线方案,在Windows下驱动做得比较成熟,插上就能自动装好。但到了Linux生态里,RTL8192FU属于典型的“后妈养”型号。
Linux内核里确实带了一个Realtek USB无线网卡驱动叫rtl8xxxu,它涵盖了8188系列和8192系列的很多芯片,但问题是这个驱动的维护风格比较保守,对RTL8192FU的支持非常有限。实测下来,如果你靠内核自带的rtl8xxxu驱动去识别腾达U6,通常会遇到两种结果:要么lsusb里能看到设备,但系统不创建无线网卡接口;要么无线接口能出现,但连接WiFi之后频繁掉线,速度也根本跑不满。
我一开始的想法是装网卡厂商官方提供的Linux驱动,但查了一圈发现Realtek官方的驱动包基本停留在2.6.x和3.x内核时代,要在5.4、5.8、5.15这些内核上编译,报错报得你怀疑人生。所以到最后,真正可靠的路只有一条:找社区维护的第三方驱动源码,手动编译安装。
1.2 动手前先做设备识别和环境检查
在开始安装驱动之前,有几个环节一定不能跳过,它们能帮你确认问题到底出在哪里,避免后面白折腾几个小时。
第一步,把网卡插到USB口上,然后在终端里执行:
lsusb正常的输出里会有一行类似这样的内容:
Bus 001 Device 003: ID 0bda:f179 Realtek Semiconductor Corp. RTL8192FU连USB ID是0bda:f179都出来了,那就说明USB层面已经识别到了这块网卡,问题出在驱动层面,也就是系统没有加载合适的驱动模块来处理这个设备。
第二步,执行dmesg看内核日志里有没有关于这个USB设备的记录:
dmesg | tail -50如果你看到类似“rtl8xxxu: Unknown device”或者“cfg80211: failed to load firmware”的日志,那基本可以断定是内核自带的rtl8xxxu驱动抢占了设备,但处理流程走到一半就失败了。
第三步,确认内核版本和已安装的编译工具。Ubuntu 20.04随着更新补丁不同,内核版本可能停留在5.4、5.8或者5.15,这些版本在编译第三方驱动时都面临不同的兼容性问题。先执行:
uname -r gcc --version然后安装编译所需的一整套工具。这一步我建议直接把以下命令完整跑一遍,缺什么装什么:
sudo apt update sudo apt upgrade -y sudo apt install -y git build-essential dkms linux-headers-$(uname -r) bc这里有个细节你必须注意:linux-headers-$(uname -r)这个包必须和当前运行的kernel版本完全一致。如果你升级过内核但一直没重启,执行uname -r看到的还是一个老版本号,那安装的headers会和实际运行的内核不匹配,后面编译驱动时一定报错。所以最稳妥的做法是装完所有更新后先重启一次,再继续接下来的操作。
另外,在编译过程中是需要联网下载依赖包的。如果当前主机没有有线网络,你可以先用手机USB共享网络顶一阵,或者找一根网线临时插上,别等到编译到一半才发现连apt源都访问不了,那就尴尬了。
2. 选择驱动源码与编译前的关键准备
2.1 驱动源码的选择逻辑
当你决定不用官方Realtek驱动,转而找社区维护版本时,你会在GitHub上看到大量项目。我实测下来最省心的是morrownr维护的rtl8188fu驱动仓库。这个项目虽然名字里写的是8188fu,但它的设备支持列表里明确包含了RTL8192FU,腾达U6插上去之后能被正常识别和驱动。
我当时选择这个仓库有两个原因:
第一,作者把驱动编译过程中常见的坑基本都填平了,比如对Linux 5.10以后内核的兼容补丁、部分芯片固件加载路径修正等,省去自己手动改源码的麻烦。
第二,仓库的README写得很详细,明确标注了支持的芯片型号列表、安装方式和卸载方式,出现问题时几乎都能找到对应的说明。
克隆源码的命令如下:
git clone https://github.com/morrownr/rtl8188fu.git cd rtl8188fu在编译之前,先确认一下这个驱动是否支持你的芯片,可以执行:
grep -i "8192" Makefile | head -20如果输出里能看到RTL8192FU相关的ID,那就放心继续编译。有的版本需要在Makefile里手动加入设备的USB ID,但我测试的这个仓库已经内置了,不需要额外操作。
顺带提醒一下,不要看到“8188fu”这个名字就以为它只支持8188系列。这类驱动的命名通常是按照作者手头测试芯片来定的,实际上源码里定义了不止一个USB ID。
2.2 小心Makefile里的平台配置
第三方驱动在编译前,Makefile里有一些参数值得看一眼。尤其是CONFIG_PLATFORM_I386_PC这个选项,在大多数x86_64平台的Ubuntu系统里默认是y,这是正确的,不需要改。
但如果你是ARM平台的设备,比如树莓派4B装了Ubuntu 20.04,那就必须把CONFIG_PLATFORM_I386_PC改为n,同时把对应的ARM平台选项改为y。很多人在树莓派上编译失败,就是因为忘了改这一段。
另外,驱动源码的Makefile中一般还会有一个变量叫KSRC,它指向内核源码或内核头文件的路径。如果你的系统已经正确安装了linux-headers-$(uname -r),这个路径通常会自动匹配,不用手动改。但如果编译报错提示找不到内核源码,你需要手动指定一下:
make KSRC=/usr/src/linux-headers-$(uname -r)还有一个小细节:编译驱动之前,尽量确认下当前用户对/lib/modules/$(uname -r)/build目录有读权限。有些系统在最小安装时没有创建软链接,导致编译时找不到内核头文件。检查命令:
ls -la /lib/modules/$(uname -r)/build如果显示符号链接是断的,就执行下面的命令重新生成:
sudo ln -s /usr/src/linux-headers-$(uname -r) /lib/modules/$(uname -r)/build这个不起眼的步骤能帮你省掉后面一大串“No rule to make target”的报错。
3. 驱动编译、安装、加载全过程实操
3.1 编译安装驱动的完整命令
进入源码目录后,直接执行编译安装。这一步我遇到过两种流派的做法,一种是用make install,一种是用dkms管理。两种各有优劣,建议都试一下,但推荐优先考虑DKMS。
先看最简单的直接编译安装:
cd ~/rtl8188fu make clean make sudo make install如果make过程没有报错,最后一行输出会提示你模块已经安装到/lib/modules/$(uname -r)/kernel/drivers/net/wireless/下,并自动执行了depmod。
但我不建议把路径走绝,因为直接make install之后,如果下次内核升级,新内核的/lib/modules目录下不会有这个模块,网卡又会被打回原形。用DKMS可以解决这个问题,它会在每次内核更新后自动重建第三方模块。具体命令:
cd ~/rtl8188fu sudo dkms add . sudo dkms build rtl8188fu/1.0 sudo dkms install rtl8188fu/1.0注意rtl8188fu/1.0中的1.0这个版本号要以源码目录下dkms.conf文件里写的PACKAGE_VERSION为准。有的仓库版本号是v5.8.4,有的就是1.0,你可以在克隆下来的目录里先执行cat dkms.conf看一下,然后把命令里的版本号替换成对应的值。
安装完成后,用modprobe加载模块:
sudo modprobe 8188fu如果没有任何输出,说明加载成功。马上执行ip a或者iwconfig看一下有没有出现新的无线接口:
ip a | grep wl iwconfig正常的话你会看到类似wlan0或者wlx...开头的无线接口。我实操时这块网卡接口名直接显示为wlan0,没有出现wlx那种随机名称,算是比较幸运的。
再验证一下内核日志,确认驱动确实加载了:
dmesg | grep 8188fu如果看到rtl8188fu: loading firmware或者cfg80211: Wireless Register之类的日志,说明驱动状态正常,设备已经进入可用状态。
3.2 别忘了一件事:屏蔽内核自带的rtl8xxxu驱动
这一步非常关键。即使你已经安装并加载了第三方驱动,内核自带的rtl8xxxu驱动仍然可能会在下次开机时抢先注册USB设备,导致你的无线网卡再次失效。所以在做好一切之后,必须把它屏蔽掉。
在/etc/modprobe.d/下新建一个配置文件,写入黑名单:
sudo bash -c 'echo "blacklist rtl8xxxu" > /etc/modprobe.d/blacklist-rtl8xxxu.conf'之后更新initramfs,让黑名单配置在内核启动阶段就生效:
sudo update-initramfs -u然后重启:
sudo reboot重启之后再次执行lsmod | grep 8188fu,看到模块被自动加载,同时ip a能看到无线接口,那这次驱动安装就算真正结束了。
3.3 接入WiFi的两种常用方式
有了无线接口之后,连接WiFi反而不难。最直观的方式是用系统自带的NetworkManager图形界面,点击右上角WiFi图标选择对应网络即可。
如果你习惯用命令行,或者你的Ubuntu是最小化安装没有图形界面,那就用nmcli:
nmcli radio wifi on nmcli dev wifi list nmcli dev wifi connect "你的WiFi名称" password "你的密码"第三句执行完,内核日志里会立刻看到连接认证的过程。如果连接成功,ip a里无线接口会拿到一个动态IP地址。
如果你经历了驱动加载、接口出现、但WiFi列表一直刷不出来的过程,可以检查一下无线区域设置。有些国家/地区的频率限制会导致2.4GHz或5GHz频段无法完整扫描,先手动设置区域代码:
sudo iw reg set CN或者把区域写进配置文件,永久生效:
sudo bash -c 'echo "options cfg80211 ieee80211_regdom=CN" > /etc/modprobe.d/cfg80211.conf' sudo update-initramfs -u4. 常见问题排查与避坑实录
4.1 编译阶段报错的几种典型情况
我在整个过程中遇到过好几次编译失败,其中最常见的就是提示缺少内核头文件。报错内容里能看到类似/lib/modules/5.15.0-xxx-generic/build: No such file or directory的信息。这种问题的原因很简单:只装了内核本体,没装对应的linux-headers包。解决办法就是开头说的那条命令:
sudo apt install -y linux-headers-$(uname -r)第二个常见问题是gcc版本和内核编译用的gcc版本不一致。Ubuntu 20.04默认的gcc版本可能和某些内核版本编译时用的gcc不是同一代,导致模块加载时报错invalid module format。如果你用的是HWE内核,可以安装``gcc-9`并调整默认版本:
sudo apt install -y gcc-9 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90第三个坑:克隆源码后第一件事建议先跑make clean。有些仓库代码里会残留上一次编译的中间文件,如果你之前尝试过别的驱动或别人拷给你过目录,直接make会莫名其妙地报一堆奇奇怪怪的宏定义错误。make clean之后再编译,通常就顺利了。
还有一个比较冷门但确实存在的坑:如果你的主板开启了UEFI Secure Boot,Linux内核默认拒绝加载没有签名的第三方内核模块,表现就是modprobe执行时报错Operation not permitted或者required key not available。解决方式有两个,最省事的是进BIOS把Secure Boot关掉,其次是用mokutil导入模块签名。对于绝大多数个人桌面用户,直接关闭Secure Boot是最快速的做法。
4.2 模块加载成功但无线接口不出现
装完驱动,modprobe 8188fu也不报错,但ip a里就是没有无线接口,这种情况也遇到过几次。排查思路按顺序走:
第一,确认设备有没有被其他驱动占用。执行:
lsmod | grep rtl如果看到rtl8xxxu模块还在列表里,说明黑名单没生效,先执行sudo modprobe -r rtl8xxxu手动卸载,再重新加载8188fu。
第二,确认固件文件是否存在。RTL8192FU芯片需要对应的固件文件,通常位于/lib/firmware/rtlwifi/目录下。如果你的系统中缺少rtl8192fu相关的.bin文件,驱动即使加载了也无法让射频正常工作。执行:
ls /lib/firmware/rtlwifi/ | grep -i 8192正常的输出里应该能看到rtl8192fu.bin或类似文件。如果没有,从Realtek的开源固件仓库下载对应文件,放到/lib/firmware/rtlwifi/下,然后sudo update-initramfs -u。
第三,确认USB接口供电是否正常。这个听起来荒唐,但USB无线网卡插在机箱前面的USB口时,有时候会因为供电不足导致驱动加载后无法完成射频初始化。把网卡换到主板背部的USB接口上,尤其是USB 3.0蓝色接口,很多“玄学问题”会直接消失。
4.3 能连上WiFi但频繁掉线
这是另一个高频问题。驱动工作了,网卡也能连上路由器,但使用过程中每隔几分钟就掉线一次,或者上传下载速度极不稳定。
出现这个问题,我第一个想到的就是电源管理。USB无线网卡的电源管理在Linux下默认策略有时过于激进,为了省电会把无线模块置于休眠状态,结果就是在正常使用中频繁断连。关闭电源管理的方式:
iwconfig wlan0 power off把这个操作固化到开机自启中,可以在/etc/rc.local或者用 systemd 服务执行。如果是NetworkManager管理的网络,还可以把配置文件里的wifi.powersave设为2来禁用省电模式:
sudo nmcli connection modify "你的WiFi名称" wifi.powersave 2如果掉线只发生在5GHz频段,大概率是信道或路由器兼容性问题。我实测腾达U6在5GHz下的稳定性不如2.4GHz,尤其是路由器开启了DFS信道或160MHz频宽时,会出现周期性扫描后失联的情况。你可以到路由器后台把5GHz频宽改成80MHz,或者固定到36、40这种常用信道,能明显降低掉线概率。
4.4 连接成功但网速跑不起来
驱动正常加载、WiFi也连接成功,但网速始终停留在几十Mbps水平,这时候要先确认连接速率是不是被限制住了。用iwconfig wlan0查看速率信息,如果显示Bit Rate=72.2 Mb/s这类低速值,说明网卡可能工作在2.4GHz频段的20MHz频宽下,而且只有1根天线在收发。
腾达U6支持双频,如果路由器在5GHz频段可用,优先连接5GHz网络。5GHz下的理论连接速率能达到300Mbps以上,实际测速跑到150Mbps到200Mbps都是正常的。另外检查一下路由器是否开启了WMM模式,有些路由器关掉WMM后USB网卡会一直以基础速率通信,开启WMM后速率会恢复正常。
如果以上配置都正确,仍然感觉速度上不去,那还得检查和附近USB 3.0设备之间有没有干扰。RTL8192FU这类芯片的USB无线网卡对周边电磁环境比较敏感,把它插在和蓝牙、移动硬盘相邻的USB口上,偶尔会出现干扰导致吞吐量骤降。把它换到单独的USB口,或者加一根USB延长线让它远离天线周围的金属机箱,往往会有明显改善。
个人体会与最后提醒
折腾这一圈,我最想强调的是:Ubuntu 20.04下装RTL8192FU芯片的驱动,本质上就三步——屏蔽内核自带的rtl8xxxu、编译安装第三方驱动、配置好无线网络。每一个步骤出问题,都是因为前提条件没满足,比如内核头文件版本不匹配、Secure Boot签名验证未通过、固件文件缺失等。
安装完成后,我建议你把dkms status的输出记下来,等哪天Ubuntu提示内核升级时,升级完跑一下dkms status看模块是否自动重建。如果没有自动重建,重新执行sudo dkms install rtl8188fu/1.0即可。这个小操作能帮你避免下次重启后无线网卡又“消失”的尴尬。
另外,这套驱动源码不只是针对腾达U6,对采用RTL8188FU、RTL8188FTV、RTL8192FU芯片的其他USB无线网卡同样适用。如果你手上还有树莓派或者其他ARM开发板,也可以按这篇文章的思路,改一下Makefile里的平台配置后继续用。国产USB网卡在Linux下的生态确实不够好,但社区力量已经把很多坑填平了。希望这篇记录能让你少走两小时弯路。