news 2026/9/21 14:23:26

Ubuntu 20.04 离线安装 Realtek RTL8852BE 无线网卡驱动实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu 20.04 离线安装 Realtek RTL8852BE 无线网卡驱动实战

装过 Linux 的朋友基本都有类似遭遇:系统装好了,界面也正常,结果右上角偏偏没有 WiFi 图标。尤其是一台崭新的笔记本,或者刚换的 USB 无线网卡,插上去一点反应没有,那一刻的心情真的有点崩溃。这次要聊的就是 Ubuntu 20.04 下面 Realtek 无线网卡的驱动安装问题,具体型号是 b852 系列(对应 Realtek RTL8852BE 等 WiFi 6 网卡)。这类网卡在 Windows 下很省心,驱动自动装好,但到了 Linux 下就成了"玄学"——因为官方内核自带的驱动源里没有对应模块,或者有模块但默认没启用,又或者模块版本太旧根本不识别。

更要命的是,很多朋友遇到驱动问题时,本身就在一个"没网络"的环境里。学校机房、公司内网、宿舍只有网线口但没网线、或者干脆就是一台不能联网的裸机。这就是"离线安装"最折磨人的地方:你想装网卡驱动,但网卡驱动装不上就没有网;你没网,就不能用 apt 自动下载依赖包。破解这个死循环需要一点思路,也需要提前准备一些"救援工具"。这篇文章就把整个过程中涉及的原理、步骤、坑和经验全部摊开来讲,包括怎么在没有网络的情况下把编译工具链、内核头文件和驱动源码全部准备好,以及有哪些备用方案可以在断网时救急。

先说明一下,我这里说的 b852 是一个系列的统称,实际你可能在 lspci 里看到的是 Realtek RTL8852BE 或者 RTL8852AE,也可能看到 Device b852 这个硬件 ID。它们基本都是同一代 WiFi 6 无线网卡方案,驱动处理方式大同小异。这篇文章会以这个系列为主线,覆盖从"识别硬件型号"到"离线编译安装"再到"开机自动加载"的完整流程。

1. 为什么 Ubuntu 20.04 默认搞不定这张网卡

1.1 内核、固件和驱动模块的关系

要理解这个问题,先得弄清楚 Linux 无线网卡工作时的三层关系:硬件芯片、内核驱动模块、固件文件。硬件芯片就是网卡本身,它需要内核里对应的驱动模块(比如 rtw89_pci.ko)来"指挥"它工作,而这个模块在运行时还需要一份固件文件(比如 rtw8852be_fw.bin)加载到网卡内部,网卡才真正能收发射频信号。三层缺一不可,任何一层的版本不对或者缺失,表现就是网卡枚举不到或者反复掉线。

Ubuntu 20.04 的默认内核是 5.4 系列,而 Realtek RTL8852BE 对应的 rtw89 驱动是在内核 5.13 之后才正式进了 mainline。也就是说,Ubuntu 20.04 自带的 5.4/5.8/5.11 内核根本没有可用的 rtw89 驱动模块。即使你手动改了驱动来源,也大概率需要自己去编译,因为官方内核里压根没有这个源码。

这就是第一个瓶颈:内核太老。Ubuntu 20.04 的 LTS 版本为了保证稳定性,不会轻易升级大版本内核,而新硬件的驱动往往只跟随新内核发布。所以不换内核、不打补丁的情况下,这张网卡在系统看来就相当于一个"不存在的设备"。

1.2 为什么网卡在 lspci 里能看到但系统不识别

你打开终端输入 lspci,十有八九能看到类似这样的输出:

02:00.0 Network controller: Realtek Semiconductor Co., Ltd. Device b852

很多人看到这一行就觉得"系统已经识别了呀,为什么不工作?"这里要解释清楚:lspci 只是 PCIe 总线层面的枚举,它看到的是硬件设备的 IDs,并不代表内核有对应的驱动把它"接住"。就像你在门口看到一封信从门缝塞进来,但这不代表你已经读完了信。真正的工作负载在驱动模块上,没有匹配的驱动模块,lspci 能看到设备,但系统不知道如何跟网卡通信。

