ARTICLE DETAIL

资讯详情

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

Ubuntu下Realtek 8812BU无线网卡驱动安装与排障完整指南

Ubuntu下Realtek 8812BU无线网卡驱动安装与排障完整指南 不少人刚装上 Ubuntu或者重装完系统满心欢喜插上USB无线网卡准备联网结果右上角的网络图标转了半天愣是找不到无线网络。打开终端敲一句iwconfig列表里除了一个lo和可能有线的eth0什么都没有。这时候看一眼网卡芯片型号Realtek 8812BU Wireless LAN 802.11ac USB NIC心里基本就有数了——这是 Realtek USB 网卡在 Linux 下的老剧本了。这个芯片虽然是很常见的双频 AC1200 USB 网卡方案但 Linux 内核自带的驱动对它支持非常糟糕甚至可以说基本是残废状态导致系统根本无法识别或者识别了也用不了。我最早碰这块芯片是给一台老台式机配无线网卡系统装好了网卡插上去毫无反应折腾了好几个晚上才理清头绪。这篇就完完整整把解决过程、背后的原理、还有我踩过的坑都写出来给一样被 8812BU 折磨的朋友一条顺路。1. 问题定位先别急着编译驱动搞清楚到底“识别不了”是哪种情况很多人一上来就去找驱动源码开始编译结果越搞越乱。其实在动手之前先花几分钟确认问题出在哪个环节能让后面的操作精准很多。1.1 区分“USB 都没枚举成功”和“内核驱动没加载”先把网卡插上然后终端执行lsusb。这一条命令能直接看到USB设备有没有被系统识别到。如果输出里能看到类似下面这一行Bus 001 Device 003: ID 0b05:17d2 Realtek Semiconductor Corp. 802.11ac WLAN Adapter那就说明 USB 层面已经正常工作设备被系统枚举出来了问题纯粹是内核没有合适的驱动来接管它。如果lsusb里什么都看不到或者出现的是ID 2001:3318这种带 D-Link 等厂商 ID 的未知设备那问题又分两种一种是 USB 口供电不稳、接触不良这种硬件问题另一种是设备处于一种“默认存储设备”模式Realtek 部分网卡插上去会先识别为一个光驱或虚拟光盘里面装着 Windows 驱动需要切换 USB 模式才能变成网卡形态。用lsusb看到ID 0b05:17d2这种格式时厂商 ID 和产品 ID 分别是 4 位十六进制数。比如 0b05 是华硕的厂商 ID17d2 是具体产品 ID这个组合直接决定了走哪套驱动方案。1.2 确认内核态状态dmesg 才是真正有用的信息源lsusb能看到设备后再用dmesg | tail -n 30或者dmesg | grep -i realtek看看内核日志。如果日志里出现rtl8812au: unknown parameter disable_wps ignored rtl8812au: driver unloaded或者干脆任何关于 rtl 的关键词都没有那基本可以断定内核没有对应的驱动模块去绑定这个设备。8821cu、8812bu、8814au 这些 Realtek 芯片在内核里的支持情况各有不同有的在 4.x 内核里被某个驱动顺带支持了有的完全没人管。8812BU 属于典型的需要自己编译第三方驱动的型号。内核自带的rtl8812au驱动以及cfg80211无线框架对这块芯片的识别不稳定部分内核版本甚至直接把它的 device ID 从驱动支持列表里删掉了所以出现“设备在但无线网络出不来”的现象。dmesg里能看到设备与驱动的绑定过程这一步的信息比任何网上教程都直接。1.3 系统版本与内核版本确认不同 Ubuntu 版本对应的内核版本不同直接影响编译驱动的环境。建议执行lsb_release -a uname -r这步的主要目的是确认是 22.04 还是 24.04以及内核是不是某个大版本的小版本。很多第三方驱动在较老的内核上编译很正常但换到 6.x 内核后因为内核 API 变化编译直接报错。我一开始在 22.04内核 5.15上很顺利后来在一台 24.04内核 6.8的机器上就遇到了编译失败需要切换到更新的驱动分支才解决。2. 驱动方案选型为什么社区的 rtl8812au 驱动比 Realtek 官方方案更靠谱确定问题出在内核驱动后接下来就是选型。这一步非常关键因为 Realtek 官方提供的 Linux 驱动代码陈旧、接口老化在新内核上编译经常出错而社区维护的驱动在持续跟进。2.1 社区驱动的主要分支目前 GitHub 上针对 8812BU 芯片比较活跃、维护时间长、用的人多的主要是这两个仓库aircrack-ng/rtl8812au因为要做无线渗透测试这个仓库对注入模式的支持很看重维护频率非常高支持的芯片包括 8812AU、8812BU、8811AU、8821AU。驱动版本更新得快跟新内核兼容性也最好。我常用这个来编译 8812BU 的驱动。morrownr/8812au-20210820这个其实是基于 Realtek 官方 2021 年发布的代码做了大量修复的仓库对 8812BU 有专门的支持还提供 DKMS 集成安装体验比较友好。如果你不想折腾只是要一个稳定能用的网卡驱动这个仓库的错误提示更少一些。单纯从“能不能让网卡跑起来”这个角度看两个都行。但如果你后续有抓包、注入这类需求aircrack-ng 的版本会省事不少。2.2 为什么不用 Ubuntu 自带的 rtl8812au-dkms 包也有朋友说“系统源里不是有rtl8812au-dkms吗直接apt install rtl8812au-dkms装完重启不就行了”理论上是这样方向也没错——DKMS 机制能让驱动模块在每次内核升级后自动重建避免内核一变驱动就失效。但 Ubuntu 软件源里这个包的代码版本非常旧很多年前就停止同步上游了。在我的实测里装完这个包后 8812BU 依然无法稳定连接 5GHz 频段甚至 2.4GHz 也频繁掉线。这个包其实更偏向 8812AU 芯片8812BU 用起来边角料感很强。更核心的原因是8812BU 这种芯片的工作模式依赖驱动里的rtw_usb_read_port和rtw_usb_write_port这对关键函数它们在较旧的内核与较旧的驱动组合下会出现 usb 传输调度问题表现就是网速异常和掉包。新驱动对这部分逻辑做了大量重构所以碰上 8812BU 我更建议直接用 GitHub 上还在维护的版本。2.3 另一条路ndiswrapper 早已不推荐很久以前有办法是用 ndiswrapper 加载 Windows 下的 .inf/.sys 驱动来驱动网卡。Win 驱动封装层这种方式在 XP 时代还算能用但在现代内核上容易导致内核模块加载失败、系统不稳定而且新内核已经基本不兼容 ndiswrapper 的机制。现在完全不需要考虑老老实实编译原生 Linux 驱动才是正道。3. 实操步骤从源码编译到 DKMS 管理一次配好重启不失效选定了 aircrack-ng 的rtl8812au仓库后剩下的就是按部就班地编译、安装。这里我会把每一步都写清楚包含为什么这么做的解释。3.1 准备编译环境在开始编译之前必须确保系统里有编译工具和内核头文件。执行sudo apt update sudo apt install -y build-essential git dkms linux-headers-$(uname -r)这步里的build-essential提供了 gcc、make 等基础编译工具。linux-headers-$(uname -r)是当前内核的头文件编译内核模块必须要有它否则会提示找不到lib/modules/xxx/build目录。dkms则是实现“内核升级后自动重编驱动模块”的关键组件属于强烈推荐的安装项省去以后每次内核升级后重新编译驱动的麻烦。有朋友可能在 Ubuntu Server 上操作没有安装图形环境那么还需要确保已经安装了bc这个工具因为驱动源码里的构建脚本会用到它。保险起见可以顺手装上sudo apt install -y bc如果不装的话编译时可能直接报错/bin/sh: 1: bc: not found scripts/Makefile.build: ...这个报错不仔细看很容易被忽略加上bc后问题立刻消失。3.2 克隆驱动源码与分支选择接着克隆仓库git clone https://github.com/aircrack-ng/rtl8812au.git cd rtl8812au这个仓库默认分支一般是v5.6.4.2等版本代号。如果你不需要非常新的内核支持直接用默认分支没问题。但对于 Ubuntu 24.04 的高版本内核克隆下来后如果编译报错可以尝试切换到特殊分支git branch -a git checkout v5.6.4.2如果看到其他更高版本的 tag比如v5.13.6优先切到那个版本。这里的分支策略就是内核版本越新越要用新版本驱动分支否则会遇到接口不兼容的编译错误。3.3 编译与安装驱动模块进入目录后执行make clean make -j$(nproc)-j$(nproc)是让 make 并行编译核心多的话能明显加快速度。如果系统 CPU 核心数较少直接make就行。编译完成后先别急着直接make install。为了后续能用 DKMS 统一管理先手动安装一次模块然后配置 DKMS。sudo make install这会完成两件事把rtl8812au.ko模块文件复制到/lib/modules/$(uname -r)/kernel/drivers/net/wireless/下然后运行 depmod 生成模块依赖信息。现在可以先手动加载试试sudo modprobe rtl8812au如果没有报错再执行iwconfig正常情况下应该能看到wlx...或者wlan0这样的无线网卡接口了。这时再去看网络管理器里的 Wi-Fi 列表应该就能扫到附近的无线网络。3.4 用 DKMS 固化安装省掉内核升级后的重编译直接make install的问题在于一旦系统内核升级原来编译好的模块文件就跟新内核不匹配了网卡驱动会再次失效。为了避免以后每次升级内核都要重新编译一遍把驱动注册给 DKMS 管理是正解。这个注册过程有个顺序讲究我用下面的命令sudo dkms remove rtl8812au/$(cat dkms.conf | grep PACKAGE_VERSION | cut -d -f2 | tr -d | tr -d ) 2/dev/null; sudo dkms add . sudo dkms build -m rtl8812au -v 版本号 sudo dkms install -m rtl8812au -v 版本号dkms add .会把当前目录下的驱动源码注册进 DKMS 系统读取的配置文件是dkms.conf。dkms build是让 DKMS 重新编译模块dkms install是安装模块到当前内核。版本号可以直接通过dkms status查看或者从dkms.conf里读取。为了简单也可以这样sudo dkms add . sudo dkms install -m rtl8812au -v $(dkms status | grep rtl8812au | head -n1 | awk -F[/,] {print $2})这一串命令有点长但意思很直接添加源码、安装到 DKMS。如果过程顺利dkms status会显示类似rtl8812au/5.6.4.2, 6.8.0-45-generic, x86_64: installed看到installed就表示驱动已经正式被 DKMS 接管了。以后内核升级后DKMS 会自动为新内核重新编译并安装这个驱动模块不用再手动操心。3.5 配置 Secure Boot 自动签名Ubuntu 较新版本默认开启 Secure Boot而未被签名的第三方内核模块默认是不允许加载的。很多时候编译安装都成功但重启后网卡又消失原因就是 Secure Boot 拦住了模块加载。可以先看下 Secure Boot 是否开启mokutil --sb-state如果输出SecureBoot enabled那就需要给模块签名或者手动注册 MOKMachine Owner Key。我能提供的比较简单的方式是在 BIOS 里临时关闭 Secure Boot这个方法最直接但如果不想关闭也可以用dkms配合mokutil来导入签名密钥。具体流程是先生成一个签名密钥对然后用 DKMS 调用它对新编译的模块签名。这个步骤在 Ubuntu 官方文档里有比较详细的说明。我还是偏向建议直接在 BIOS 里关掉 Secure Boot因为对于个人桌面的 Ubuntu 环境关闭 Secure Boot 基本不影响日常使用和系统安全。提示如果你的电脑是双系统关闭 Secure Boot 可能会影响 Windows 11 的启动因为它默认要求 Secure Boot 开启。这种情况建议用 MOK 方式给驱动签名而不是直接关闭。4. 驱动加载与使用验证从“能识别”到“稳定连接”的检查流程驱动模块装好只是第一步。要让网卡真正稳定工作还需要做几项验证和配置。很多人装完驱动扫描能看到网络了但一连接就掉线或者速度极低这基本都是驱动参数或者功率管理策略的问题。4.1 开机自动加载驱动的正确姿势modprobe rtl8812au手动加载成功之后可以执行echo rtl8812au | sudo tee /etc/modules-load.d/rtl8812au.conf把这个模块写进开机自动加载列表。虽然现代 Ubuntu 大多通过硬件 ID 匹配自动加载模块但 Realtek 的 USB 网卡因为识别时序问题偶尔会出现 USB 设备枚举完了驱动却没加载的情况。我碰到过一次重启后无线网卡时好时坏后来排查发现就是驱动模块没在开机阶段及时加载。做了上面这步后问题消失。4.2 检查无线网卡接口与连接质量加载后先用nmcli device status或者ip a确认无线接口是否在线。我一般用nmcli radio wifi on nmcli dev wifi list如果能看到周围的无线网络 SSID则说明驱动已经正常工作。如果列表是空的但dmesg没有报错那就要检查是不是网络管理器的“无线被禁用”开关没打开或者笔记本电脑存在飞行模式硬件开关。在 Ubuntu 桌面上右上角网络菜单里也可以把 Wi-Fi 开关拉一下确认不是软件层面的禁用。4.3 连接稳定性与吞吐量测试驱动正常加载后不要只满足于能连上路由器。因为 Realtek USB 网卡在 Linux 下的一个典型问题是省电模式导致的高延迟、频繁断流。我建议连接后ping一下网关和外部地址观察延迟是否平稳ping -c 20 192.168.1.1 ping -c 20 223.5.5.5如果 ping 延迟偶尔突然飙到几百毫秒甚至丢包那八成是网卡的电源管理策略太激进。这时可以关掉 8812BU 的省电模式。驱动通常暴露了相关参数可以通过sudo modprobe -r rtl8812au sudo modprobe rtl8812au rtw_power_mgnt0rtw_power_mgnt0表示关闭节能管理能在一定程度上减少延迟。如果验证这个方法有效再把这行参数固化到配置文件中echo options rtl8812au rtw_power_mgnt0 | sudo tee /etc/modprobe.d/rtl8812au.conf这样每次加载模块会自动带上这个参数。同样rtw_drv_log_level、rtw_led_ctrl这些参数每个版本的支持程度不同不是所有版本都支持全部调优参数需要按实际情况调整。4.4 手动创建热点或使用 NetworkManager 管理如果这张网卡是为了给台式机提供无线能力大多用 NetworkManager 管理就行了。但也有场景是需要用这张 USB 网卡开 AP 给其他设备用——8812BU 本身硬件支持 AP 模式。如果想要开热点用nmcli dev wifi hotspot或create_ap工具都行但前提是驱动编译时启用了 AP 模式支持。aircrack-ng 的驱动默认是支持 AP 模式的如果是自己编译的驱动可能需要在Makefile里检查CONFIG_AP_MODE是否设置为y。有一个小坑是当你用 NetworkManager 的“使用热点”功能时系统通常默认用现有的无线网卡开 AP如果有多个无线网卡它会自动选一个。建议先用nmcli dev status看清楚设备名称再用nmcli dev wifi hotspot ifname wlan0 ssid MyHotspot password password指定接口。5. 常见问题与排查技巧实录这一节整理我实际测试中遇到的高频问题按概率从高到低排列。如果你照着上面的步骤操作完依然不正常优先对照这里找原因。5.1 编译时报错Makefile: ... CONFIG_PLATFORM_I386_PC相关这个多数是源码自带的 Makefile 默认目标平台不是当前系统或者缺少必要的头文件。解决方法是在源码目录执行make archx86_64或者编辑 Makefile把CONFIG_PLATFORM_I386_PC n改成CONFIG_PLATFORM_I386_PC y再编译一次。这个选项的作用是告诉驱动源码当前编译目标平台是标准的 x86 PC而不是嵌入式 ARM 平台。如果是在 ARM 设备比如树莓派上编译则要反过来设置 ARM 架构选项。5.2 编译时报错undefined reference to ...或某个内核符号找不到这通常发生在比较高版本的内核下因为驱动源码里的某些函数调用已经在内核中被移除了。比如ERROR: modpost: rtw_usb_read_port [drivers/net/wireless/realtek/rtl8812au/rtl8812au.ko] undefined!遇到这种问题立刻检查当前内核版本并切换到支持该内核的驱动分支或仓库。我通常在aircrack-ng/rtl8812au仓库的 issues 里搜索内核版本号一般都能找到对应解决方案。如果该仓库支持不到位可以切换到morrownr/8812au-20210820仓库试试两个仓库对 8812BU 的支持都在持续更新。5.3 驱动已安装但lsusb能看到设备、无线接口出不来这种问题多半是驱动模块没正确绑定设备 ID。可以先手动检查设备 ID 是否在驱动支持列表内modinfo rtl8812au | grep alias如果 device ID 不在支持列表里可以手动给模块传递参数来强制绑定也可以在os_dep/linux/usb_intf.c中检查设备表看看有没有你的 USB ID。如果确实缺少需要在源码里添加对应的USB_DEVICE条目然后重新编译安装。这个操作比较侵入性只在不得已时使用。5.4 能扫描到 Wi-Fi 但连不上或者频繁掉线这类问题优先确认是 2.4GHz 还是 5GHz 频段。我遇到过一次5GHz 频段完全无法连接2.4GHz 正常检查发现是路由器的频宽设置是 80MHz而驱动对这个宽频模式支持不佳。把路由器的 5GHz 频宽改成 40MHz 后连接恢复正常。另外把无线网卡的加密方式从 WPA3 改成 WPA2/WPA3 混合模式也能减少部分兼容问题。如果连接后频繁掉线先按前面说的关闭电源管理还不行就看看是不是 USB 接口供电不足。USB 3.0 口的输出电流比 USB 2.0 高一些8812BU 在双频同时开启时功耗不低把网卡从 USB 2.0 口换到 USB 3.0 口蓝色接口或者带独立供电的 USB HUB问题往往能直接解决。5.5 Secure Boot 开启导致驱动加载失败这个在前面 3.5 节有详细说明补充一个判断方法如果驱动编译安装顺利、modprobe也能执行但重启后网卡消失同时执行dmesg | grep -i secure或dmesg | grep -i lock能看到模块被拒绝的标记那基本就是 Secure Boot 的锅。注意mokutil --sb-state显示的SecureBoot enabled状态只是表示固件层面的安全启动开启。即使模块没有被签名有时也能加载进去因为有些发行版内核开启了 lockdown 模式但不是强制的。但 Ubuntu 默认的 lockdown 机制会让第三方模块加载失败。5.6 通过 dkms status 检查驱动状态任何时候不确定驱动模块状态都可以用dkms status正常输出rtl8812au/5.6.4.2, 6.8.0-45-generic, x86_64: installed如果显示的是built或根本没有显示就没有真正安装成功。如果dkms status里的内核版本跟uname -r不一致说明内核已经升级过了需要重新sudo dkms autoinstall或者sudo dkms install对应模块。6. 驱动参数调优与日常使用心得驱动装好、网络能跑大部分人这一步就觉得功德圆满了。但如果你的使用场景是长时间大流量传输、在线视频、或者游戏那么优化一下驱动参数和系统配置体验提升还是很明显的。6.1 调整驱动参数减少延迟和丢包前面提到过rtw_power_mgnt0实际上参数不止这一个。在rtl8812au驱动里常见的调优参数还有rtw_switch_usb_mode控制 USB 模式切换某些 USB 网卡在 Windows 下会切换成 CDC 模式Linux 下需要驱动主动切换一般保持默认即可。rtw_drv_log_level日志级别默认可能输出很多调试信息调高数值越小级别越高能减少系统日志刷屏。例如sudo modprobe rtl8812au rtw_drv_log_level1可减少日志输出。rtw_led_ctrl控制 LED 指示灯行为0 表示关闭1 表示开启。工作指示灯对排障还是有帮助的建议保留默认。如果通过modprobe参数验证有效的组合记得写进/etc/modprobe.d/rtl8812au.confoptions rtl8812au rtw_power_mgnt0 rtw_drv_log_level1这样一来每次加载模块都会自动使用这些参数。6.2 与 NetworkManager 的配合避免设备名混乱系统里同时有有线网卡和 USB 无线网卡时网络接口名有时会变成wlx9c2912d4c9ad这种长名字这是 systemd 的命名规则自动根据 MAC 地址生成的。虽然不影响使用但看到这种名字确实不直观。如果需要固定命名可以自己在/etc/systemd/network/里写一个小配置或者通过/etc/udev/rules.d/创建规则把特定 MAC 地址的设备名改成一个好记的名字。我一般在/etc/systemd/network/10-wifi.link里写[Match] MACAddress9c:29:12:d4:c9:ad [Link] Namewlan0然后执行sudo systemctl restart systemd-udevd重启网络服务后网卡名就固定成wlan0了。这样后面写网络管理脚本、防火墙规则都会省心很多。6.3 多网卡共存时的注意事项如果你机器上既有板载 Intel 无线网卡又插了 8812BU USB 网卡那么两个网卡可能会争抢 NetworkManager 的管理。我建议把不常用的那个网卡在 NetworkManager 里设成“忽略”或“不使用”避免系统频繁在两个无线网卡之间切换导致连接不稳。操作是用nmcli device set 设备名 managed no或者直接在 GUI 里对相应连接进行设置。7. 终极备选Realtek 官方源码编译时的问题与应对尽管我很推荐直接用社区驱动但有时候某些场景下比如特殊的 8812BU 硬件版本社区驱动反而匹配不上这时候可以考虑回到 Realtek 官方的最新驱动源码。官方驱动在 Realtek 官网提供下载但下载解压后编译时会遇到两个高频问题源码根目录的Makefile里CONFIG_USB_HCI和CONFIG_PCI_HCI必须根据实际网卡类型设置。8812BU 是 USB 网卡需要确保CONFIG_USB_HCI y CONFIG_PCI_HCI n官方代码对内核版本的兼容性比较差编译时需要把Makefile里的CONFIG_PLATFORM_I386_PC改成y有时候还要修改源码中的include/autoconf.h来适配内核 API。说实话官方驱动源码维护力度很一般社区驱动反而更像是“官方驱动”。所以这条路我一般排到最后一个只在其他方案都尝试过之后才考虑。8. 关于 802.11ac 实际速率和网卡性能的期望管理把网卡驱动跑起来后还有一个经常被误解的地方8812BU 标称支持 802.11ac 和最高 867Mbps 的链路速率但在 Linux 下实际吞吐能到多少不光是驱动决定的跟路由器、信道环境、天线、USB 接口都有很大关系。我在自己环境里实测8812BU 在 5GHz、80MHz 频宽、距离路由器两三米的场景下连接速率显示 867Mbps但实际 iperf3 吞吐一般在 300~500Mbps 之间这已经是很不错的表现。如果贴着 USB 2.0 口用理论瓶颈就直接卡在 480Mbps实测连 200Mbps 都难上。如果你的宽带已经跑到千兆想通过这张 USB 网卡跑满速度多半会失望。USB 端口的瓶颈就摆在那里让它稳定跑 500Mbps 以下的应用场景就好。如果真的需要更高速率PCIe 无线网卡是更合适的选择。驱动装好后建议做一次长时间持续传输测试比如从 NAS 拉一个几 GB 的文件观察速度和连接稳定性。我做过的验证是连续传输约 20GB 数据2.4GHz 和 5GHz 都稳定没有出现掉线或速率骤降这才算真正可以日常使用了。我还习惯在测试完成后把驱动相关的关键命令和配置备份到一个备忘文档里特别是当前内核版本、驱动版本、编译参数、/etc/modprobe.d/下的配置文件内容。这样以后系统重装、内核升级出了问题照着文档十分钟就能恢复环境重新撞一遍问题完全没有必要。8812BU 这块芯片在 Ubuntu 下的驱动问题由来已久但整体解决方案比较固定只要按“确认硬件识别情况 → 选对驱动仓库 → 正确编译DKMS 管理 → 验证连接与调优”的顺序走下来基本都能把网卡稳定跑起来。如果你在编译或者连接阶段卡住了重点检查内核头文件版本、Secure Boot 状态和 USB 口供电这三处大多数问题都出在这几个环节上。
返回列表