Ubuntu 20.04离线安装RTL8852BE驱动:从依赖准备到WiFi连接
搞过Linux无线网卡驱动的朋友应该都有体会在Ubuntu 20.04下遇到Realtek系网卡尤其是笔记本自带的RTl8852BE标题里写的b852实际对应的是Realtek RTL8852BE是WiFi 6 802.11ax PCIe网卡默认内核不带驱动模块系统装完只能插网线或者用手机USB共享网络才能上网。更难受的是如果这台机器压根连不了有线网络手上只有一个离线安装包那整个流程就变成了一场对依赖关系的极限挑战。这篇内容就是把我在离线环境下给Ubuntu 20.04安装RTL8852BE驱动的完整过程、踩过的坑和排错思路整理出来。不管你是刚装完双系统发现WiFi不可用还是在一台无法连外网的机器上部署Linux环境这篇文章都适用。我会把离线这个条件拆开揉碎讲清楚怎么在没有网络的情况下搞定编译工具链、内核头文件和驱动源码以及怎么让驱动在系统重启后还能自动加载。全文以实操为主命令可以直接复制使用。1. 装驱动前必须搞清楚的三件事1.1 你的网卡到底是哪个芯片很多人在安装驱动时第一步就搞错了方向。RTL8852BE和RTL8852CE、RTL8852AE虽然只差一个字母但对应的驱动源代码完全不同强行混用轻则编译报错重则模块加载后系统直接卡死。所以开工前先花两分钟确认芯片型号。终端执行lspci | grep -i network如果是PCIe接口输出类似02:00.0 Network controller: Realtek Semiconductor Co., Ltd. Device b852注意这个b852就是设备ID。如果看到的是c852那是RTL8852CE如果是a852那是RTL8852AE。标题里写的b852对应的正是RTL8852BE。再配合命令lsusb可以判断是不是USB外置网卡。如果是USB接口的Realtek网卡比如8811CU、8192FU这类走的是另一个驱动分支千万别用本文的PCIe方案硬套。1.2 内核版本决定你要编译什么Ubuntu 20.04默认内核是5.4但很多人会升级到5.8、5.11甚至5.15HWE内核。RTL8852BE的驱动源码对内核版本比较敏感5.4和5.15编译时遇到的报错完全不一样。确认内核版本uname -r输出示例5.15.0-91-generic这一步的意义在于后面你找内核头文件时必须找和这个版本号完全匹配的包。比如上面这个版本就需要linux-headers-5.15.0-91-generic差一个小版本号都编译不了。1.3 确认系统里是否已有残留驱动有些机器出厂预装的Ubuntu可能已经带了驱动模块只是没加载。先检查modinfo rtw89_pci如果有输出说明系统里已经有rtw89驱动RTL8852BE的官方驱动属于rtw89系列只是没加载。此时可以先尝试sudo modprobe rtw89_pci然后看iwconfig是否出现无线网卡。如果出现说明不用折腾编译直接写配置文件让开机自动加载就行。如果没有输出或者报错那就老老实实走编译流程。注意别看到网上有人用rtl8852be的旧驱动比如rtl88x2ce就照搬8852BE的芯片较新老驱动源码编译基本都会失败直接用rtw89仓库的源码才是正道。2. 离线安装的整体思路与方案选型2.1 为什么离线安装这么折磨人在线安装时一条sudo apt install dkms build-essential linux-headers-$(uname -r)就搞定了所有编译依赖。但离线状态下这行命令会直接报Unable to locate package或者Package not found。依赖问题本质上是鸡生蛋的问题装驱动需要编译工具链编译工具链需要apt安装apt安装需要网络但网络需要装好驱动才能用。所以离线方案的核心思路就是想办法绕开这个死循环。2.2 三条可行路线对比我实际尝试并验证过三种离线安装方案各有优劣整理成表格方便你根据自己的条件选择方案适用场景优点缺点推荐指数方案A手机USB网络共享手头有安卓手机且有流量不用提前准备任何包直接apt在线装依赖需要手机数据线且流量消耗较大五星最推荐方案B另一台联网机器下载deb包身边有能上网的电脑Windows/Mac/Linux均可一次性准备之后可以离线重复使用需要找对依赖包版本匹配麻烦四星方案C从Ubuntu安装U盘提取依赖手上有Ubuntu安装U盘不需要第二台电脑U盘里自带部分包安装盘里包不全往往还是缺依赖三星先说结论如果你手边有任何一台能上网的安卓手机优先用方案A。因为USB网络共享在系统装完那一刻就能用而且Ubuntu 20.04对USB网卡rndis_host的原生支持已经很完善插上线就能识别。这样相当于你用手机流量换来临时网络然后就可以用原本最简单的在线方式装驱动。如果你连手机都没有只能用方案B或者方案C那就要仔细管理依赖关系。我后面会详细展开说明。2.3 我为什么最终选择了USB共享在线装依赖的组合我在实际帮朋友处理一台离线机器时最初是打算全程离线操作下载了一堆deb包后发现缺了gcc、make的特定版本来回折腾了两个小时。后来换用手机USB共享十分钟就搞定了编译环境再装驱动只花了五分钟。这个案例给我的经验是离线安装的核心难点不是驱动本身而是编译工具链。如果你能解决网络的问题哪怕是临时网络后面的操作难度会直接下降一个量级。所以这篇文章会先教你怎么用USB共享快速获得临时网络再讲彻底离线时如何处理依赖。3. 走通临时网络手机USB共享实操3.1 开启USB网络共享以安卓手机为例iPhone的USB共享在Linux下兼容性较差不推荐用数据线连接手机和电脑手机端进入设置 - 网络与互联网 - 热点与网络共享打开USB网络共享开关此时Ubuntu的NetworkManager通常会自动识别几秒钟后右上角网络图标会多出一个有线连接。如果没变化执行dmesg | tail -20看是否有rndis_host或cdc_ether相关输出。如果有说明内核已经识别到USB网卡。如果没有识别尝试手动启用sudo dhclient usb0或者查看连接名nmcli device status正常状态下usb0或enp0s20f0u1这类设备会出现在列表里状态为connected。3.2 验证网络连通性ping -c 3 mirrors.aliyun.com能通就行。然后顺手配置apt镜像源把下载速度拉起来。Ubuntu 20.04的源文件在/etc/apt/sources.list我一般直接换成清华或阿里的镜像sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo apt update提示如果你的系统是最小化安装可能连sed这个命令都没有那就用vi手动改。不过一般Ubuntu桌面版都自带sed。3.3 安装编译工具链网络通了之后第一步不是直接下驱动源码而是先把编译环境装齐sudo apt install -y build-essential dkms git bc m4 libssl-dev这几个包的分工如下build-essential包含gcc、g、make等基础编译工具是编译C代码的必需品dkmsDynamic Kernel Module Support用于管理内核模块注册后内核升级时驱动会自动重新编译git用来拉取驱动源码bc一个计算器程序Realtek驱动的Makefile里用到了它做数值计算缺少会报错libssl-dev提供openssl头文件部分内核头文件引用了它缺少时编译有可能报错装完后确认一下gcc版本gcc --versionUbuntu 20.04自带的gcc是9.xrtw89驱动对这个版本兼容良好。4. 驱动源码获取与编译安装全流程4.1 拉取正确的驱动源码RTL8852BE的驱动在Linux内核社区中已经被rtw89驱动支持但Ubuntu 20.04自带内核版本太老没有包含这个驱动。我们需要手动编译安装。我推荐使用GitHub上维护活跃的rtw89驱动仓库git clone https://github.com/lwfinger/rtw89.git cd rtw89说明lwfinger这位开发者长期维护Realtek系列网卡的Linux驱动他的仓库在Linux用户中认可度很高更新也比较及时。如果这个仓库访问不了可以试试gitee上的镜像或者用我之前下载好的源码包拷贝进U盘。如果是在另一台机器下载好源码拷过来注意压缩包解压到没有空格的路径下比如~/rtw89避免Makefile处理路径时出问题。4.2 编译前先看Makefile进入源码目录后先扫一眼Makefilehead -50 Makefile重点看有没有CONFIG_PLATFORM_I386_PC y这类选项通常默认就是y。还要确认编译器选项make如果顺利编译过程不会有任何输出直接跳完最后生成rtw89_pci.ko、rtw89_core.ko、rtw89_8852be.ko等几个ko文件。如果出现错误先看第6节的排查方法先把报错解决再继续。4.3 安装模块并加载编译通过后安装sudo make install这个命令会把ko文件拷贝到/lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtw89/目录下然后执行sudo depmod -a sudo modprobe rtw89_pci此时可以用iwconfig查看无线网卡iwconfig正常会出现wlp2s0之类的设备名字因机器而异。如果没有出现先看dmesgdmesg | grep rtw89常见的报错是 firmware 缺失。rtw89驱动需要从网卡硬件中加载固件固件文件在rtw89/的firmware/目录里。手动复制到系统固件目录sudo cp -r firmware/rtw89 /lib/firmware/ sudo modprobe -r rtw89_pci sudo modprobe rtw89_pci4.4 开机自动加载DKMS注册直接modprobe加载的模块重启后不会自动加载。如果不想每次开机都手动敲命令注册到DKMSsudo dkms add . sudo dkms build -m rtw89 -v 1.0 sudo dkms install -m rtw89 -v 1.0注意-v后面的版本号要和dkms.conf文件里的PACKAGE_VERSION一致否则会报错。不确定的话打开dkms.conf看一眼。注册完成后重启系统WiFi应该会自动连接。5. 彻底离线依赖包的准备与安装详解5.1 依赖清单到底有哪些前面提到了USB共享是首选方案但确实有人的环境连手机都没法用比如公司内网机器、无外网权限的实验室设备。这种情况下必须依赖另一台联网电脑U盘的方式搬运依赖包。我以5.15.0-91-generic内核为例列出完整依赖清单软件包作用备注build-essentialgcc、make等编译工具集合依赖gcc-9、g-9、make等dkms内核模块管理工具依赖dpkg-dev等linux-headers-5.15.0-91-generic内核头文件编译ko模块必需必须与uname -r严格一致linux-headers-5.15.0-91-common通用头文件一般会自动依赖安装libssl-devopenssl开发库编译过程中可能需要bc计算器工具Realtek的Makefile依赖下载方法是在联网的Ubuntu机器上执行apt download linux-headers-$(uname -r) apt download linux-headers-$(uname -r | sed s/-generic//)如果下载时报依赖缺失可以用apt depends查看完整的依赖链把需要的deb包一个个下载下来。这个过程很繁琐我建议直接换一个思路下载一个.deb打包工具把所有依赖打包成一个文件夹拷过去。比如在一台联网的Ubuntu 20.04机器上mkdir /tmp/kernel-deps cd /tmp/kernel-deps apt download build-essential dkms linux-headers-$(uname -r) libssl-dev bc dpkg-scanpackages . /dev/null Packages然后把整个文件夹拷到目标机器上。在目标机上sudo cp -r /tmp/kernel-deps /media/ubuntu-deps sudo apt install /media/ubuntu-deps/*.deb用apt install加本地deb文件的写法apt会自动帮你解决依赖只要文件夹里的包足够全。这是离线方案里最省心的处理方式。5.2 离线编译时最常见的失败点离线环境编译驱动最容易遇到三类问题第一类缺少linux-headersUbuntu 20.04桌面版默认不装内核头文件而编译内核模块必须要有。报错信息通常是/lib/modules/5.15.0-91-generic/build: No such file or directory解决方式就是前面说的预先下载好对应版本的头文件deb包。第二类Makefile里用了未定义变量Realtek的驱动Makefile比较老套对高版本gcc某些警告处理不够完善。如果编译时报错尝试在make时加参数make ARCHx86_64 CFLAGS-Wno-error或者关掉Makefile里的CONFIG_WARNING选项。第三类签名问题如果你开启了Secure Boot未签名的内核模块会被拒绝加载。这时要么在BIOS里关闭Secure Boot要么给模块签名。建议直接关掉简单省事。5.3 没有网络时驱动源码怎么获取这个看似废话但实际上很多人忽略如果你的目标机器无法上网那你完全可以在另一台能上网的机器上把源码准备好通过U盘、移动硬盘或者局域网内网传输过去。首选方式是内网传送在联网的电脑上启动一个临时HTTP服务cd ~/rtw89 python3 -m http.server 8000目标机器上执行wget http://192.168.1.100:8000/rtw89.tar.gz如果局域网也没有那就只能U盘拷贝。注意拷贝整个目录时保留文件权限tar czf rtw89.tar.gz rtw89拷到目标机器后解压权限问题就不会有。6. 驱动加载与WiFi连接受阻全排查6.1 编出来的ko文件加载报错怎么办现象1modprobe提示module not foundmodprobe: ERROR: could not insert rtw89_pci: Unknown symbol in module这个通常是因为模块之间依赖关系没有更新。执行一下sudo depmod -a然后再试。如果还是报错可能就是编出的内核模块和当前内核版本不一致检查uname -r和/lib/modules/目录是否对应。现象2加载成功但网卡不出现$ iwconfig lo no wireless extensions.此时dmesg大概率会提示firmware加载失败dmesg | grep -i firmware解决方式就是前面说的把rtw89仓库下的firmware/目录复制到/lib/firmware/。6.2 WiFi能连上但测速总中断这是RTL8852BE在Linux下非常典型的问题也是热搜词里反复出现的关键词网页版测速都会中断。我在实际使用中遇到过WiFi连接稳定ping也正常但一跑网页测速链接就会断开然后重连。排查后发现两个主要原因原因一电源管理策略过于激进Realtek网卡在Linux下的电源管理默认策略会把无线模块在空闲时降频甚至休眠一旦遇到突发流量就会触发断连。解决办法sudo iw dev wlp2s0 set power_save off注意把wlp2s0替换成你自己的网卡名。如果这个方法有效就把它写成服务开机自动执行sudo tee /etc/rc.local EOF #!/bin/bash iw dev wlp2s0 set power_save off exit 0 EOF sudo chmod x /etc/rc.local原因二WiFi 6的某些特性存在兼容问题RTL8852BE在WiFi 6模式下如果路由器开启了OFDMA或者TWTTarget Wake Time有时会产生兼容性故障。可以先把路由器的WiFi 6模式关闭或者把无线模式降为802.11acWiFi 5来验证。Linux端也可以禁用某些特性sudo modprobe -r rtw89_pci sudo modprobe rtw89_pci disable_wowlan16.3 蓝牙和WiFi互相干扰8852BE是WiFi 6和蓝牙5.2的组合芯片。在某些机器上蓝牙开启时WiFi速度会大幅下降甚至断流。这个问题的根源在于芯片默认的共存机制WiFi/BT Coexistence工作得不够好。可以尝试升级驱动源码到最新版lwfinger的仓库更新频率高新版本会修复不少共存问题。6.4 内核升级后驱动失效如果你之后执行了apt upgrade内核版本升级到5.15.0-92之类的新版本注册到DKMS的驱动会自动重新编译。但如果之前没注册DKMS内核升级后驱动就没了。此时登录系统可以临时用旧内核在GRUB菜单里选Advanced options然后cd ~/rtw89 make clean make sudo make install sudo dkms add . sudo dkms build -m rtw89 -v 1.0 sudo dkms install -m rtw89 -v 1.0重新在当前新内核上编译安装。这就是我一直强调要养成注册DKMS习惯的原因。7. 一些我觉得值得分享的细节在整个调试过程中有几个细节如果没人提醒很容易踩坑细节一编译时别用root账号直接make在源码目录里用root执行make会出现环境变量污染导致编译结果和预期不一致。正确方式是普通用户执行make需要写系统目录时才用sudo。细节二路由器5G信道的选择RTL8852BE支持的5G频段很全但如果你路由器开了DFS信道比如52、56、60、64而这个信道上有雷达信号网卡会因为DFS检测而频繁断开。把路由器5G信道固定到149以上国内允许的信道能明显减少断连。细节三笔记本自带的硬开关有些笔记本尤其是联想、戴尔有无线网卡的硬件开关或者快捷键FnF几如果开关处于关闭状态无论如何驱动都不会有反应。可以用以下命令查看无线开关状态rfkill list如果看到Soft blocked: yes或Hard blocked: yes执行rfkill unblock all来解除软封锁。硬封锁的话只能通过笔记本物理开关或快捷键打开。细节四日志是最后的救命稻草如果一切操作都正确但网卡还是连不上不要盲目重装。多查日志dmesg -w journalctl -f这两个命令一个看内核日志一个看系统日志配合使用基本可以定位90%的问题。根据我的经验RTL8852BE在Ubuntu 20.04下的整体兼容性已经比前几年好很多只要驱动源码版本够新、firmware文件完整日常使用稳定性是没有问题的。遇到测速中断的问题优先关掉电源管理大概率就能解决。如果你最终顺利装好了驱动建议顺手把dkms注册好这样以后内核升级也不会再担心驱动丢失。