更直观的检查方式是:

lspci -nnk | grep -A 3 02:00.0

如果没有看到 "Kernel driver in use: rtw89_pci" 这样的字样,而是停在 "Kernel modules: ..." 为空,就说明没有驱动在用。这是你在排查所有无线网卡问题时首先要做的一步,别急着去下载源码,先确认设备到底卡在哪一层。

1.3 离线环境为什么更容易翻车

在线环境下,驱动问题相对好解决:加一个第三方 PPA(比如 lwfinger/rtw89),然后 apt update && apt install 就完事了。但在离线环境,全部依赖都要手动准备。你需要的东西不仅有驱动源码,还有编译它所需的工具链和内核头文件。很多新手只带了驱动源码的 tar 包,结果执行 make 的时候报 "Cannot find kernel headers" 或者 "gcc: command not found",当场卡住。

离线安装的核心心法很简单:你要在"有网"的另一台机器上把所有需要的包全部下载好,打包成光盘或 U 盘带过去。关键是你得知道到底需要哪些包,以及它们之间的依赖关系。这部分我会在后面专门用一个章节来讲。

实操知识:Realtek 8812BU/8822CE 等常见型号与 b852 的关系

顺带提醒一下,Realtek 的无线网卡型号非常多,不同型号的驱动方案差异巨大。老一点的 RTL8188/8192 用 rtlwifi/rtl8xxxu 内核模块,RTL8821/8812 用 rtl8812au 外部驱动,RTL8822/8852 系列则用到 rtw88/rtw89 内核驱动。如果你搜索时直接搜"Realtek 无线网卡驱动",很容易下到完全不对的东西。先确认硬件 ID 再动手,这是血泪教训。b852 这个设备 ID 对应的是 RTL8852BE,要用 rtw89 系列的驱动代码,而不是 rtl8812au 之类的老驱动。

2. 离线安装的整体思路与前置准备

2.1 两种可行的技术路线对比

针对 Ubuntu 20.04 + RTL8852BE,业界主流的方案大体上分两条路。

第一条路是"打补丁升级内核"。因为 rtw89 驱动在 5.13+ 内核中已经包含,如果你能把内核升到 5.15(比如 Ubuntu 的 HWE 内核或者 mainline 内核),那么驱动模块就直接有了。HWE(Hardware Enablement)内核是 Ubuntu 专门为新硬件准备的,20.04 后面几个小版本会提供 5.15 内核的 HWE。这条路的好处是"一劳永逸":内核带着驱动,而且和系统集成度高。坏处是内核升级可能带来其他软件的兼容性风险,离线环境下升级内核还需要准备大量内核 deb 包,体积很大。

第二条路是"手动编译外部驱动"。从 Realtek 官方 GitHub 或者 lwfinger 的仓库拉取 rtw89 源码,在自己当前内核上编译成 .ko 模块,加载进系统。这条路不需要换内核,对系统整体影响小,但每次内核更新后模块需要重新编译(用 DKMS 可以自动化)。离线环境下,准备源码和编译依赖比准备整个内核包要轻量得多。

我建议新手优先走第二条路,因为它精准打击:只解决网卡问题,不波及系统其他部分。如果你需要同时解决很多新硬件问题,比如新的核显、新的声卡,那升级内核可能更划算。

2.2 在"有网"的机器上准备离线安装包

离线安装的实际难点在于:你需要在一台能上网的 Ubuntu 20.04 机器上,把所有需要的 deb 包拉下来,然后再搬运到目标机器上。这里有个特别需要注意的原则:装饰包的版本要和目标机器的系统版本一致,因为内核头文件和 gcc 版本直接影响编译结果。最稳妥的做法就是用一台同样装 Ubuntu 20.04 的机器作为"打包机"。

需要准备的内容分三类。

第一类是编译工具链。主要是 gcc、make、build-essential。你可以用 apt download 的方式逐个下载,也可以用更省事的方法:

apt-get download build-essential gcc make dkms

