Ubuntu 20.04离线安装RTL8852BE驱动:从依赖准备到WiFi连接
2026/9/21 15:18:36 网站建设 项目流程

搞过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.15(HWE内核)。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包后发现缺了gccmake的特定版本,来回折腾了两个小时。后来换用手机USB共享,十分钟就搞定了编译环境,再装驱动只花了五分钟。

这个案例给我的经验是:离线安装的核心难点不是驱动本身,而是编译工具链。如果你能解决网络的问题(哪怕是临时网络),后面的操作难度会直接下降一个量级。所以这篇文章会先教你怎么用USB共享快速获得临时网络,再讲彻底离线时如何处理依赖。

3. 走通临时网络:手机USB共享实操

3.1 开启USB网络共享

以安卓手机为例(iPhone的USB共享在Linux下兼容性较差,不推荐):

  1. 用数据线连接手机和电脑
  2. 手机端进入设置 -> 网络与互联网 -> 热点与网络共享
  3. 打开USB网络共享开关

此时Ubuntu的NetworkManager通常会自动识别,几秒钟后右上角网络图标会多出一个有线连接。如果没变化,执行:

dmesg | tail -20

看是否有rndis_hostcdc_ether相关输出。如果有,说明内核已经识别到USB网卡。

如果没有识别,尝试手动启用:

sudo dhclient usb0

或者查看连接名:

nmcli device status

正常状态下,usb0enp0s20f0u1这类设备会出现在列表里,状态为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代码的必需品
  • dkms:Dynamic Kernel Module Support,用于管理内核模块,注册后内核升级时驱动会自动重新编译
  • git:用来拉取驱动源码
  • bc:一个计算器程序,Realtek驱动的Makefile里用到了它做数值计算,缺少会报错
  • libssl-dev:提供openssl头文件,部分内核头文件引用了它,缺少时编译有可能报错

装完后确认一下gcc版本:

gcc --version

Ubuntu 20.04自带的gcc是9.x,rtw89驱动对这个版本兼容良好。

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

进入源码目录后,先扫一眼Makefile:

head -50 Makefile

重点看有没有CONFIG_PLATFORM_I386_PC = y这类选项,通常默认就是y。还要确认编译器选项:

make

如果顺利,编译过程不会有任何输出直接跳完,最后生成rtw89_pci.kortw89_core.kortw89_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之类的设备(名字因机器而异)。

如果没有出现,先看dmesg:

dmesg | grep rtw89

常见的报错是 firmware 缺失。rtw89驱动需要从网卡硬件中加载固件,固件文件在rtw89/firmware/目录里。手动复制到系统固件目录:

sudo cp -r firmware/rtw89 /lib/firmware/ sudo modprobe -r rtw89_pci sudo modprobe rtw89_pci

4.4 开机自动加载:DKMS注册

直接modprobe加载的模块,重启后不会自动加载。如果不想每次开机都手动敲命令,注册到DKMS:

sudo 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-headers

Ubuntu 20.04桌面版默认不装内核头文件,而编译内核模块必须要有。报错信息通常是:

/lib/modules/5.15.0-91-generic/build: No such file or directory

解决方式就是前面说的,预先下载好对应版本的头文件deb包。

第二类:Makefile里用了未定义变量

Realtek的驱动Makefile比较老套,对高版本gcc某些警告处理不够完善。如果编译时报错,尝试在make时加参数:

make ARCH=x86_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文件加载报错怎么办

现象1:modprobe提示module not found

modprobe: 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或者TWT(Target Wake Time),有时会产生兼容性故障。可以先把路由器的WiFi 6模式关闭,或者把无线模式降为802.11ac(WiFi 5)来验证。Linux端也可以禁用某些特性:

sudo modprobe -r rtw89_pci sudo modprobe rtw89_pci disable_wowlan=1

6.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以上(国内允许的信道),能明显减少断连。

细节三:笔记本自带的硬开关

有些笔记本(尤其是联想、戴尔)有无线网卡的硬件开关或者快捷键(Fn+F几),如果开关处于关闭状态,无论如何驱动都不会有反应。可以用以下命令查看无线开关状态:

rfkill list

如果看到Soft blocked: yesHard blocked: yes,执行:

rfkill unblock all

来解除软封锁。硬封锁的话只能通过笔记本物理开关或快捷键打开。

细节四:日志是最后的救命稻草

如果一切操作都正确但网卡还是连不上,不要盲目重装。多查日志:

dmesg -w journalctl -f

这两个命令一个看内核日志,一个看系统日志,配合使用基本可以定位90%的问题。

根据我的经验,RTL8852BE在Ubuntu 20.04下的整体兼容性已经比前几年好很多,只要驱动源码版本够新、firmware文件完整,日常使用稳定性是没有问题的。遇到测速中断的问题,优先关掉电源管理,大概率就能解决。如果你最终顺利装好了驱动,建议顺手把dkms注册好,这样以后内核升级也不会再担心驱动丢失。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询