ARTICLE DETAIL

资讯详情

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

Ubuntu 20.04 下 RTL8852AE 无线网卡驱动安装与排查指南

Ubuntu 20.04 下 RTL8852AE 无线网卡驱动安装与排查指南 如果你和我一样在拯救者 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 有 HWEHardware 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 Bootmokutil --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 连接比较慢可以加个--depth1参数只拉最新一次提交减少下载量git clone --depth1 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 里搜一下通常能找到答案。
返回列表