ARTICLE DETAIL

资讯详情

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

Ubuntu 20.04下RTL8852AE WiFi6网卡驱动编译安装全攻略

Ubuntu 20.04下RTL8852AE WiFi6网卡驱动编译安装全攻略 如果你手里正好有一台联想小新Pro16把它从Windows切到Ubuntu 20.04之后发现右上角WiFi图标一直转圈、列表里什么都扫不到那么恭喜你你大概率和我踩中了同一个坑这台机器板载的瑞昱RTL8852AE是一颗较新的WiFi 6无线网卡Ubuntu 20.04自带的5.4内核里根本没有对应的rtl8852ae驱动系统里连无线网卡都认不出来。这篇博文会完整记录我从编译环境准备、源码编译到模块加载的整个过程并附带我在实际调试中遇到的一堆坑和排查方法希望能让同样用这块网卡的人少走点弯路。本文适合所有想在Ubuntu 20.04下驱动RTL8852AE/BE系列WiFi 6网卡的用户尤其是联想小新Pro16、部分华硕和戴尔机型的朋友。你只要会打开终端、复制命令就能跟着把它装好。中途如果遇到模块加载失败、编译报API错误、开机后WiFi失效这类情况对应章节都有解决方案可以直接跳过去看。1. 项目背景与驱动选型分析1.1 先确认网卡到底是不是RTL8852AE动手之前第一件事不是急着clone代码而是确认你的网卡型号。很多笔记本同一型号不同批次用的无线网卡差异很大联想小新Pro16就有批次用Intel AX201的情况驱动方案完全不同。最稳妥的方式是看硬件设备号打开终端执行lspci | grep -i network如果输出里能看到类似Realtek Semiconductor Co., Ltd. RTL8852AE 802.11ax PCIe Wireless Network Adapter [10ec:8852]的内容那基本可以确定是这颗芯片。这里的10ec:8852是PCI设备ID只要看到这个ID就说明网卡是瑞昱8852系列。如果想要二次确认也可以在Windows设备管理器里找“网络适配器”查看硬件ID格式通常是PCI\VEN_10ECDEV_8852。记住这个ID在后面的驱动选型里非常关键——RTL8852AE和RTL8852BE虽然只差一个字母一个是PCIe接口一个是内置蓝牙共存方案但代码路径不同模块名也不同。我见过有人拿着8852BE的板子去编译8852AE的驱动折腾半天最后才发现是型号搞错了。1.2 为什么Ubuntu 20.04默认驱动不了这块卡先说结论Ubuntu 20.04 LTS默认使用的Linux 5.4内核里压根没有rtw89这个驱动目录瑞昱的WiFi 6方案自然无法被识别。RTL8852AE大约是2020年后量产的芯片而rtw89驱动真正进入内核主线已经是5.15之后的事这中间差了整整一年半。Linux 5.4时代瑞昱主推的开源驱动是rtw88支持的芯片包括RTL8822CE、RTL8822BE这一代并没有覆盖8852。这也解释了为什么你在Ubuntu 20.04下执行lspci能看到网卡硬件但ip link里就是没有无线接口。系统根本没有对应的驱动模块硬件就只是挂在那里完全不工作。很多人以为是自己WiFi开关没开折腾半天rfkill其实问题出在内核没有驱动。明白了这一层后面的方向就很清楚要么升级内核让内核直接支持要么从源码编译最新的rtw89驱动。1.3 三种方案对比为什么最终选择源码编译我当时其实对比过三种方案后来也帮朋友试过各有利弊方案优点缺点适用场景升级到HWE/OEM内核直接支持操作简单内核自带rtw89驱动HWE内核里的rtw89版本较旧可能不识别8852AE或固件缺失内核版本高、芯片已被主线覆盖的批次找别人编译好的deb/ko文件省时省力内核版本、GCC版本不匹配时容易崩溃来源不明有安全风险临时应急不想动内核和编译环境从lwfinger/rtw89源码自行编译可控性强代码更新及时需要装工具链、内核头文件过程复杂想长期稳定使用愿意动手折腾我最终选择源码编译有几个实际考量。第一lwfinger/rtw89这个仓库是社区里非常活跃的Realtek WiFi驱动维护点不仅支持RTL8852AE还对内核API变化适配很快遇到问题可以直接git pull拉取最新代码。第二纯编译安装只是把模块复制到当前内核目录而配合DKMS之后以后系统更新内核它会自动重编不用每次手动折腾这是长期使用最省心的路径。第三源码编译过程中你能看到日志模块加载出问题方便定位比用别人编译好的二进制文件更容易排查问题。2. 编译前的环境准备2.1 确认内核版本与升级HWE内核如果你现在的内核还是5.4我强烈建议先升级到HWE内核再继续。在终端里执行uname -r如果看到类似5.4.0-150-generic的输出就先执行这条命令sudo apt update sudo apt install linux-generic-hwe-20.04安装后重启再执行uname -r正常情况下应该变成5.15.x或更高。为什么一定要这一步因为rtw89当前master分支的代码是围绕新内核API写的在5.4内核上编译大概率会报出一堆implicit declaration of function错误这些错误不是简单改代码能解决的涉及网络子系统结构体定义的变化。用HWE内核后Ubuntu发行版版本号还是20.04但内核模块API已经和22.04看齐编译rtw89基本是一路畅通。如果你不想装HWE也可以试试linux-oem-20.04这个内核在部分联想机型上有额外的平台驱动优化。但我实测下来小新Pro16上HWE内核兼容性更好oem内核反而遇到过触控板小Bug。这里多说一句升级内核之前最好把所有编译相关工具也一并装好免得重启完还要回头折腾。2.2 安装编译工具链与内核头文件驱动编译本质上就是给当前运行的内核生成一个外部模块所以内核头文件必须和当前内核版本完全一致一个都不能差。我建议一条命令装齐所有依赖sudo apt install -y build-essential git dkms bc rfkill wireless-tools net-tools这些工具各司其职build-essential提供gcc和makegit用来拉取源码bc在编译内核模块时会执行一些数值脚本dkms用于后续的模块版本管理rfkill和wireless-tools都是排查WiFi问题的常用工具。装完工具链后再单独装内核头文件sudo apt install -y linux-headers-$(uname -r)这里的$(uname -r)会动态获取当前内核版本确保安装的头文件与运行中的内核匹配。装完后验证一下头文件是否可用ls /lib/modules/$(uname -r)/build如果输出一个目录说明头文件OK。如果提示“No such file or directory”说明头文件没装对或没装全后面编译必然报/lib/modules/.../build is missing这一步值得多花一分钟确认。2.3 提前处理Secure Boot问题联想小新Pro16的BIOS里Secure Boot默认开启Linux内核在加载外部模块时如果没有合法签名会直接拒绝加载。我们编译出来的rtw89_8852ae.ko肯定没有签名所以这一步必须在编译前就搞清楚。先检查当前状态mokutil --sb-state如果输出SecureBoot enabled说明需要处理。处理方式有两种一是进BIOS关闭Secure Boot缺点很明显系统安全级别下降二是在系统里做MOK签名让内核信任我们自己的模块。我推荐第二种虽然看起来多几个命令但一次配置好以后无论是modprobe还是DKMS自动编译都能顺利加载。关于MOK签名的完整操作我放在第4章详细讲这里只需要确认系统当前状态心里有个数。3. 手把手编译安装rtl8852ae驱动3.1 获取rtw89驱动源码与固件一切准备就绪先获取rtw89驱动源码cd ~ git clone https://github.com/lwfinger/rtw89.git cd rtw89如果你的网络环境clone比较慢或者中途断掉也可以直接在浏览器里打开仓库页面点击“Download ZIP”把压缩包传到机器上再解压效果一样。不推荐用老旧版本或第三方fork因为我发现有些fork版本长期不更新遇到新内核后根本无法编译。进入源码目录后你会看到一堆以rtw89_xxxx.c命名的文件其中rtw89_8852ae.c对应的就是RTL8852AE。这就是为什么我之前说必须先确认硬件ID——如果网卡是8852BE编译出来的模块名不同加载方式也不一样。接下来补固件。rtw89驱动在加载时要从/lib/firmware/rtw89/目录读取rtw8852ae_fw.binUbuntu 20.04自带的linux-firmware包太老默认没有这个文件。需要从linux-firmware仓库下载该固件放到对应路径sudo mkdir -p /lib/firmware/rtw89 sudo cp rtw8852ae_fw.bin /lib/firmware/rtw89/固件文件很小几百KB但缺了它模块加载虽然不会报“command not found”却也不会出现无线接口属于比较容易误判的问题。3.2 编译与安装从make到modprobe进入源码目录后开始编译make -j$(nproc)-j参数开启多核并行编译$(nproc)会自动读取CPU核心数。我的小新Pro16是8核编译过程大概两分钟就结束了速度远比你想象中快。如果编译过程中出现Error先别慌优先检查内核头文件版本是否匹配或者先把源码make clean之后再重试。但要提醒一句不要在5.4内核上硬编我试过那报错量不是靠make clean能解决的。编译成功后执行安装sudo make install sudo depmod -amake install会把生成的.ko文件复制到/lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtw89/目录下depmod重建模块依赖关系。接下来加载模块sudo modprobe rtw89_8852ae如果没有任何输出大概率是成功了。这时用ip link看一下网络接口应该能看到一个类似wlp2s0的无线接口。看到接口后继续用nmcli device wifi list扫描WiFi或者直接右上角点WiFi图标熟悉的网络列表应该就回来了。如果这一步没有出现无线接口大概率是固件或Secure Boot问题参考第4章的排查思路。3.3 用DKMS保住驱动避免内核升级后失效这一步可能有人觉得可做可不做但我强烈建议做。如果不装DKMS当前编译的模块只存在于当前内核目录系统哪天升级内核新内核下WiFi又会消失你还得把源码翻出来重新编一遍。装好DKMS后系统每次更新内核都会自动调用dkms为新内核编译模块省心很多。安装DKMS本身很简单sudo make dkms-install这个命令会读取仓库里预先写好的dkms.conf自动把源码注册到系统DKMS库中。如果想手动操作也可以拆成三步sudo dkms add . sudo dkms build rtw89/1.0 sudo dkms install rtw89/1.0注意这里的rtw89/1.0是dkms版本号以dkms status里显示的实际名称为准。装完后执行dkms status如果显示installed就说明DKMS接管成功。之后哪怕内核升级也不用来回折腾了。3.4 修复固件缺失问题固件缺失是编译安装中最容易踩的坑我把它的排查单独拿出来说。现象是驱动模块加载时没有任何error但dmesg -T | grep rtw89日志里能看到Direct firmware load for rtw89/rtw8852ae_fw.bin failed with error -2。出现这个日志说明模块已经加载成功但是没有固件可跑。解决方法是把rtw8852ae_fw.bin放到/lib/firmware/rtw89/路径下然后重新加载模块sudo modprobe -r rtw89_8852ae sudo modprobe rtw89_8852ae再次检查dmesg | tail -20如果看到类似rtw89_8852ae: firmware version ...的日志就说明固件正常加载了。这里有个小细节有些教程会让人把固件放在/lib/firmware/根目录驱动其实也能找到但放到rtw89/子目录更规范也避免多个驱动固件文件混在一起。4. 踩坑实录与排查技巧4.1 编译报错头文件与API不兼容我第一次编译时用的就是默认5.4内核make一开始就报error: implicit declaration of function ...一堆函数找不到定义。这个问题的根源很简单旧内核的网络子系统API比rtw89要旧驱动代码里调用的符号在新内核里才存在。最直接的解决方案就是升级到HWE内核然后把源码重新编译。如果内核已经是5.15或更高依然报编译错误那多半是源码版本过旧。做一次git pull把代码更新到最新master分支很多API适配提交可能刚进去。编译环境干净程度也很重要遇到奇怪报错时先执行make clean make -j$(nproc)我遇到过由于之前交叉编译残留的.o文件导致的链接错误make clean之后就没问题了。这个习惯可以保持每次拉完新代码都先clean一次。4.2 Secure Boot拦截MOK签名实操如果你确认固件路径正确、模块路径正确但modprobe后依然没有无线接口那十有八九是Secure Boot拦截。日志里会出现module verification failed: signature and/or required key missing - tainting kernel但这个问题在dmesg里可能比较靠后要有耐心翻。MOK签名的大致流程分四步生成密钥对、导入公钥到MOK数据库、重启确认、给模块签名。先生成密钥openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj /CNMy MOK/然后导入公钥sudo mokutil --import MOK.der此时会提示设置一次性密码记住这个密码。重启后系统会进入蓝色MokManager界面选择“Enroll key from disk”找到MOK.der文件确认后输入刚才设置的密码。回到系统后给编译好的模块签名sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 MOK.priv MOK.der /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtw89/rtw89_8852ae.ko sudo depmod -a sudo modprobe rtw89_8852ae签名之后模块就能被内核接受了。如果你用了DKMS模块路径可能在/usr/src/...目录下需要先dkms status查一下实际路径。这块确实麻烦但配好之后后续就顺畅了。4.3 装好驱动却掉线频繁关闭省电模式驱动加载成功、WiFi能连上并不代表流程结束。我在5GHz频段下实际测试时一开始连接正常但几分钟后延迟突然飙到几百毫秒偶尔直接断开重连。这个现象和驱动本身的电源管理有关rtw89默认开启省电模式在某些路由器组合下省电逻辑会导致丢包和延迟。临时关闭省电模式sudo iw dev wlp2s0 set power_save off把wlp2s0替换成你实际的无线接口名。如果问题消失说明就是省电模式的锅。为了永久生效可以创建一个systemd服务# /etc/systemd/system/disable-wifi-powersave.service [Unit] DescriptionDisable WiFi power save Afternetwork.target [Service] Typeoneshot ExecStart/usr/sbin/iw dev wlp2s0 set power_save off [Install] WantedBymulti-user.target然后执行sudo systemctl enable disable-wifi-powersave.service sudo systemctl start disable-wifi-powersave.service这里需要提一句如果你的无线接口名在重启后变了systemd服务里的ExecStart路径也要同步改否则服务会启动失败。接口名一般和PCI槽位有关正常情况会比较稳定但换过网卡或内核版本变动时要注意检查。4.4 和系统自带的其他无线模块冲突怎么办如果你机器上同时存在Intel或联发科的无线模块之前可能还装过rtw88等Realtek驱动加载rtw89时可能出现接口名冲突、两个模块抢设备的情况。排查顺序很明确先用lsmod | grep rtw看当前加载了哪些Realtek模块。如果有多个rtw系列模块在抢设备可以写一个黑名单文件禁用不需要的模块# /etc/modprobe.d/rtw89-only.conf blacklist rtw88_8852ae blacklist rtw88_8822ce保存后执行sudo update-initramfs -u再重启。这个操作只影响Realtek相关模块不会牵连其他无线网卡驱动。还有一个容易误判的情况驱动本身没问题但无线开关处于RF-kill状态。这时候用rfkill list查看输出如果看到soft blocked: yes执行rfkill unblock wifi解除即可。联想小新Pro16没有物理无线开关但系统状态有时会被错误标记为软阻塞这个检查点很便宜排障时不妨先看。最后再分享一点个人体会。其实整个流程走下来编译本身只花了两分钟真正花时间多的地方全在排查那些“模块加载了但接口不出来”的诡异现象。后来我把操作顺序固定成了先升级内核、再装依赖、再编驱动、再补固件、最后处理签名。每完成一步都用uname -r和dmesg做确认整个流程反而很快。如果你也遇到类似问题照着上面的步骤来一遍大概率能把RTL8852AE这块WiFi 6网卡在Ubuntu 20.04下跑起来。
返回列表