☰
Ubuntu 22.04下RTL8852BE无线网卡驱动编译与故障排查指南
2026/10/5 6:32:31 网站建设 项目流程

在联想拯救者、华硕天选这类主流游戏本上装了 Ubuntu 22.04,结果发现系统压根找不到 Wi-Fi 信号,只有蓝牙孤零零地在设置里待着——这几乎是 Realtek RTL8852BE 这款 WIFI6 网卡在 Linux 下的标配遭遇。不是你这台机器有问题,而是这颗网卡在 Ubuntu 22.04 默认内核 5.15 里根本没有可用驱动,系统把它当成了 PCIe 设备,却没有任何固件或模块去响应它。这篇文章我会带你从硬件确认、源码准备、手动编译到模块加载完整走一遍,针对 Ubuntu 22.04 环境下的 RTL8852BE 驱动编译给出可直接照抄的步骤和避坑经验,同时也聊聊为什么这颗芯片在某些内核版本上能工作、在某些版本上却折腾到凌晨。

如果你手头的笔记本正好是 8852BE 网卡,或者你还在观望要不要为了这颗网卡退回到老版本系统,这篇文章适合先收藏。整个流程不依赖图形界面,全程终端操作,大概 15 到 20 分钟能搞定,比各种"换网卡"的终极大法成本低得多。

1. 先搞清楚网卡为什么没工作

1.1 RTL8852BE 是什么定位的网卡

RTL8852BE 是 Realtek 旗下一颗面向消费级笔记本的 Wi-Fi 6 无线网卡,支持 802.11ax 协议,2.4GHz 和 5GHz 双频段,2x2 MIMO,理论上的最大速率能跑到 2400Mbps 左右。它一般以 M.2 2230 或 1216 形态焊在主板上,常见于这两年出货的联想、华硕、微星、戴尔游戏本。

这类 Realtek 网卡在 Windows 下表现正常,装上消费版驱动就能用。但在 Linux 下,情况完全不同。Realtek 对 Linux 驱动的官方维护一直比较"挤牙膏",网卡发布初期经常几个月不放出可用的官方驱动源码,社区开发者只能逆向或者通过 Realtek 内部泄露的源码来适配。相比之下,Intel 的 AX210、AX200 网卡在新内核里直接开箱即用,这就是为什么不少 Linux 老玩家买笔记本时会刻意避开 Realtek 无线网卡。

1.2 为什么 Ubuntu 22.04 默认驱动不了它

Ubuntu 22.04 出厂默认内核是 5.15 LTS。这个版本的内核对 RTL8852BE 的支持非常有限——准确点说,是基本没有。虽然内核从 5.x 时代开始合并了不少 Realtek 无线芯片驱动,比如 rtw88 系列,但针对 8852BE 这种 5.9GHz 和 6GHz 频段规划、带 802.11ax 完整特性的芯片,rtw89 驱动真正进入内核主线是在后续版本。具体到 Ubuntu 22.04 这种固定内核版本的发行版,除非用户自己升级内核或者安装 HWE(Hardware Enablement)内核包,否则内核空间里根本没有对应驱动模块。

我在排查的时候还发现一个很容易误判的点:执行lspci | grep -i network时,系统明显列出了一个 Realtek 设备,于是很多人误以为"系统识别到了,只是没开 Wi-Fi"。实际上,lspci只是读取 PCIe 配置空间里的厂商 ID 和设备 ID,只要硬件插在总线上它就能列出来,跟有没有驱动完全是两回事。正确的判断方式是看lspci -k输出里 Kernel driver in use 字段有没有值,以及dmesg | grep -i rtw有没有相关日志。

1.3 要不要直接换内核,还是手动编译驱动

在这个问题上,我见过两类解法走向两个极端。

一类人直接装 Ubuntu 22.04.2 或更新版本,或者手动升级到 HWE 内核(比如 6.2、6.5),期望主线内核能直接支持。实测下来,较新的内核确实有可能自动加载 rtw89 驱动,但驱动质量不一定理想。主线内核里的 rtw89 驱动对 8852BE 的支持在部分版本上是"能连但细节残缺"的状态,比如 5GHz 频段扫描不到部分信道、省电模式导致掉线,这些问题在某些内核小版本中持续存在。