build-essential 在 Ubuntu 里是一个 meta 包,它依赖 gcc、g++、make 等,但你 apt-get download 只是下载它本身,并不会自动把依赖也下载下来。所以你需要用另一种方式:

apt-cache depends build-essential

通过这个命令查看它的依赖树,然后手动把依赖列出来,再逐个 apt-get download。这个过程有点繁琐。更推荐的做法是使用 apt 的--download-only参数配合apt-get install --reinstall

mkdir /tmp/netinstall cd /tmp/netinstall apt-get install --reinstall --download-only build-essential dkms

这样 apt 会把 build-essential 和它的所有依赖包全部下载到 /var/cache/apt/archives 目录下,你直接把这个目录里的 .deb 文件全部拷走就行。

第二类是内核头文件和内核模块头文件。编译内核模块必须用到当前内核的 headers,版本必须完全匹配:

apt-get install --reinstall --download-only linux-headers-$(uname -r)

注意uname -r必须在目标机器上执行,因为头和头之间不能混用。如果你在打包机上执行uname -r,得到的版本号和目标机器不同,编译出来的模块可能加载不上。

第三类是驱动源码。你可以从 GitHub 上下载源码包,这里推荐两个源:

  • Realtek 官方 GitHub 仓库:https://github.com/rtw88/rtw89 (这个是内核上游驱动的源代码镜像,更接近 mainline)
  • lwfinger/rtw89 仓库:https://github.com/lwfinger/rtw89 (维护很活跃,修复了很多新内核的兼容问题,支持范围更广)

我个人的建议是用 lwfinger 的版本,因为它对 Ubuntu 20.04 的适配性更好,而且它自带 DKMS 支持的配置文件,可以直接安装成内核模块管理,后续内核升级时能自动重编译。

2.3 如何用 U 盘/移动硬盘把环境"搬"过去

有了这些包之后,你需要做一个"离线安装工具箱"。这里有个小技巧:不要直接把 deb 文件放在 U 盘根目录就完事了,建议按目录分类整理:

/offline-tool/ ├── drv/ # 驱动源码压缩包 ├── debs/ # 所有依赖的 deb 包 ├── scripts/ # 一键安装脚本 └── README.md # 安装说明

这么做的原因是目标机器上的环境可能比较干净,你可能需要连续执行多个 dpkg 命令,如果文件全堆在一起,很容易漏装某个依赖。README 里把安装顺序写好,按照顺序来,能少踩很多坑。

还有一个细节:U 盘的文件系统建议用 exFAT 或者 ext4,尽量不要用 NTFS,因为一些 Linux 发行版对 NTFS 的挂载需要额外驱动,虽然 Ubuntu 20.04 默认装了 ntfs-3g,但保不齐你的目标机器环境更精简。另外,U 盘里放一个md5sums.txt方便校验文件是否完整拷贝,尤其 deb 包这种二进制文件,拷贝过程中损坏一个字节都可能让 dpkg 安装时报错。

3. 驱动源码的获取与选择

3.1 官方仓库、第三方仓库和发行版补丁的区别

Realtek 驱动的源码在互联网上有好几个版本,这是新手最容易迷惑的地方。简单区分一下:

官方 GitHub 上的 rtw89 是 Linux 内核模块的上游源代码,它和 Linux mainline 内核同步维护。如果你用的是比较新的内核(比如 5.15+),直接用官方仓库的代码往往就能编译通过。但如果你用的还是较老的内核(比如 5.4),官方仓库的代码可能会因为 API 变化而编译失败,需要你在编译时手动做一些适配。

lwfinger 的仓库维护目标就更加"向下兼容"。这个维护者长期做 Realtek 网卡驱动的移植和兼容工作,他的仓库代码通常会兼容较老的内核 API,也会附带更完整的固件文件加载逻辑。对 Ubuntu 20.04 这种老系统,我优先推荐 lwfinger 的版本。

还有一种是发行版补丁(比如 Debian 的 linux firmware 包或 Ubuntu 的 linux-firmware 包)。但要注意,固件文件和驱动源码是两回事。很多时候你缺的不是驱动代码,而是固件文件。比如你在 dmesg 里看到:

