简介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/makedkms是后面自动重建的关键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的模块内核一升级就没了这是最大的后悔药问题。正确做法是注册进 DKMSsudo 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_mode1 rtw_country_codeCNrtw_monitor_mode1让驱动默认支持监听模式做无线抓包时省去iw切换的麻烦。rtw_country_codeCN影响可用信道和发射功率设错会导致 5GHz 某些信道扫不到。要持久化写进/etc/modprobe.d/8812au.confoptions 88XXau rtw_monitor_mode1 rtw_country_codeCN参数名在不同分支里可能不一样比如有的分支用rtw_monitor_mode有的用monitor_mode。改之前先modinfo 88XXau | grep parm看当前模块支持哪些参数别照抄网上的配置这是踩坑重灾区。4.2 AP 模式与监听模式的落地做 AP 用hostapd配置文件里指定drivernl80211、interfacewlan0、hw_modea、channel36。启动前确认iw list里该接口支持 AP 模式iw list | grep -A 8 Supported interface modes如果输出里没有AP说明当前驱动分支没编进 AP 支持需要换分支或改Makefile里的CONFIG_APy重新编译。监听模式用airmon-ng start wlan0或iw dev wlan0 set monitor control后者更干净。监听模式下抓包用tcpdump -i wlan0 -w cap.pcap注意监听模式接口名可能变成wlan0mon别抓错接口。模式关键配置常见用途Station默认wpa_supplicant普通上网APhostapdCONFIG_APy热点、软路由Monitorrtw_monitor_mode1抓包、审计Meshwpa_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有 wlan0iw 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_VER5.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_mode1 rtw_country_codeCN || 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 和验证清单固化下来比记住一堆命令有用得多。希望帮到你。本文还有配套的精品资源点击获取
