ARTICLE DETAIL

资讯详情

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

Ubuntu 22.04下RTL8852BE无线网卡驱动编译与故障排查指南

Ubuntu 22.04下RTL8852BE无线网卡驱动编译与故障排查指南 在联想拯救者、华硕天选这类主流游戏本上装了 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 这种固定内核版本的发行版除非用户自己升级内核或者安装 HWEHardware 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 厂商 IDb852是设备 ID。如果输出是b852说明确实是 8852BE。有些机器用的是 8852CEb85c虽然同属 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_8852bemodprobe时如果没有任何输出说明模块加载成功。看日志确认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_NAMErtw89 PACKAGE_VERSION8852be 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 AUTOINSTALLyes REMAKE_INITRDyes 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] DescriptionDisable Wi-Fi power save Aftermulti-user.target [Service] Typeoneshot ExecStart/usr/sbin/iw dev wlp2s0 set power_save off [Install] WantedBymulti-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当前目录下编译的新.komodprobe按照依赖模块搜索路径加载如果旧模块被硬链接或者优先级更高新的就起不来。不要手动去删内核自带目录的模块优先检查 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 频宽都打开网卡协商速率才会好看。也可以确认扫到的网络是否支持 AXiw 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] bandbg这会强制使用 2.4GHz一般不至于断流但吞吐量也会随之下降。我的经验是优先保持 5GHz只是把 power save 关掉绝大多数丢包问题都能解决。5.3 卸载驱动回归原状万一不想用了需要把一个直装驱动的系统恢复原样。先卸载模块sudo modprobe -r rtw89_8852be然后找到模块文件删除或者跑make uninstall。如果源码目录还在cd ~/rtw89 sudo make uninstallDKMS 安装的版本单独用sudo dkms remove -m rtw89 -v 8852be --all最后sudo depmod -a刷新依赖即可。这样处理完后系统回到没有驱动时的状态完全不留痕迹。根据我自己的折腾经历这类 Realtek 网卡驱动的编译过程90% 的时间都花在环境问题和内核版本的磨合上真正的源码编译本身反而不太会卡壳。装过一次之后你基本能把 Linux 下编译内核模块这条链路练得滚瓜烂熟。以后换到别的无线网卡、换了别的发行版只要思路一致——确认硬件 ID、准备内核头文件、找对源码、处理好 Secure Boot——都不用再求人。最后再提醒一句如果你买笔记本的预算和型号选择上还有余地优先选 Intel 无线网卡的机器能省掉这些麻烦但手里的 8852BE 已经没法换的按这篇步骤走一遍Wi-Fi 确实能用稳定度也过得去。
返回列表