
1. 为什么RTL8812BU在Ubuntu上总是不省心手里有一块瑞昱RTL8812BU方案的USB无线网卡插上Ubuntu之后发现系统压根不认lsusb能看到设备但ip link里就是没有对应的无线接口——这个场景我遇到过太多次了。RTL8812BU是一颗双频AC 1200级别的USB 3.0无线芯片市面上大量USB网卡、天线延长底座、甚至一些迷你主机内置模块都在用它。性能不错价格便宜但Linux下的驱动支持一直是个老大难问题内核主线里没有它的原生驱动Ubuntu自带的rtl8xxxu只能勉强识别部分老型号对8812BU的支持非常有限经常出现能识别但连不上、或者连上后速率只有几十兆的情况。这篇文章要解决的问题很具体在Ubuntu系统下让RTL8812BU网卡正常工作并且把编译驱动过程中那些让人抓狂的坑一次性讲清楚。适合谁看手里有这类网卡、刚装完Ubuntu发现没WiFi、或者之前编译失败过想搞清楚原因的读者。我会从驱动方案选型开始一步步走到编译、加载、验证中间穿插大量实际踩坑经验保证你跟着做能跑通。先说一个基本判断RTL8812BU在Linux下的驱动目前最靠谱的方案是使用社区维护的rtl8812au驱动分支注意不是8812au原版而是专门适配8812BU的aircrack-ng维护版本或者morrownr维护的版本。为什么不用Ubuntu自带的因为自带驱动对8812BU的芯片ID覆盖不全而且缺少完整的802.11ac支持。自己编译虽然麻烦但可控性最强出了问题也能自己排查。2. 驱动方案选型与准备工作2.1 三种驱动来源的对比在动手之前先搞清楚你有哪些选择以及各自的优缺点。我整理了一个对比表方便你根据自己情况决定方案来源优点缺点适用场景内核自带rtl8xxxuUbuntu内核免安装插上就有对8812BU支持差速率低经常断流临时应急官方rtl8812au驱动Realtek官网功能完整老对新内核兼容差编译报错多不推荐社区维护rtl8812au分支GitHub morrownr/rtl8812au-20210820持续更新支持新内核8812BU适配好需要自己编译推荐我实测下来morrownr维护的那个分支是目前最省心的。它把8812BU、8811CU、8821CU等一堆RTL88xxBU系列芯片的ID都合并进去了而且针对5.x和6.x内核做了大量适配。另一个aircrack-ng版本也可以但那个更偏向渗透测试场景会打监控模式补丁日常使用反而可能引入不稳定因素。2.2 编译前必须确认的三件事很多人编译失败不是驱动本身的问题而是环境没准备好。动手之前先确认这三项第一确认你的内核版本。运行uname -r记下输出。比如6.5.0-35-generic。这个信息决定了你后面要不要额外打内核兼容补丁。5.15以上的内核DKMS方式基本都能自动处理但如果你用的是6.8以上的新内核有些老驱动分支会报implicit-function-declaration错误需要手动改代码。第二确认你已经装了编译工具链。最小依赖是build-essential、git、dkms以及当前内核对应的头文件linux-headers-$(uname -r)。缺头文件是最常见的失败原因报错通常是/lib/modules/xxx/build: No such file or directory。一条命令补齐sudo apt update sudo apt install -y build-essential git dkms linux-headers-$(uname -r)第三确认Secure Boot状态。如果你的主板开了Secure Boot编译出来的第三方内核模块默认会被拒绝加载modprobe会报Operation not permitted。要么进BIOS关掉Secure Boot要么给模块签名。我一般建议直接关掉省事。检查命令mokutil --sb-state输出SecureBoot disabled就没事如果是enabled要么关要么走签名流程。提示如果你是在虚拟机里操作USB网卡需要先通过虚拟机软件把设备直通给Ubuntu否则lsusb根本看不到。VMware在“虚拟机设置-USB控制器”里勾选对应设备VirtualBox在“设备-USB”里挂载。2.3 确认网卡芯片ID不是所有标着“AC1200”的网卡都是8812BU有些是8811CU或者8821CU。插上网卡运行lsusb | grep -i realtek你会看到类似ID 0bda:b812 Realtek Semiconductor Corp.的输出。b812就是8812BU的典型PID。常见的对应关系b812是8812BUc811是8811CUb82c是8821CU。记下你的ID后面验证驱动是否匹配时要用。3. 编译实操从克隆到加载的完整流程3.1 获取驱动源码我推荐用morrownr的仓库直接克隆cd /usr/src sudo git clone https://github.com/morrownr/rtl8812au-20210820.git为什么放在/usr/src因为DKMS默认会去这个目录找源码放这里后面注册DKMS最顺。克隆完成后进去看一眼目录结构确认有dkms-install.sh这个脚本有就说明是支持DKMS的版本。如果你网络环境拉GitHub慢也可以先在其他机器下载zip包再传过去解压到/usr/src下同样可以。3.2 用DKMS方式安装推荐DKMS的好处是内核升级后驱动会自动重新编译不用你每次手动折腾。这是我最推荐的方式。进入源码目录直接跑安装脚本cd /usr/src/rtl8812au-20210820 sudo ./dkms-install.sh这个脚本背后做的事把源码注册到DKMS、编译、安装模块、加载。整个过程大概一到两分钟。如果一切顺利你会看到Module installed successfully之类的提示。但现实往往没那么顺。下面是我遇到过的几个典型报错和解决办法。3.3 编译报错排查三个高频坑坑一error: implicit declaration of function cfg80211_...这个错误通常出现在内核6.5以上。原因是新内核改了cfg80211子系统的函数签名老驱动没跟上。解决办法是打补丁。morrownr的仓库其实已经处理了大部分但如果你用的是更老的fork就需要手动改。具体做法是找到报错的文件和行号对照新内核的头文件改参数。比如cfg80211_roamed在新内核里参数变了需要把调用处改成新签名。坑二error: ‘struct timer_list’ has no member named ‘data’内核5.15之后timer_list结构体去掉了data成员改用from_timer宏。这个错误在8812au驱动里很常见。修改方法把原来的timer.data相关代码替换成from_timer方式。具体代码改动比较细建议直接换用已经适配好的分支比如morrownr的20210820版本就已经修好了。坑三modprobe: ERROR: could not insert 88XXau: Required key not available这就是Secure Boot在作祟。两个选择关Secure Boot或者签名。签名流程稍微麻烦需要生成密钥、导入MOK、签名模块这里不展开。最直接的办法是重启进BIOS关掉Secure Boot。注意如果你之前用apt装过rtl8812au-dkms这个包先卸载掉否则会和手动编译的版本冲突。命令sudo apt remove rtl8812au-dkms。3.4 手动编译方式DKMS失败时的备选如果DKMS脚本跑不通可以手动编译。流程是cd /usr/src/rtl8812au-20210820 sudo make clean sudo make sudo make install sudo modprobe 88XXaumake这一步如果报错仔细看错误信息基本都是内核兼容问题。手动编译的好处是错误信息更直接方便定位。缺点是内核升级后要重新来一遍。3.5 验证驱动是否加载成功加载之后用这几条命令验证lsmod | grep 88XXau ip link show iw devlsmod能看到88XXau说明模块加载了。ip link里应该多出一个wlanX接口。iw dev能看到接口的详细信息包括支持的频段和模式。如果ip link里没有新接口但lsmod有模块那可能是芯片ID没匹配上需要检查驱动的ID表里有没有你的PID。我遇到过一种情况模块加载了但接口名是wlan0却显示DOWN状态。这时候运行sudo ip link set wlan0 up如果报Operation not permitted多半是rfkill软阻塞用rfkill list查看rfkill unblock wifi解锁。4. 常见问题与排查技巧实录4.1 网卡识别了但搜不到WiFi这是最典型的问题。iw dev能看到接口但nmcli dev wifi list空空如也。原因通常有三个一是驱动虽然加载了但固件没加载成功二是信道被管制域限制三是接口被rfkill阻塞。排查顺序先dmesg | grep -i 88XXau看内核日志有没有firmware相关的报错。8812BU需要rtl8812bu_fw.bin这个固件文件通常在/lib/firmware/rtlwifi/下。如果没有从驱动源码的firmware目录复制过去。然后检查rfkill list确认没有软阻塞。最后看管制域iw reg get如果显示country 00说明没设置用sudo iw reg set CN设置一下。4.2 连接后速率只有几十兆8812BU是AC1200理论速率867Mbps5G频段。如果你连上后iw dev wlan0 link显示速率只有54Mbps或者更低大概率是连到了2.4G频段或者驱动协商有问题。先确认连的是5G AP然后检查iw dev wlan0 link里的bitrate字段。如果5G下还是低速率可能是驱动版本太老换最新分支重新编译。另一个隐藏原因是USB接口速率。8812BU需要USB 3.0才能跑满如果你插在USB 2.0口上上限就是480Mbps实际吞吐也就200Mbps左右。检查方法lsusb -t看设备挂在哪个总线上5000M才是USB 3.0。4.3 内核升级后驱动失效这是DKMS方式也会遇到的问题新内核的头文件还没装DKMS自动编译失败。解决办法很简单升级内核后先装头文件sudo apt install linux-headers-$(uname -r) sudo dkms autoinstalldkms autoinstall会重新编译所有注册过的模块。如果还是失败dkms status看具体哪个模块报错进源码目录手动make一次看详细错误。4.4 常见问题速查表现象可能原因解决命令/操作lsusb有设备但无wlan接口驱动未加载或ID不匹配检查lsmod确认驱动ID表含你的PID模块加载报Required key not availableSecure Boot开启关闭Secure Boot或签名模块接口存在但搜不到WiFi固件缺失或rfkill阻塞复制固件rfkill unblock wifi速率低USB 2.0或连了2.4G换USB 3.0口确认5G连接内核升级后失效头文件未装装headers后dkms autoinstall编译报timer_list错误内核5.15不兼容换用已适配分支4.5 几个我踩过的坑第一个坑不要同时装多个版本的8812au驱动。我有一次先apt装了rtl8812au-dkms又手动编译了一个结果两个模块抢设备时好时坏。后来全部卸载只留一个手动编译的才稳定。第二个坑make install之后忘了depmod。有些老教程只写make install但没写depmod -a导致模块依赖关系没更新modprobe找不到模块。加上sudo depmod -a再modprobe就好了。第三个坑虚拟机里USB直通后如果虚拟机重启USB设备可能没自动挂载回去需要重新在虚拟机设置里勾选。这个不是驱动问题但很容易误判。5. 长期维护与自动化建议5.1 用DKMS实现内核升级自动重编前面已经用了DKMS这里再强调一下它的价值。DKMS会在/var/lib/dkms/下维护模块状态每次内核更新dkms autoinstall会自动触发重编。你唯一要保证的是新内核的头文件已经安装。可以写一个简单的apt钩子让内核升级时自动装头文件但更简单的做法是养成习惯每次apt upgrade看到内核更新手动跑一次sudo apt install linux-headers-$(uname -r) sudo dkms autoinstall。5.2 备份可用驱动版本社区驱动更新频繁有时候新版本反而引入回归。我的做法是当前稳定可用的版本把整个源码目录打包备份一份。命令sudo tar czf rtl8812au-stable.tar.gz /usr/src/rtl8812au-20210820下次如果更新后出问题解压回去重新dkms-install.sh就能回滚。这个习惯帮我省过好几次重装系统的时间。5.3 监控驱动状态的小脚本我写了一个简单的检查脚本放在~/check_wifi.sh每次觉得网络不对劲就跑一下#!/bin/bash echo USB设备 lsusb | grep -i realtek echo 模块状态 lsmod | grep 88XXau echo 接口状态 ip link show | grep wlan echo 连接信息 iw dev 2/dev/null | grep -E Interface|ssid|channel echo rfkill rfkill list这个脚本能快速定位问题出在哪一层是USB没识别、模块没加载、还是接口没起来。比一条条敲命令快得多。5.4 关于替代方案的思考如果你实在不想折腾编译还有一个选择换一块内核原生支持的网卡。比如基于MT7921或者AX210的网卡Linux内核直接支持插上就能用。但如果你手头已经有8812BU或者需要它的特定功能比如外置天线、监控模式那编译驱动还是值得的。我自己的主力机上就是8812BU编译一次之后用DKMS维护一年多没出过问题。最后分享一个判断驱动是否真正稳定的方法连续跑iperf3打流半小时同时ping网关看延迟抖动。如果速率稳定、延迟没有周期性尖峰说明驱动和固件配合良好。如果每隔几秒就卡一下多半是电源管理在捣乱可以在/etc/modprobe.d/下加一个配置文件禁用USB自动挂起echo options 88XXau rtw_power_mgnt0 rtw_enusbss0 | sudo tee /etc/modprobe.d/88XXau.conf然后重新加载模块。这个参数关掉了驱动的省电模式对稳定性提升很明显代价是待机功耗略高台式机无所谓笔记本自己权衡。