rtw89_8852be: Direct firmware load for rtw89/rtw8852be_fw.bin failed

这就说明驱动模块在尝试加载固件时没找到文件。这种情况你需要装 linux-firmware 或者单独下载固件文件放到 /lib/firmware/rtw89/ 目录。恰恰这个细节,会导致你明明编译成功了驱动模块,但网卡还是无法工作。

3.2 具体怎么下载和校验

如果你在有网的机器上,可以用 git clone 拉源码:

git clone https://github.com/lwfinger/rtw89.git

然后打包:

tar czf rtw89.tar.gz rtw89/

如果你用的 GitHub 下载 zip 的网页方式,记得在下载时选择对应分支,通常 master 或者 main 就行。另外,强烈建议下载后生成一下源码包的哈希值:

sha256sum rtw89.tar.gz

把哈希值写进 README,到了目标机器上可以先校验一遍,防止拷过去之后文件损坏。虽然这个概率很低,但离线环境下排查问题的代价极高,提前花十秒校验一下很划算。

还有一件事要注意:确认目标机器是否缺少固件文件。这个在离线环境下尤其重要。你可以到 linux-firmware 的 Git 仓库里(https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/)找到 rtw89 目录下的 .bin 文件,手动放到目标机器的 /lib/firmware/rtw89/ 下。如果你用的驱动源码包比较新,它可能自带 copy-firmware 脚本或者文档说明,仔细看一下 README。

4. 依赖解决的完整实战:从打包到落地

4.1 离线依赖安装的两种方法对比

到了目标机器上,安装 deb 包一般有两种方式。一种是直接用 dpkg:

sudo dpkg -i /path/to/offline-tool/debs/*.deb

但 dpkg 不会自动处理依赖关系,如果安装顺序不对,它会提示依赖问题。所以更推荐用另一种方式:

sudo apt install /path/to/offline-tool/debs/*.deb

apt 会读取这些本地 deb 文件的依赖信息,并尝试从系统已有的包(包括你手动放进来的这些 deb)中满足依赖。只要 debs 目录里的包足够完整,apt 就能自己理清顺序,全部装好。这比手动排列 dpkg 命令要省心太多。

如果你下载了很多包,但不确定是否完整,可以用这个简单方法检查:

dpkg-deb -I /path/to/package.deb | grep Depends:

看看某个 deb 的依赖项,然后和 debs 目录列表比对,缺哪个就去补哪个。

4.2 安装驱动源码并编译

假设你已经把 rtw89 源码解压到了目标机器的 home 目录,接着进入源码目录,先看一下 README 或者 Makefile 文件开头的注释,确认编译步骤。通常这个仓库的编译流程是:

make sudo make install

在动手之前,先执行一下:

make clean

这个命令不是必须的,但如果你的源码包是从别处拷贝来的,遇到了什么奇怪的编译错误,先 clean 一下可以排除缓存残留问题。

编译过程中你可能遇到的第一个报错是缺少内核头文件:

make[1]: *** /lib/modules/5.4.0-XXX-generic/build: 没有那个文件或目录

这就说明内核头文件没装。回到 debs 目录,找到 linux-headers-$(uname -r) 和 linux-headers-$(uname -r | cut -d- -f1)-common 等包,安装上去。安装完后再执行一下:

ls /lib/modules/$(uname -r)/build

如果能正常列出内容,就说明头文件目录就绪了。

编译命令跑完后,会生成 .ko 文件。用 make install 把它安装到 /lib/modules/$(uname -r)/ 下面,然后执行:

sudo depmod -a sudo modprobe rtw89_pci

depmod 是更新模块依赖关系,modprobe 是加载模块。如果加载成功,再次执行:

lspci -nnk | grep -A 3 02:00.0

这时应该能看到 "Kernel driver in use: rtw89_pci" 了。

4.3 DKMS 与开机自动加载的设置

到这里驱动虽然装上了,但还没完。如果你直接重启,可能驱动模块会不见,因为 modprobe 只是临时的,除非系统启动时会自动加载这个模块。有两种方式保证开机自动加载。

第一种是手动配置。把 rtw89_pci 写入 /etc/modules:

echo "rtw89_pci" | sudo tee -a /etc/modules

这样每次启动时内核会尝试加载这个模块。

第二种是更优雅的 DKMS 方式。DKMS 的全称是 Dynamic Kernel Module Support,它可以管理外部内核模块的安装,并且在内核升级时自动重新编译。这样你就不用担心以后系统更新内核导致驱动失效的问题。安装 DKMS 和内核头文件:

sudo apt install dkms linux-headers-$(uname -r)

然后进入源码目录执行:

sudo dkms add . sudo dkms build -m rtw89 -v 1.0 sudo dkms install -m rtw89 -v 1.0

其中-v 1.0的版本号要根据源码里的 dkms.conf 文件来确定。你可以在 dkms.conf 里看到这样一行:

PACKAGE_VERSION="1.0"

把这个版本号抄下来,替换进命令即可。DKMS 安装成功后,它会自动注册模块到系统启动流程里,以后内核升级也不会丢。强烈建议用这种方式。

关于固件的补充步骤

驱动模块可以加载成功,不代表 WiFi 就能正常工作。如果你发现模块加载正常,但ip link里没有 wlan0 接口,多半是固件缺失。确认方法:

sudo dmesg | grep rtw89

如果看到 firmware 相关的报错,就去 linux-firmware 仓库下载 rtw89 固件文件。具体需要三个文件:rtw8852be_fw.bin、rtw8852b_table.bin、rtw8852b_fw.bin(具体名称以驱动源码要求为准)。把它们放到 /lib/firmware/rtw89/ 目录,然后重新加载模块:

sudo rmmod rtw89_pci sudo modprobe rtw89_pci

这时再查 dmesg,应该能看到固件加载成功的日志。

5. 常见问题与排查技巧实录

5.1 编译报错速查表

我把自己和网友实际遇到过的编译问题整理成了一张表,按出现频率排了个序:

报错信息原因解决方式
/lib/modules/.../build 不存在缺少内核头文件安装 linux-headers-$(uname -r)
gcc: 未找到命令缺少编译工具链安装 build-essential
函数未声明 / 隐式声明内核 API 版本太老,源码不兼容换 lwfinger 的 rtw89 版本或换新内核
undefined reference to ...内核配置缺少某些符号检查内核 config,开启 CONFIG_CFG80211 和 CONFIG_MAC80211
权限不足非 root 编译sudo make,或用 root 用户操作
make: *** 没有规则可以创建目标 modules没有进入源码根目录cd 到源码目录再执行 make

5.2 CONFIG_CFG80211 和 CONFIG_MAC80211 是什么

有些朋友编译时遇到"undefined reference"或者"unknown symbol",原因在于内核配置关闭了无线网络框架相关的选项。RTW89 驱动依赖内核的 cfg80211 和 mac80211 子系统,这两个是 Linux 无线网络的基础框架。如果没有这些配置项,驱动代码里引用的函数符号就找不到。

检查方法:

grep CONFIG_CFG80211 /boot/config-$(uname -r) grep CONFIG_MAC80211 /boot/config-$(uname -r)

如果结果显示# CONFIG_CFG80211 is not set,说明内核没启用无线框架。这种情况很少见,因为大多数发行版内核都启用了这些选项。如果你用的精简内核或者自己编译的内核,就需要注意这个点。

解决方案一般不是去重编内核(那太痛苦了),而是换一个发行版提供的标准内核,比如 Ubuntu 的 generic 内核。在离线环境下,你需要额外准备 linux-image-generic 和匹配的 linux-modules 包。

5.3 WiFi 图标不显示但模块已加载

模块加载成功后,右上角的网络图标不显示,先不要急着怀疑驱动。按顺序排查:

  1. 执行ip link看有没有 wlan0 或者 wlp2s0 接口。
  2. 有接口但处于 DOWN 状态,执行sudo ip link set wlan0 up
  3. 如果提示 "RTNETLINK answers: Operation not possible due to RF-kill",说明无线开关被硬件禁用了。执行rfkill list查看,如果是 soft block,可以用rfkill unblock wifi解除。
  4. 如果接口都正常,检查 NetworkManager 是否在运行:systemctl status NetworkManager。有些精简系统用的是 systemd-networkd 或其他网络管理器,需要你手动用 nmcli 连接 WiFi。

我之前遇到过一种情况:驱动和固件都没问题,接口也出现了,但 NetworkManager 一直不显示 WiFi 列表。最后发现是 NetworkManager 没有 wifi 后端权限,把它加入 netdev 用户组就解决了:

sudo usermod -a -G netdev $USER

这个坑比较冷门,但也值得记录一下。

5.4 模块已加载但搜索不到 WiFi 信号

这种情况大概率是固件版本和驱动版本不匹配。你可能从 A 地方下载了驱动源码,从 B 地方下载了固件,两者版本不一致,表现出来就是能扫描到零个 AP,或者能扫到但连不上、连上就掉线。解决办法是:把驱动源码自带的固件(一般在 firmware 子目录下)复制到 /lib/firmware/rtw89/,确保固件和驱动来自同一份源码包。

还有一个容易被忽略的点:WiFi 6 网卡默认启用了 802.11ax 模式,部分老路由器对这个模式兼容性不好,导致连接不稳定。可以尝试禁用 802.11ax:

sudo modprobe rtw89_pci disable_11ax=1

如果确认有效,就把它写入 /etc/modprobe.d/rtw89.conf:

options rtw89_pci disable_11ax=1

这个参数在部分型号的老驱动里没有,可以先通过modinfo rtw89_pci查看可用参数列表。

5.5 没有"有网"打包机时的备用方案

最后聊一个现实问题:如果你身边压根没有第二台能上网的 Ubuntu 机器,怎么破?

方案一:用 U 盘启动一个 Live 系统。下载 Ubuntu Desktop 的 ISO 文件,写入 U 盘,然后在 U 盘启动的 Live 环境里联网下载依赖包,再把 deb 包打包放到硬盘分区里。前提是你的笔记本在这个 Live 环境里能识别有线网卡或者能通过手机 USB 共享网络。

方案二:手机 USB 网络共享。对,手机接入电脑,开启"USB 网络共享",Ubuntu 系统一般会自动识别为一个有线网卡接口(rndis_host 或者 cdc_ether),这样你就能在"目标机器"上直接联网了。这个方案很多老手都在用,不只是装驱动时好用,任何断网救援场景都能用上,强烈建议掌握。操作步骤是把手机用 USB 线连上电脑,手机端设置里开启"USB 网络共享",Ubuntu 的 NetworkManager 一般会自动弹出一个新连接,几分钟内搞定网络。

方案三:如果你手头有树莓派或者其他 Linux 小主机,可以把它们当作"下载机",在它们上下载 deb 包再拷贝到目标机器。但要提醒一下:下载包的机器架构不同会导致 deb 包不通用。X86 机器上要下载 amd64 架构的包,ARM 树莓派上下载的是 arm64 架构,不能混用。所以更好的办法是直接用手机 USB 共享网络,只要目标机器能上网,所有依赖都能用 apt get 直接装,省去手动下载依赖的麻烦。

6. 安装完成后的验证与系统加固

6.1 验证网卡是否真正可用

驱动加载、固件就位、接口出现,这只是第一步。真正验证网卡可用,要连上 WiFi 做一次断网重连测试。在终端里用 nmcli 连接:

nmcli dev wifi list nmcli dev wifi connect "你的SSID" password "你的密码"

如果连接成功,用 ping 测试稳定性:

ping -c 10 223.5.5.5

看丢包率和延迟,如果都正常,说明网卡硬件和驱动工作状态良好。再用 iperf3 测一下实际吞吐,能到几百 Mbps 基本就没什么问题了。如果你发现连接后频繁断流,可以参考前面提到的 disable_11ax=1 参数,或者换一个无线信道试试。

6.2 内核升级后驱动丢失的预防

DKMS 已经能解决 90% 的内核升级问题,但有时候内核版本跨度太大(比如从 5.4 升到 5.15),DKMS 重编译也可能失败。这时你需要检查 /var/lib/dkms/rtw89/ 目录下的 build 日志,看看编译失败的具体原因,一般是内核 API 变化导致,等待驱动仓库更新即可。

另外还有一个小技巧:在 Ubuntu 的 unattended-upgrades(自动安全更新)配置里,可以排除内核更新包,避免系统半夜自动升级内核导致驱动失效。这个配置在 /etc/apt/apt.conf.d/50unattended-upgrades 里,找到 Package-Blacklist 部分,加上:

"linux-image-*"; "linux-headers-*"; "linux-modules-*";

这样内核更新不会被自动执行,想升级时手动操作,可以更好地控制驱动兼容性。

6.3 备份自己的"离线驱动部署包"

既然已经安装成功,建议留一个备份。把 U 盘里的 debs 目录和驱动源码再打一个包,存到本地磁盘的某个目录里,标注好日期、内核版本、驱动版本。以后如果再遇到另一台同型号网卡的机器,或者系统需要重装,直接照着这个流程走一遍就能快速恢复。

我在实际工作里就吃过亏:装完一台机器后没留备份,过了几个月系统崩了重装,又遇到同样的驱动问题,但当时已经忘了当初具体下载了哪个仓库的哪个 commit,重新折腾了好几个小时。后来我把离线部署包固定放在 /srv/offline-packages/ 目录,并且写了一键安装脚本,从那以后再也没在这个问题上浪费时间。

结尾:说点实际感受

折腾 Linux 无线网卡驱动这个事情,很多新手容易陷入一个误区,就是盲目试各种教程里的命令,结果越试越乱。我的体会是,任何驱动安装类的问题,都要先花时间把"硬件 ID - 驱动模块 - 固件文件 - 内核配置"这条链路看清楚,知道当前卡在哪一环,再去针对性解决。尤其是离线环境,准备工作做得越细,踩的坑就越少。

最后再分享一个小技巧:如果你以后看到内核日志里报 firmware 加载失败,但又不知道固件文件应该叫什么名字,可以使用这个命令:

modinfo /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtw89/rtw89_pci.ko

modinfo 输出的信息里通常会列出固件文件名。比如 fw: rtw89/rtw8852be_fw.bin,这个就是你需要放到 /lib/firmware/rtw89/ 目录里的文件名。很多驱动源码的 README 里没写清楚固件文件名,用这个方法一查就清楚了。准备离线包之前先查询一遍,就能把固件一次性准备好,避免到了目标机器上才发现缺文件的尴尬。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 14:23:05

Flutter图标颜色在鸿蒙系统的适配方案

1. 项目背景与核心挑战在跨平台开发领域,Flutter框架因其高效的渲染性能和丰富的组件库而广受欢迎。而鸿蒙系统作为新兴的操作系统平台,其设计理念和实现机制与传统Android/iOS存在显著差异。当开发者尝试将现有Flutter应用迁移到鸿蒙平台时,…

作者头像 李华
网站建设 2026/9/21 14:19:27

Mirror网络库自定义生成函数实战指南

1. Mirror网络库自定义生成函数深度解析在多人联机游戏开发中,对象生成与销毁是最基础也最关键的环节之一。Mirror作为Unity的高性能网络库,默认提供了简单的预制体实例化机制,但在实际项目中,我们往往需要更精细的控制——比如对…

作者头像 李华
网站建设 2026/9/21 14:08:54

VibeCoding 做历史粘贴板,Claude Code 的模型通道走 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/21 14:04:18

SSM框架实现健身房数字化管理系统设计与优化

1. 项目概述:当健身房遇上数字化管理去年帮本地一家中型健身房改造会员系统时,我深刻体会到传统纸质登记表的痛点——教练排课冲突、会员预约信息丢失、打卡记录混乱等问题频发。这个基于SSM框架的健身房管理系统,正是为了解决这些行业普遍存…

作者头像 李华