简介:rtl8812au-Linux网卡驱动是面向Linux用户与运维人员的无线网卡适配方案,用于解决Realtek RTL8812AU芯片在开源系统下驱动缺失、无法识别或性能受限的问题,支持802.11ac标准,可提升无线连接的速率与稳定性。资源包共320个文件,以219个h头文件与87个c源码文件为核心,另含makefile编译脚本、kconfig配置项、sh安装脚本及conf、runwpa等网络配置样例,整体约1.58MB,结构接近完整驱动源码仓库,便于按模块查阅与二次编译。目前已有2036人学习下载。通过该驱动,读者可获得内核模块的编译与加载思路、不同发行版下的依赖处理方式,以及无线网卡识别与调试的参考路径,适合具备一定Linux基础、需要为8812系列网卡补齐驱动支持的用户使用。
1. rtl8812au 在 Linux 上到底卡在哪:从「插上没反应」说起
很多人第一次把一块 RTL8812AU 芯片的 USB 无线网卡插进 Linux 机器,lsusb能看到设备,ip link里却什么都没有。这不是网卡坏了,而是内核主线里长期没有把这款芯片的驱动合进去。RTL8812AU 是 Realtek 的一颗双频 802.11ac 芯片,常见于各种 USB 外置网卡、部分工控机和嵌入式板卡上,厂商给的驱动是闭源或半开源的 out-of-tree 模块,需要自己编译。所以「rtl8812au-Linux 网卡驱动」这件事的本质,是在内核之外维护一个 DKMS 模块,让它跟着内核升级自动重建,而不是每次换内核就手动make一遍。
这篇文章面向三类人:手里有这块网卡、在 Debian/Ubuntu/Kali 上装不上驱动的;做嵌入式 Linux 项目、需要把这块网卡跑成 AP 或监听模式的;以及运维同学,遇到服务器加装 USB 无线网卡做备份链路,结果dmesg里一堆报错不知道怎么读的。我会把选型、编译、参数、排错、验证整条链路讲清楚,能照着复现,也能看到边界在哪。
2. 驱动从哪来:源码选型与内核头文件准备
2.1 为什么不用内核自带的 rtl8xxxu
主线内核里其实有一个rtl8xxxu模块,理论上覆盖部分 Realtek USB 芯片。但它的血泪经验是:对 RTL8812AU 的支持非常有限,尤其是 802.11ac 的 5GHz 高带宽、监听模式、AP 模式,基本跑不起来或者极不稳定。我一般会直接放弃它,改用社区维护的aircrack-ng/rtl8812au或morrownr/8812au-20210629这类分支。前者在 Kali 生态里用得最多,后者对较新内核的适配更积极。选哪个的判断标准很简单:看你的内核版本和仓库最近一次提交时间,越接近你当前内核的越省事。
判断当前内核和是否已加载冲突模块,先跑这几条:
uname -r # 确认内核版本,编译模块必须严格对应 lsusb | grep -i realtek # 确认设备被 USB 识别,记下 VID:PID lsmod | grep -E '8812|rtl8' # 看是否已有模块占用,避免冲突uname -r的输出要和后面apt install linux-headers-$(uname -r)完全一致,差一个小版本都会导致insmod时报invalid module format。lsusb里常见的 ID 是0bda:8812、0bda:881a,如果这里都看不到设备,那问题在 USB 供电或接口,不在驱动。
2.2 装内核头文件和编译工具链
编译 out-of-tree 模块,头文件是硬门槛。Debian/Ubuntu 系:
sudo apt update sudo apt install -y build-essential dkms git linux-headers-$(uname -r)build-essential提供 gcc/make,dkms是后面自动重建的关键,linux-headers-$(uname -r)必须和运行内核匹配。Kali 上如果提示找不到头文件,先sudo apt update再装linux-headers-$(uname -r),Kali 的源里通常有对应版本。嵌入式平台(比如 ARM 板子)没有现成头文件包,需要拿到厂商的 kernel source,用make modules_prepare生成,这一步最容易翻车,交叉编译工具链的版本要和内核编译时一致。
提示:如果你在虚拟机里做,USB 网卡要先在虚拟机设置里「连接到虚拟机」,否则宿主机抢占了设备,Linux 里
lsusb永远看不到。
3. 编译与安装:把模块跑起来的最小步骤
3.1 克隆源码并编译
以社区常见的 aircrack-ng 分支为例,流程是标准的:
git clone https://github.com/aircrack-ng/rtl8812au.git cd rtl8812au make # 编译,观察是否有 error sudo make install # 安装模块到 /lib/modules/$(uname -r)/ sudo modprobe 88XXau # 加载模块,注意模块名不是 rtl8812au编译阶段重点看两类输出:error是致命错误,通常是内核 API 变了(比如cfg80211接口签名改动);warning大多可以忽略,但涉及implicit declaration的要留意,可能是缺头文件。make install之后模块名通常是88XXau.ko,不是rtl8812au.ko,这是新手最容易懵的点——modprobe rtl8812au会直接报 module not found。
加载后立刻验证:
lsmod | grep 88XXau # 确认模块已加载 dmesg | tail -30 # 看驱动初始化日志 ip link # 应该出现一个新的 wlanX 接口dmesg里正常会看到usbcore: registered new interface driver rtl88XXau和rtl88XXau: ... firmware之类的行。如果出现firmware not found,说明固件没装,需要把源码目录里firmware/下的 bin 文件拷到/lib/firmware/。
3.2 用 DKMS 解决内核升级后失效
手动make install的模块,内核一升级就没了,这是最大的后悔药问题。正确做法是注册进 DKMS:
sudo cp -r /path/to/rtl8812au /usr/src/rtl8812au-5.6.4.2 sudo dkms add -m rtl8812au -v 5.6.4.2 sudo dkms build -m rtl8812au -v 5.6.4.2 sudo dkms install -m rtl8812au -v 5.6.4.2版本号5.6.4.2要和你源码里dkms.conf的PACKAGE_VERSION一致,否则dkms add会找不到。注册成功后,每次内核更新,DKMS 会自动为新内核重建模块,dkms status能看到installed状态。这一步做完,才算真正把「rtl8812au-Linux 网卡驱动」这件事做稳。
注意:DKMS 重建依赖新内核的头文件,如果系统自动升级内核但没装对应 headers,重建会失败,
dkms status会显示build失败。养成升级内核后顺手装 headers 的习惯。
4. 参数与模式:让网卡按你的场景工作
4.1 关键模块参数怎么调
驱动加载时可以带参数,常见的有rtw_monitor_mode、rtw_led_ctrl、rtw_country_code等。临时加载:
sudo modprobe -r 88XXau sudo modprobe 88XXau rtw_monitor_mode=1 rtw_country_code=CNrtw_monitor_mode=1让驱动默认支持监听模式,做无线抓包时省去iw切换的麻烦。rtw_country_code=CN影响可用信道和发射功率,设错会导致 5GHz 某些信道扫不到。要持久化,写进/etc/modprobe.d/8812au.conf:
options 88XXau rtw_monitor_mode=1 rtw_country_code=CN参数名在不同分支里可能不一样,比如有的分支用rtw_monitor_mode,有的用monitor_mode。改之前先modinfo 88XXau | grep parm看当前模块支持哪些参数,别照抄网上的配置,这是踩坑重灾区。
4.2 AP 模式与监听模式的落地
做 AP 用hostapd,配置文件里指定driver=nl80211、interface=wlan0、hw_mode=a、channel=36。启动前确认iw list里该接口支持 AP 模式:
iw list | grep -A 8 'Supported interface modes'如果输出里没有AP,说明当前驱动分支没编进 AP 支持,需要换分支或改Makefile里的CONFIG_AP=y重新编译。监听模式用airmon-ng start wlan0或iw dev wlan0 set monitor control,后者更干净。监听模式下抓包用tcpdump -i wlan0 -w cap.pcap,注意监听模式接口名可能变成wlan0mon,别抓错接口。
| 模式 | 关键配置 | 常见用途 |
|---|---|---|
| Station | 默认,wpa_supplicant | 普通上网 |
| AP | hostapd+CONFIG_AP=y | 热点、软路由 |
| Monitor | rtw_monitor_mode=1 | 抓包、审计 |
| Mesh | wpa_supplicantmesh 配置 | 多节点组网 |
5. 避坑与排查:dmesg 里那些看不懂的报错
5.1 编译报 implicit declaration of function
现象:make时大量implicit declaration of function 'xxx',最后链接失败。原因:内核版本比驱动源码新,某些内核 API 改了签名或删了函数。解决:换一个近期有提交的分支,或者手动打补丁。判断依据是报错函数名,去内核源码include/里搜,看新签名是什么,改驱动调用处。这是最耗时的坑,优先换分支而不是硬改。
5.2 模块加载报 invalid module format
现象:insmod: ERROR: could not insert module: Invalid module format。原因:模块编译时用的内核版本和当前运行内核不一致,或者编译器版本差异过大。解决:uname -r和modinfo 88XXau.ko | grep vermagic对比,两者必须一致。不一致就重新编译,确保linux-headers-$(uname -r)已装。
5.3 接口出现但扫不到任何 AP
现象:ip link有 wlan0,iw dev wlan0 scan却空。原因:多半是rfkill软阻塞,或者国家码限制。解决:rfkill list看是否Soft blocked: yes,是就rfkill unblock wifi。再看iw reg get,如果 regulatory domain 是00,设sudo iw reg set CN,并确认模块参数里的国家码一致。
5.4 高负载下断流、dmesg 刷 timeout
现象:大流量传输几分钟后掉线,dmesg刷rtl88XXau: timeout或urb status -71。原因:USB 供电不足或 2.4G/5G 干扰,也可能是驱动队列参数偏保守。解决:换带供电的 USB Hub 或直接插主板后置口;把网卡换到 5GHz 信道;在模块参数里调rtw_rx_agg相关聚合参数。硬件问题优先于软件调参。
5.5 DKMS 在内核升级后 build 失败
现象:dkms status显示build失败,新内核下网卡消失。原因:新内核 headers 没装,或驱动源码不兼容新内核。解决:先sudo apt install linux-headers-$(uname -r),再sudo dkms autoinstall。如果还是失败,看/var/lib/dkms/rtl8812au/*/build/make.log,按里面的 error 定位,通常是 API 变更,需要更新驱动源码。
6. 进阶:把驱动做成可复现的部署脚本与验证清单
做到这里,单机已经能跑。但如果你管着几十台机器,或者要在嵌入式项目里固化这套驱动,手动步骤就太脆了。我一般会写一个幂等脚本,把「装依赖 → 拉源码 → DKMS 注册 → 加载参数 → 验证」串起来,跑第二遍不会重复报错。核心逻辑是每步先判断状态再执行:
#!/usr/bin/env bash set -euo pipefail KVER=$(uname -r) DRV_VER="5.6.4.2" SRC_DIR="/usr/src/rtl8812au-${DRV_VER}" # 1. 依赖,已装则跳过 dpkg -l | grep -q build-essential || sudo apt install -y build-essential dkms git dpkg -l | grep -q "linux-headers-${KVER}" || sudo apt install -y "linux-headers-${KVER}" # 2. 源码,存在则更新 if [ -d "${SRC_DIR}/.git" ]; then git -C "${SRC_DIR}" pull else sudo git clone https://github.com/aircrack-ng/rtl8812au.git "${SRC_DIR}" fi # 3. DKMS 注册,已注册则重建 if dkms status | grep -q "rtl8812au/${DRV_VER}"; then sudo dkms build -m rtl8812au -v "${DRV_VER}" sudo dkms install -m rtl8812au -v "${DRV_VER}" --force else sudo dkms add -m rtl8812au -v "${DRV_VER}" sudo dkms build -m rtl8812au -v "${DRV_VER}" sudo dkms install -m rtl8812au -v "${DRV_VER}" fi # 4. 加载并验证 sudo modprobe 88XXau rtw_monitor_mode=1 rtw_country_code=CN || true lsmod | grep 88XXau && echo "driver loaded" ip link | grep -E 'wlan|wlx' && echo "interface up"脚本里set -euo pipefail保证任何一步失败就停,避免半成品状态。--force用于覆盖已存在的模块。验证部分不只看lsmod,还要看ip link是否真的出了接口,因为模块加载成功但固件缺失时,接口不会出现。
验证清单我固定跑这几条,缺一不可:
| 检查项 | 命令 | 期望结果 |
|---|---|---|
| 设备识别 | lsusb | grep 0bda | 出现 8812/881a |
| 模块加载 | lsmod | grep 88XXau | 有输出 |
| 接口存在 | ip link | grep wlan | 出现 wlanX |
| 固件正常 | dmesg | grep -i firmware | 无 not found |
| 扫描可用 | iw dev wlan0 scan | head | 有 SSID 列表 |
| 模式支持 | iw list | grep AP | 含 AP/Monitor |
最后说个我自己的习惯:每次内核升级后,先跑dkms status看一眼,再dmesg | grep 88XXau确认驱动重新加载了,别等网卡断了才发现。这套流程我在 Debian、Ubuntu、Kali 上都跑过,差异主要在头文件包名和源,逻辑是一样的。把 DKMS 和验证清单固化下来,比记住一堆命令有用得多。希望帮到你。
本文还有配套的精品资源,点击获取