另一类人尝试安装 Realtek 官方发布的 Windows 驱动无果后,干脆换 Intel 网卡。这确实是一劳永逸的办法,但不少轻薄本和游戏本在 BIOS 层面做了硬件白名单,拆机换网卡既费事又有风险。

我的选择是手动编译社区维护的驱动模块,再挂到当前内核上。这样做的最大好处是不改变系统既有内核版本,不影响其他已装软件和驱动的兼容性,出问题还可以随时卸载模块、恢复原状。

2. 动手前的软硬件检查清单

2.1 确认网卡型号和硬件 ID

在开启终端动手之前,先花两分钟确认硬件情况。笔记本型号可能写的是"Wi-Fi 6 无线网卡",但实际使用的芯片版本可能有好几种。

lspci | grep -i network lspci -nn | grep -i network

正常输出会类似:

02:00.0 Network controller [0280]: Realtek Semiconductor Co., Ltd. RTL8852BE PCIe 802.11ax wireless adapter [10ec:b852]

重点看方括号里的[10ec:b852],10ec是 Realtek 厂商 ID,b852是设备 ID。如果输出是b852,说明确实是 8852BE。有些机器用的是 8852CE(b85c),虽然同属 rtw89 驱动族,但编译时的模块名和固件文件会不一样,后面操作要格外注意。

2.2 检查当前内核版本与头文件是否匹配

编译驱动模块需要内核头文件,而且头文件版本必须和当前运行的内核版本严格对应。这一步很容易踩坑。

uname -r # 例如输出 5.15.0-91-generic

锁定内核版本后,检查对应头文件是否已安装:

ls /usr/src/ | grep linux-headers

如果没有显示对应的linux-headers-5.15.0-91-generic目录,就用命令安装。注意 Ubuntu 的linux-headers-generic和linux-headers-$(uname -r)不是一回事,前者是个 meta 包,会跟随升级装最新内核的头文件,如果内核升级时机和你编译驱动的时机错开,就会编出一个和新内核不匹配的模块。最稳妥的做法是:

sudo apt update sudo apt install -y build-essential git dkms linux-headers-$(uname -r)

2.3 Secure Boot 状态确认

很多人编译好了驱动,modprobe时报错,回头来来回回编译了几轮,最后发现是 Secure Boot 在作妖。Ubuntu 默认在 UEFI 机器上启用 Secure Boot,内核只加载有合法签名的模块。第三方编译出来的模块没有签名,内核会拒绝加载。

检查方法:

mokutil --sb-state

如果输出SecureBoot enabled,后面就要么进 BIOS 关闭 Secure Boot,要么用 DKMS 配合签名工具生成 MOK 证书并导入。这里我建议直接关掉,对绝大多数个人 PC 来说,关闭 Secure Boot 影响很小。如果你特别介意安全性,也可以继续用 DKMS + 签名方案,流程在后面单独讲。

3. RTL8852BE 驱动源码获取与编译全过程

3.1 拉取社区维护的 rtw89 源码

当前在 Ubuntu 22.04 上编译 RTL8852BE 驱动,最常用的是社区维护的lwfinger/rtw89仓库。这个项目维护者长期跟进内核主线驱动,把 Realtek 未合入主线的改动整理成独立可编译的驱动源码,支持 8852AE、8852BE 等一批 Realtek 网卡。

在终端执行:

cd ~ git clone https://github.com/lwfinger/rtw89.git cd rtw89

仓库拉下来后不要着急编译,先看一下 README 和当前分支的状态。有些分支是针对新内核 API 调整的,不同分支的编译选项可能有差异。如果 README 里明确说make前需要切换分支,照做就是。多数情况下master分支可以直接用。

提示:如果从国内网络环境拉取 GitHub 仓库速度不理想,可以先git clone到本地再考虑后续操作,不要因此放弃。速度慢可以耐心等几分钟,码农日常。

3.2 编译前的选项选择与依赖确认

源码目录里通常有 Makefile,不同驱动版本的 Makefile 结构略有差异,但核心目标一致:生成一个.ko内核模块文件。

编译前确认几件事:

第一,确认源码里是否带固件文件。RTL8852BE 不像老式网卡那样把固件烧在硬件 Flash 里,它需要在驱动加载时从/lib/firmware/rtw89/目录读取固件。如果源码仓库里没有自带固件,编译好了驱动加载时也会明显报错,需要单独下载固件包。

第二,确认内核源码路径。编译模块时需要内核生成的头文件,通常 Ubuntu 会把它放在/usr/src/linux-headers-$(uname -r)。直接在当前内核上编译时,Makefile 会自动识别,不需要手动指定,但如果你自定义了内核或者升级过内核,需要检查一下/lib/modules/$(uname -r)/build这个软链接是否存在:

ls -l /lib/modules/$(uname -r)/build

如果提示软链接不存在,说明内核头文件没装全,重新执行sudo apt install linux-headers-$(uname -r)。

第三,如果需要 DKMS 方式安装,在 Makefile 里应该有dkms相关目标或者有单独的dkms.conf文件。DKMS 的好处是以后内核升级时,模块会被自动重新编译,不用手动手动折腾。我建议直接上 DKMS,省心。

3.3 编译、安装与模块加载

确认环境干净后,开始编译。在源码目录下执行:

make clean make

第一次编译通常会有大量编译输出,看到warning不要慌,只要不是error就说明还活着。编译完成后,目录下会生成rtw89_core.ko、rtw89_pci.ko、rtw89_8852be.ko这类文件。用ls *.ko确认一下。

安装到系统模块目录并加载:

sudo make install sudo depmod -a sudo modprobe rtw89_8852be

modprobe时如果没有任何输出,说明模块加载成功。看日志确认:

dmesg | tail -n 20

正常会看到类似rtw89_8852be 0000:02:00.0: Firmware version ...、rtw89_8852be 0000:02:00.0: WOW firmware loaded的内容。然后去桌面右上角点开网络设置,Wi-Fi 列表已经出来了。

如果modprobe报错Required key not available,说明 Secure Boot 拦截成功,进 BIOS 关掉后再来。

3.4 用 DKMS 做持久化安装

如果不希望每次内核升级后重新编译驱动,DKMS 是最佳方案。在编译好的源码目录里:

sudo dkms add .

如果源码目录里没有dkms.conf,自己去创建一个:

sudo tee /usr/src/rtw89-8852be/dkms.conf <<'EOF' PACKAGE_NAME="rtw89" PACKAGE_VERSION="8852be" BUILT_MODULE_NAME[0]="rtw89_core" BUILT_MODULE_NAME[1]="rtw89_pci" BUILT_MODULE_NAME[2]="rtw89_8852be" DEST_MODULE_LOCATION[0]="/kernel/drivers/net/wireless/realtek/rtw89" DEST_MODULE_LOCATION[1]="/kernel/drivers/net/wireless/realtek/rtw89" DEST_MODULE_LOCATION[2]="/kernel/drivers/net/wireless/realtek/rtw89" AUTOINSTALL="yes" REMAKE_INITRD="yes" EOF

注意BUILT_MODULE_NAME必须和Makefile里的模块输出名字一致。然后:

sudo dkms add /path/to/rtw89 sudo dkms build -m rtw89 -v 8852be sudo dkms install -m rtw89 -v 8852be

安装完以后,如果要加载模块,直接:

sudo modprobe rtw89_8852be

之后系统更新内核,DKMS 会自动编译当前模块到新内核里,省去很多重复劳动。

3.5 固件文件的放置细节

驱动模块加载后如果日志里出现Direct firmware load for rtw89/rtw8852b_fw.bin failed这类错误,说明固件缺失。Realtek 的无线芯片大多依赖外部固件,这个文件必须放到/lib/firmware/rtw89/下。如果源码仓库里自带firmware/rtw89/rtw8852b_fw.bin,直接复制过去:

sudo mkdir -p /lib/firmware/rtw89 sudo cp firmware/rtw89/*.bin /lib/firmware/rtw89/

如果源码仓库里没带,可以从内核固件仓库linux-firmware里找rtw8852b_fw.bin对应的版本。不同时期的固件对 8852BE 的稳定性和吞吐量影响相当明显,我遇到过用旧固件时连接速度只有 300Mbps,更新固件后跑满千兆的案例,所以固件文件不要随意凑合。

4. 编译与使用过程中的高频问题排查

4.1 Secure Boot 报错:Required key not available

这个错误在联想、戴尔、华硕的笔记本上尤其常见。modprobe时立刻报错:

modprobe: ERROR: could not insert 'rtw89_8852be': Required key not available

解掉的办法有两种。一是进 BIOS 关闭 Secure Boot,这是最快也最省事的路径。二是在保留 Secure Boot 的状态下对模块签名,流程是生成 MOK 密钥、用sign-file给.ko文件签名、再用mokutil导入,重启后按提示完成 MOK 注册。后者的步骤又多又繁琐,而且一旦内核头文件里的 sign-file 工具路径变化,签名就失败。我的建议是,个人桌面机直接关 Secure Boot,除非你明确知道自己为什么需要它。

4.2 内核升级后驱动失效

如果你没用 DKMS,而是直接make install,那么内核升级到新版本后,原来的模块目录/lib/modules/5.15.0-91-generic/updates/dkms/和/lib/modules/5.15.0-92-generic/updates/dkms/不是同一个目录,新内核根本找不到旧模块。于是 Wi-Fi 又在某次重启后消失了。

如果是直接make install装的,需要在重启后重新执行一遍编译安装;如果用了 DKMS,应该自动完成重编译。没自动完成时,手动执行sudo dkms autoinstall或者重新build && install。这类问题在刚接触 Linux 驱动编译时最容易让人崩溃,原因往往是混淆了"我给系统装了模块"和"我给这个内核装了模块"这两个概念。每次重启后发现 Wi-Fi 没了,先跑uname -r看内核是不是变了。

模块只能工作在它被编译时所对应的内核版本上,哪怕只是小版本号从 5.15.0-91 变成 5.15.0-92,二进制也无法通用。这就是为什么我一再建议用 DKMS,它就是在解决这件事。

4.3 编译时报错找不到 Makefile 或缺少头文件

常见报错:

make: *** /lib/modules/5.15.0-91-generic/build: No such file or directory. Stop.

原因非常直接,就是没装linux-headers-$(uname -r)。有些人装了linux-headers-generic,自以为装好了,其实它只装了个空的 meta 包,真正的头文件并不在。正确做法是:

sudo apt install --reinstall linux-headers-$(uname -r)

然后软链接自动生成。

4.4 连接 5GHz 频段困难或扫描不到部分路由器

RTL8852BE 在 Linux 下对 5GHz 频段的支持有一部分受限于固件与区域码设置。我遇到过一堆人反馈"能搜到别人家的 Wi-Fi 6,但搜不到自己家的路由器 5G",排查后发现是路由器信道设置在了 149-165 之间,而驱动或固件的区域配置导致部分信道不可见。

先在终端看网卡支持的信道:

iw phy phy0 channels

如果看到的是被限制掉的信道,就检查路由器端,把 5GHz 信道改成36或44这类低信道值。如果不想改路由器,也可以检查连接属性时手动添加隐藏 SSID 并指定频段:

sudo nmcli device wifi connect "你的SSID" band 5g

这个方法也适用于路由器隐藏了 SSID,或者网络扫描列表里没显示的情况。

4.5 Wi-Fi 出现间歇性断流

这是 RTL8852BE 在 Linux 下被吐槽最多的问题之一,症状是待机一段时间后 Wi-Fi 掉线,或者连接着 5GHz 却突然跳回 2.4GHz。根因多半是电源管理。无线网卡为了省电会频繁进入低功耗状态,结果驱动和固件在 wakeup 时的配合出了问题。

临时关闭方法:

sudo iw dev wlp2s0 set power_save off

网卡名字用iw dev查看,通常长这样:wlp2s0或者wlx...。想把设置固化,可以写一个 systemd 服务,也可以把命令放在 NetworkManager 的 dispatcher 脚本里。我用的 systemd service 写法放在下面,实测重启后稳定:

sudo tee /etc/systemd/system/wifi-power-save-off.service <<'EOF' [Unit] Description=Disable Wi-Fi power save After=multi-user.target [Service] Type=oneshot ExecStart=/usr/sbin/iw dev wlp2s0 set power_save off [Install] WantedBy=multi-user.target EOF sudo systemctl enable wifi-power-save-off.service sudo systemctl start wifi-power-save-off.service

换成你机器上的实际网卡接口名。

4.6 编译了多次,加载的还是旧模块

遇到的问题是"明明重新编译安装了,modprobe 后dmesg里的驱动版本还是旧的"。这种情况通常是模块加载顺序和路径问题。系统里可能同时存在多个位置的相同模块:

  • /lib/modules/5.15.0-91-generic/updates/dkms/rtw89_8852be.ko
  • /lib/modules/5.15.0-91-generic/kernel/drivers/net/wireless/realtek/rtw89/rtw89_8852be.ko
  • 当前目录下编译的新.ko

modprobe按照依赖模块搜索路径加载,如果旧模块被硬链接或者优先级更高,新的就起不来。不要手动去删内核自带目录的模块,优先检查 DKMS 安装目录里的版本,重新跑sudo dkms install覆盖一次。

也可以直接查看当前正在使用的模块路径:

lsmod | grep rtw89

输出里列出了模块名,然后看一下/sys/module/rtw89_8852be/version,如果不是源码对应的版本,再重新构建安装一次。

5. 编译完以后还能折腾点什么

5.1 确认连接速率跑在 802.11ax 上

驱动加载、连接 Wi-Fi 只是第一步。装好以后,花几分钟验证是不是真的在 802.11ax 模式下工作,而不是降级回 802.11ac。

iw dev wlp2s0 link

如果输出的tx bitrate是2402.0 MBit/s,说明已经跑在 Wi-Fi 6 的 2x2 速率上。如果只有866.7 MBit/s或1201.0 MBit/s,可能是连接到了不支持 802.11ax 的设备,或者路由器没有开启 80MHz 以上频宽。记得把路由器 Wi-Fi 6 模式和 160MHz 频宽都打开,网卡协商速率才会好看。

也可以确认扫到的网络是否支持 AX:

iw dev wlp2s0 scan | grep -E "SSID|RSN|WPA"

配合路由器型号基本就能判断。

5.2 调优 RTL8852BE 的连接稳定性与功耗

除了前面提到的关闭电源管理,还有一些参数可以调。

调整省电模式,除了直接关闭 power save,也可以用 NetworkManager 的配置。编辑/etc/NetworkManager/conf.d/wifi-powersave.conf:

[connection] wifi.powersave = 2

其中2表示禁用,3表示启用。保存后重启 NetworkManager。

如果 5GHz 还是不稳定,可以指定偏好频段。在 NetworkManager 连接配置里找到 Wi-Fi 连接的配置文件,手动编辑:

[802-11-wireless] band=bg

这会强制使用 2.4GHz,一般不至于断流,但吞吐量也会随之下降。我的经验是优先保持 5GHz,只是把 power save 关掉,绝大多数丢包问题都能解决。

5.3 卸载驱动,回归原状

万一不想用了,需要把一个直装驱动的系统恢复原样。先卸载模块:

sudo modprobe -r rtw89_8852be

然后找到模块文件删除,或者跑make uninstall。如果源码目录还在:

cd ~/rtw89 sudo make uninstall

DKMS 安装的版本单独用:

sudo dkms remove -m rtw89 -v 8852be --all

最后sudo depmod -a刷新依赖即可。这样处理完后,系统回到没有驱动时的状态,完全不留痕迹。

根据我自己的折腾经历,这类 Realtek 网卡驱动的编译过程,90% 的时间都花在环境问题和内核版本的磨合上,真正的源码编译本身反而不太会卡壳。装过一次之后,你基本能把 Linux 下"编译内核模块"这条链路练得滚瓜烂熟。以后换到别的无线网卡、换了别的发行版,只要思路一致——确认硬件 ID、准备内核头文件、找对源码、处理好 Secure Boot——都不用再求人。最后再提醒一句:如果你买笔记本的预算和型号选择上还有余地,优先选 Intel 无线网卡的机器能省掉这些麻烦;但手里的 8852BE 已经没法换的,按这篇步骤走一遍,Wi-Fi 确实能用,稳定度也过得去。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询