如果你和我一样,在拯救者 R7000P 上装了 Ubuntu 20.04,开完机习惯性点一下右上角的网络菜单,结果 Wi-Fi 那一栏只剩一句冷冰冰的“未找到 Wi-Fi 适配器”,那八成就是被这块板载的 Realtek RTL8852AE 无线网卡给卡住了。这颗芯片属于 Wi-Fi 6 方案,硬件本身没毛病,但 Ubuntu 20.04 默认内核是 5.4,里面根本没有 8852AE 的驱动,系统自然连网卡都认不出来。
这篇文章既是驱动安装教程,也是一次完整的排查记录。我会从确认硬件型号开始,讲清楚为什么 20.04 认不出这张网卡、需要准备哪些环境,再把编译安装驱动的完整过程一步步拆开说。文章里涉及的操作,基本也适用于幻 16、MateBook GT 14 这类同样搭载 RTL8852AE 或 RTL8852BE 芯片的机器。如果你刚把 Ubuntu 20.04 装上却发现没有 Wi-Fi,照着做基本都能把网络救回来。
1. 先弄清“未找到 Wi-Fi 适配器”到底是怎么回事
很多人的第一反应是去设置里找“启用 Wi-Fi”开关,但折腾半天会发现根本没有这个选项。这不是系统坏了,也不是网卡松了,纯粹是驱动层面压根没有对应模块。
1.1 确认网卡芯片型号
在动手之前,先确认机器里到底是什么网卡,别看到“未找到 Wi-Fi 适配器”就直接照着网上的教程乱敲命令。打开终端,执行:
lspci -nnk | grep -i network正常情况下会看到类似下面的输出:
09:00.0 Network controller [0280]: Realtek Semiconductor Co., Ltd. Device [10ec:8852]方括号里的10ec:8852就是 Realtek 的厂商 ID 和设备 ID,说明这块网卡确实是 RTL8852AE。如果你看到的是10ec:8852后面的子型号不同,比如8852BE,方案也类似,后面提到的驱动源码大部分情况下同样通用。也有人会看到 Intel 的 AX211 之类,那种情况就不是本文要解决的问题了,Intel 网卡一般直接走iwlwifi驱动,路径完全两码事。
1.2 为什么 Ubuntu 20.04 里没有驱动
这个问题说白了就是版本太老。RT L8852AE 是瑞昱前几年主推的 Wi-Fi 6 网卡芯片,而 Ubuntu 20.04 发布于 2020 年,默认内核 5.4,那会儿 Linux 内核里连 rtw88 驱动都还没完全成熟,更何况后来才出现的 rtw89 驱动。
Linux 内核从 5.15 才开始尝试引入 rtw89 驱动,但早期版本对 8852AE 的支持相当粗糙,很多功能不完整,驱动固件也经常缺。直到 6.x 内核,这块网卡才算在原生层面有了可用的驱动。所以如果你死守着 20.04 自带的 5.4 内核不升级,那无论怎么折腾都救不回来,因为系统里压根没有对应的模块可以加载。
另外还有一个常见误区:有人以为安装一个“网卡驱动包”就能解决,比如网上传的某个.deb文件或者某个解压包。但 RTL8852AE 的驱动并不在 apt 软件源里,也不像闭源显卡驱动那样有官方一键安装包。Realtek 官方放出来的代码通常是一坨古老的 tarball,编译起来非常痛苦,而且很多是针对特定内核版本写的,直接 make 大概率报一堆错。实际可用的方案基本集中在 GitHub 上社区维护的几个仓库,后面会专门讲。
1.3 为什么网上教程各不相同
搜索“rtl8852ae 驱动”时,你会看到各种各样的方案:有人让改内核启动参数,有人让装一个叫rtw89的 DKMS 包,有人让直接上 6.x 主线内核。这些方法并不矛盾,只是适用条件不同。
博主们的机器型号、内核版本、Ubuntu 小版本都不一样,所以给出的命令有些差异也很正常。你在实操的时候,最关键的变量有两个:当前内核版本是多少,Secure Boot 有没有关闭。这两点决定了你该走哪条路、容易踩哪个坑。后面我会分别说,尽量让你少走弯路。
2. 动手前的准备:内核升级、编译链以及 Secure Boot
准备工作做得好,后面编译和加载模块就是一马平川。很多人一上来直接 clone 代码就 make,结果报错一大堆,然后开始怀疑人生。其实大部分编译失败都出在环境不对,而不是代码有问题。
2.1 先把内核升到 5.15 HWE 版本
Ubuntu 20.04 有 HWE(Hardware Enablement)机制,中文叫“硬件支持栈”,专门为后续硬件适配提供更新内核。安装 HWE 内核包可以让你在 20.04 系统里用上 5.15 内核,这个版本已经有 rtw89 驱动的早期代码,而且 8852AE 的基础框架存在,对后面编译社区驱动非常有利。
在终端执行:
sudo apt update sudo apt install linux-generic-hwe-20.04安装完成后重启,再看内核版本:
uname -r看到类似5.15.0-xx-generic的输出,说明 HWE 内核已经生效。如果输出还是 5.4 开头的版本,大概率是 grub 启动项问题或者 HWE 包没装完整,可以先执行sudo apt dist-upgrade再重启一次。
注意,这一步不是可选项。如果你坚持留在 5.4 内核上,后面编译驱动时会发现代码里的很多内核 API 根本不存在,就算强行 patch 也补不齐,完全没有意义。
2.2 安装编译需要的依赖包
编译内核模块需要内核头文件、GCC 编译器和相关工具,缺一不可。很多人只装了build-essential,结果编译到一半才发现找不到内核构建目录,只能跑回来补装。
一次性把依赖装齐:
sudo apt install -y git dkms build-essential libelf-dev linux-headers-$(uname -r)其中linux-headers-$(uname -r)是当前内核对应的头文件包。执行完可以用ls /lib/modules/$(uname -r)/build确认构建目录存在。如果输出目录列表而不是 No such file or directory,说明头文件已经就位。
这里要特别提醒一句:如果你升级了 HWE 内核,启动后千万不要继续用旧内核编译模块。编译出来的 .ko 文件必须和当前正在运行的内核版本严格匹配,否则modprobe直接报invalid module format。
2.3 处理 Secure Boot 和模块签名问题
Ubuntu 20.04 在 UEFI 模式下默认开启 Secure Boot。Secure Boot 只允许加载经过签名验证的内核模块,而社区开源驱动没有微软签发的证书,所以即使模块编译成功,系统也会拒绝加载。
先确认自己是否开启了 Secure Boot:
mokutil --sb-state如果输出SecureBoot enabled,那下面两步安装流程里,即使 DKMS 编译成功,重启后网卡依然不会出现。最省事的做法是进 BIOS 关掉它。
拯救者 R7000P 开机时按 F2 进入 BIOS,路径一般是 Security → Secure Boot → 改为 Disabled,然后保存退出。如果有朋友担心安全风险,也可以走 MOK 签名流程:先给模块生成自签名证书,再用mokutil --import导入,重启后在蓝色 MokManager 界面里确认。不过说实话,个人电脑关掉 Secure Boot 对绝大多数人影响很小,肯定比签名折腾起来省心得多。
提示:Secure Boot 不关,后面 DKMS 编译成功也会在加载时报
Operation not permitted。这个问题我在帮朋友处理 R7000P 时遇到了三四次,几乎都是忘了关这个。
3. 编译并安装 RTL8852AE 驱动
环境准备完毕,进入正题。这里选择用社区广泛验证过的 HRex39 维护的rtl8852be仓库。别看仓库名是 8852be,实际上对 8852AE 的支持同样有效。这个仓库说白了就是把新版内核里 rtw89 驱动的代码拿回来做兼容性修改,让你能在 5.15 甚至更低版本的内核上编译通过。
3.1 获取驱动源码
在用户目录下操作就行:
cd ~ git clone https://github.com/HRex39/rtl8852be.git cd rtl8852be如果 GitHub 连接比较慢,可以加个--depth=1参数只拉最新一次提交,减少下载量:
git clone --depth=1 https://github.com/HRex39/rtl8852be.git下载完先看看目录结构,里面应该有 Makefile、dkms.conf 以及包含驱动源码的子目录。打开dkms.conf看一眼版本号,后面 DKMS 安装会用到:
cat dkms.conf通常在PACKAGE_VERSION那一行能看到类似v1.0或1.0之类的字符串,记下来。
3.2 直接编译安装
切换到该目录后,执行:
make -j$(nproc)-j$(nproc)会让 make 根据 CPU 核心数并行编译,项目不大,一分钟左右就能完事。如果一切顺利,目录下会生成一堆.ko后缀的内核模块文件,其中应该能看到rtw89_8852ae.ko或者类似名字的模块。
然后执行安装:
sudo make install这个命令会把编译好的模块复制到/lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtw89/目录下,并自动运行depmod更新模块依赖关系。
之后尝试加载模块:
sudo modprobe rtw89_8852ae如果没报错,马上查一下网络设备列表:
nmcli device status这时候应该能看到 Wi-Fi 设备出现,名字大概率是wlpXsY这种以 wl 开头的无线网卡。
需要注意,modprobe的模块名要以实际生成的.ko文件名称为准。比如你看到的是rtw_8852ae.ko,那就用sudo modprobe rtw_8852ae。不确定的时候,可以用ls /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtw89/瞧一眼,这一步最保险。
3.3 用 DKMS 让驱动跨内核版本存活
直接make install有个问题:以后每次内核升级,模块都必须重新编译一次。Ubuntu 内核经常升级,如果你不管,过几天一重启 Wi-Fi 又没了,还得找回这篇教程重新来一遍。
这时候 DKMS 的价值就体现出来了。DKMS 相当于内核模块的包管理器,它会在内核升级时自动重新编译已经注册过的模块。把驱动交给 DKMS 管理,一劳永逸。
在仓库目录下执行:
sudo dkms add . sudo dkms install rtl8852be/<版本号>其中<版本号>替换成刚才在dkms.conf里看到的 PACKAGE_VERSION。比如你看到的是1.0,就执行:
sudo dkms install rtl8852be/1.0看到DKMS: install completed之类的输出,就代表 DKMS 注册成功。之后再用modprobe手动加载一次当前内核的模块,然后重启验证。
这里有个细节,DKMS 的版本号拼写必须和dkms.conf里完全一致,区分大小写。如果搞不清,可以先用sudo dkms add .注册,再执行sudo dkms status查看已注册的模块名和版本,复制出来直接用。
提示:在 Linux 上装无线网卡驱动时,很多人习惯“编完 make install 就算了”,但在 Ubuntu 20.04 上我强烈建议注册 DKMS。你永远猜不到 apt 哪次升级会顺手换掉内核,而 Wi-Fi 突然消失的痛,一次就够了。
4. 常见问题与排查技巧实录
驱动安装过程中,我前前后后踩了不少坑,也帮别人处理过不少类似问题。这里挑几个高频问题集中说一下,每个都是能直接照抄的排查思路。
4.1 编译一直报错的几个典型原因
错误一:Makefile 找不到内核构建目录
报错大概是Makefile: ... *** Cannot find kernel build directory。这种情况 99% 是linux-headers包没装全。执行:
sudo apt install --reinstall linux-headers-$(uname -r)然后确认/lib/modules/$(uname -r)/build是一个有效符号链接,指向/usr/src/linux-headers-$(uname -r)。
错误二:gfp_t等内核类型未定义
这说明编译器看到的头文件不对,通常是混用了不同版本的内核头文件。在干净的 Ubuntu 20.04 HWE 内核下,这种情况很少见;如果你手动装过其他内核,头文件冲突的概率就大了。解决思路是回到当前运行的 HWE 内核版本,卸载其他多余内核头部,或者干脆重装一遍头文件包。
错误三:编译到一半卡住报fatal error: linux/vermagic.h
说明头文件不完整,和错误一的原因同源,重装 linux-headers 包即可。另外注意,某些精简版系统可能缺少bison、flex这类工具,如果 make 报这两个命令找不到,顺手装一下:
sudo apt install bison flex4.2 装完还是“未找到 Wi-Fi 适配器”
驱动编译装好,设备列表里依然没有 Wi-Fi,优先怀疑三个地方:
第一,模块没加载成功。用sudo modprobe rtw89_8852ae手动加载,如果在dmesg | tail里看到Operation not permitted或者Key was rejected by service,基本就是 Secure Boot 在拦,回 BIOS 关掉再试。
第二,模块加载报错但你没注意。执行dmesg | grep rtw,如果看到类似Direct firmware load for rtw89/rtw8852ae_fw.bin failed的日志,说明固件文件缺失。此时需要单独下载对应固件放到/lib/firmware/rtw89/目录下,再执行:
sudo update-initramfs -u sudo reboot第三,rfkill 把无线网卡软禁了。有些机器上系统启动默认会把 Wi-Fi 设为 soft-blocked,执行:
rfkill list如果显示Soft blocked: yes,用:
rfkill unblock all之后立刻看nmcli radio wifi,输出enabled就说明网卡已经解禁。
4.3 升级内核后网卡又消失了
没有用 DKMS 安装的话,升级内核后 Wi-Fi 丢失几乎必然发生,因为新内核目录下没有驱动模块。此时切到旧内核启动还能用,但这不是长久之计。
解决办法就是老老实实回到 3.3 节,用 DKMS 注册驱动。注册完成后,DKMS 会在内核变更时自动为新内核编译模块,不需要你每次手动操作。如果 DKMS 注册后升级内核仍然失效,用:
sudo dkms status查看模块状态里是否有installed标识。如果有add但没install,就手动执行sudo dkms install rtl8852be/<版本号>。
还有一个老生常谈的细节:DKMS 自动编译的前提是新内核的头文件已经安装。建议在系统里常备一个linux-headers-generic-hwe-20.04元包,这样内核升级时头文件会随之更新,DKMS 才能顺利完成编译。
5. 换个思路:直接上 6.x 主线内核
如果上面的流程走到一半实在被各种环境问题折磨得不行,或者你不想维护一个第三方内核模块,其实还有一条更省心的路:把内核直接升到 6.x 主线版本。6.x 内核里,RTL8852AE 已经被原生驱动rtw89支持,而且支持程度随着内核迭代越来越好。
5.1 主线内核和 20.04 自带内核的区别
Ubuntu 官方软件源里的内核版本是经过长期支持的,不会轻易大版本跳升。主线内核(Mainline Kernel)则是 Ubuntu 内核团队构建的、提供给用户测试新功能的更新内核,版本跨度很大,安装后uname -r可能直接变成6.5.0-xxxx-generic。
6.2 之后的内核,对 8852AE 这样的 Realtek Wi-Fi 6 芯片已经相当友好,很多用户反馈装完主线内核后网卡直接识别,连驱动编译都省了。当然代价是你脱离了官方 LTS 内核的安全补丁节奏,不过对个人桌面用户来说,这个风险通常可以接受。
5.2 主线内核安装步骤
最稳妥的方式是通过 Ubuntu Mainline Kernel Installer 工具安装。执行:
sudo add-apt-repository ppa:cappelikan/ppa sudo apt update sudo apt install mainline打开 mainline 图形界面,选一个带generic字样的 6.2 或更高版本,点击安装。装完重启,uname -r确认内核版本。
如果你跟我一样喜欢命令行操作,也可以直接到 Ubuntu 内核主线页面下载对应架构的linux-image-*amd64.deb和linux-modules-*amd64.deb两个包,然后手动安装:
sudo dpkg -i linux-image-*.deb linux-modules-*.deb重启后,大概率不用任何手动加载,网卡就自己出来了。如果依然没有,再用lsmod | grep rtw89看看有没有模块,没有的话执行sudo modprobe rtw89_8852ae手动加载一次。
提示:主线内核只是新内核里面的少数几个软件包,不会替换掉原来的 5.15 HWE 内核。重启后 grub 会让你选择启动哪个内核,万一主线内核有问题,还能退回旧内核,不用太担心。
6. 一些基于实操经验的总结
整个过程走下来,我个人比较推荐的选择是:优先升 HWE 内核到 5.15,再用 DKMS 方式安装社区驱动。这套方案兼顾了 20.04 LTS 的稳定性和日常可用性,以后内核更新也不容易翻车。
如果你本身就是爱折腾的人,或者这台机器你只是用来跑跑深度学习、ROS 之类对环境要求高的任务,那干脆直接上 6.x 主线内核更省心。毕竟内核原生驱动总比第三方维护的代码少一层风险。
最后分享一个排查时比较实用的习惯:每次操作完先别急着重启,用dmesg | grep rtw和nmcli device status确认模块加载与设备识别状态。看到rtw89_8852ae: probe success之类的日志,再重启基本上不会出问题。我也见过有人明明加载成功但设备没出现,结果只是 NetworkManager 没刷新,按一下sudo systemctl restart NetworkManager就解决了。
RTL8852AE 这张网卡在 Linux 下的故事还在继续,社区驱动的更新频率挺高的,如果你在安装时遇到本文没覆盖到的奇怪报错,多半是仓库版本更新了 API,重点看 dmesg 输出,然后去对应 GitHub 仓库的 Issues 里搜一下,通常能找到答案。