Ubuntu 20.04 离线安装 Realtek b852 网卡驱动实战指南
1. 为什么离线装网卡驱动是个绕不开的坎如果你正在一台没有有线网络、也没有其他可用无线网卡的机器上折腾 Ubuntu 20.04恰好手里这块 Realtek b852 又没被内核自带驱动认出来那你大概率已经体会过那种“装系统五分钟配网络两小时”的窒息感。lspci能看到设备ip link里却只有loiwconfig直接告诉你“no wireless extensions”这种局面下在线apt install是奢望dkms自动编译也是空谈因为你连最基本的build-essential和内核头文件都还没装。这篇内容就是冲着这个场景来的。我会把 Realtek b852 在 Ubuntu 20.04 下的离线安装流程拆成可复现的步骤重点讲清楚三件事驱动源码从哪来、依赖包怎么在没有网络的情况下凑齐、编译安装过程中那些文档里不会写的坑怎么绕。适合手里有另一台能上网的机器、一个 U 盘以及一台“干净”Ubuntu 20.04 目标机的朋友。整个过程不需要目标机联网所有依赖都通过离线包解决。提示Realtek b852 这个型号在不同批次里可能对应不同的芯片方案常见的是 RTL8821CE、RTL8822BE 或 RTL8852BE 的变体。动手前先用lspci -nn | grep -i realtek确认 PCI ID再决定下载哪套源码否则编译出来的模块可能加载不上。我踩过的第一个坑就是没确认芯片型号直接拿了一份 RTL8821CE 的驱动往 b852 上怼make能过insmod也成功但dmesg里全是 firmware 加载失败网卡死活不亮。后来用lspci -nn看到10ec:b852这个 ID才定位到应该用 rtw89 系列驱动。所以别急着下源码先确认硬件身份这一步能省掉后面至少两个小时的无效折腾。2. 离线安装的整体思路与依赖闭环设计2.1 为什么不能直接拷贝 .ko 文件很多人第一反应是既然目标机不能编译那我在一台能上网的机器上编译好.ko文件直接拷过去insmod不就行了理论上可行实际上几乎必然失败。原因在于 Linux 内核模块和内核版本是强绑定的vermagic字段里包含内核版本号、SMP 标志、预empt 标志等信息两台机器的内核版本只要差一个小版本模块就拒绝加载。更麻烦的是Ubuntu 20.04 默认的 GA 内核是 5.4但如果你装过 HWE 内核版本可能跑到 5.15这时候模块的vermagic完全对不上。所以正确的思路是在目标机上现场编译。目标机缺的不是编译器本身而是编译所需的依赖包和内核头文件。我们要做的就是把这两样东西离线搬过去。2.2 依赖闭环的三个组成部分整个离线方案由三块拼成驱动源码、编译工具链、内核头文件。驱动源码从 Realtek 官方或社区维护的 GitHub 仓库获取编译工具链主要是build-essential、gcc、make、dkms这几个包内核头文件则是linux-headers-$(uname -r)。这三块缺一不可而且版本必须和目标机内核严格对应。我一般会在一台同版本 Ubuntu 20.04 的联网机器上执行apt-get install --download-only来抓包这样能保证依赖关系自动解析完整。具体命令后面会展开。这里先记住一个原则下载依赖的机器和目标机的 Ubuntu 版本、内核版本要一致否则linux-headers的版本号会对不上。2.3 方案选型dkms 还是手动编译Ubuntu 下装第三方网卡驱动有两条路一条是dkms一条是手动make make install。dkms的好处是内核升级后会自动重新编译模块省心坏处是离线环境下dkms本身也要装而且它依赖dkms包和一堆 Perl 模块离线解决起来更麻烦。手动编译的好处是依赖少只要build-essential和linux-headers就够坏处是每次内核升级都得重新来一遍。我的建议是如果目标机内核不打算频繁升级手动编译足够如果后续会apt upgrade内核那还是把dkms的离线包一起准备好。下面两套流程我都会给出来你可以按需选择。3. 驱动源码与依赖包的离线获取实操3.1 确认目标机内核版本和芯片 ID在目标机上执行两条命令把输出记下来uname -r lspci -nn | grep -i realtek第一条给出内核版本比如5.4.0-150-generic后面下载linux-headers时必须严格匹配这个字符串。第二条给出 PCI ID比如10ec:b852用来确定驱动源码分支。注意如果lspci输出里显示的是Network controller而不是Ethernet controller说明系统至少认出了这是一块网络设备只是没有可用驱动。如果连lspci都看不到那可能是硬件接触问题或 BIOS 里禁用了无线模块先排查硬件再谈驱动。3.2 在联网机器上下载依赖包找一台同样跑 Ubuntu 20.04 的机器内核版本最好和目标机一致。如果版本不一致至少保证大版本相同都是 5.4 系列然后手动指定linux-headers的版本号。执行mkdir -p ~/offline-pkgs cd ~/offline-pkgs apt-get install --download-only -o Dir::Cache::archives$PWD \ build-essential dkms linux-headers-$(uname -r) \ linux-headers-$(uname -r)-generic如果你在联网机器上跑的内核版本和目标机不同就把$(uname -r)替换成目标机的版本号比如5.4.0-150-generic。apt-get会自动把依赖树里的所有.deb包下载到当前目录。下载完成后用ls *.deb | wc -l看一下包的数量通常build-essential加上头文件会拉下来三四十个包包括gcc、g、make、libc6-dev、dpkg-dev等等。这些包的总大小大概在 200MB 到 300MB 之间一个 U 盘绰绰有余。3.3 获取 Realtek b852 驱动源码Realtek 官方对 Linux 驱动的维护比较分散b852 对应的驱动通常在rtw89这个主线驱动里或者 Realtek 自己维护的rtl8852be仓库里。我一般从以下两个来源取内核主线rtw89驱动如果目标机内核是 5.15 以上主线内核已经包含rtw89但 5.4 内核没有需要单独编译。Realtek 官方 GitHub 仓库搜索rtl8852be或rtw89找到对应 b852 的分支。下载源码压缩包后解压到 U 盘里和目标机的依赖包放在一起。源码目录结构通常是这样的rtw89/ ├── Makefile ├── core/ ├── pci/ ├── phy/ ├── mac/ └── ...提示下载源码时注意看仓库的 README有些分支只支持特定内核版本范围。比如某些rtl8852be分支明确写了“支持 5.4 到 5.15”如果你的内核是 5.4.0-150那就在支持范围内如果内核是 5.19可能就需要换分支或者打补丁。3.4 制作离线安装 U 盘把~/offline-pkgs目录和驱动源码目录一起拷贝到 U 盘。U 盘格式用ext4或exfat都行但exfat在 Ubuntu 20.04 上可能需要额外装exfat-fuse所以更稳妥的做法是用ext4。拷贝完成后在 U 盘根目录建一个install.sh脚本把后面的安装步骤写进去这样在目标机上插上 U 盘就能一键跑。4. 目标机上的编译安装全流程4.1 挂载 U 盘并安装依赖包目标机上插入 U 盘先确认设备名lsblk假设 U 盘是/dev/sdb1挂载到/mntsudo mkdir -p /mnt/usb sudo mount /dev/sdb1 /mnt/usb然后进入包目录用dpkg批量安装cd /mnt/usb/offline-pkgs sudo dpkg -i *.deb如果dpkg报依赖错误用apt-get -f install尝试修复但离线环境下这个命令可能因为找不到源而失败。更可靠的做法是提前在联网机器上用apt-get install --download-only把依赖树抓全这样dpkg -i *.deb基本不会报错。注意dpkg -i安装顺序有时会影响结果如果遇到某个包提示“依赖未满足”可以先把所有包用dpkg -i --force-depends *.deb强制装一遍再回头用dpkg -i *.deb补一遍通常就能理顺。4.2 验证编译环境是否就绪装完依赖后检查几个关键命令是否存在gcc --version make --version ls /usr/src/linux-headers-$(uname -r)如果gcc和make都能输出版本号/usr/src下也有对应内核版本的头文件目录说明编译环境已经齐了。这时候可以试着编译一个最简单的内核模块来验证比如cd /tmp echo obj-m : test.o Makefile echo #include linux/module.h MODULE_LICENSE(GPL); test.c make -C /lib/modules/$(uname -r)/build M$PWD modules如果这一步能生成test.ko说明工具链和头文件完全匹配可以进入驱动编译环节。如果报错多半是linux-headers版本不对回头检查uname -r和/usr/src下的目录名是否一致。4.3 编译并安装 rtw89 驱动进入 U 盘里的驱动源码目录cd /mnt/usb/rtw89 make clean make -j$(nproc)-j$(nproc)会按 CPU 核心数并行编译加快速度。编译过程中如果出现warning一般不用管只要最后生成了.ko文件就行。编译完成后执行sudo make install sudo modprobe rtw89_pci如果modprobe没有报错再用dmesg | tail -30看内核日志应该能看到 firmware 加载成功的消息。这时候ip link里应该多出一个wlan0或类似的接口。4.4 加载固件文件有些 Realtek 驱动需要额外的 firmware 文件这些文件不在源码包里需要单独放到/lib/firmware下。b852 常见的 firmware 文件名是rtw89/rtw8852b_fw.bin之类的。如果dmesg里出现firmware: failed to load的报错就去 Realtek 的 linux-firmware 仓库里找对应的.bin文件拷贝到/lib/firmware/rtw89/目录下然后重新modprobe。提示firmware 文件的版本要和驱动源码匹配不同版本的驱动可能要求不同版本的 firmware。如果加载失败先确认 firmware 文件名和路径是否正确再检查文件权限通常需要644权限。5. 常见问题排查与避坑经验5.1 编译时报“找不到内核头文件”这是最常见的问题报错信息通常是make: *** /lib/modules/5.4.0-150-generic/build: No such file or directory原因就是linux-headers-$(uname -r)没装或者版本不对。解决办法是在联网机器上重新下载对应版本的头文件包注意包名要完全匹配比如linux-headers-5.4.0-150-generic_5.4.0-150.167_amd64.deb。下载后拷到目标机dpkg -i安装再确认/lib/modules/$(uname -r)/build这个软链接指向正确的头文件目录。5.2 模块加载后网卡不亮modprobe成功但ip link里没有无线接口或者接口存在但iwconfig显示“no wireless extensions”通常是 firmware 没加载或者驱动和硬件不匹配。排查顺序dmesg | grep -i rtw89看有没有 firmware 加载失败的记录。lsmod | grep rtw89确认模块是否真的加载了。lspci -k看内核给这个 PCI 设备绑定了哪个驱动。如果lspci -k显示Kernel driver in use: rtw89_pci但接口还是不亮那多半是 firmware 问题。如果显示Kernel driver in use: none说明驱动没绑定上可能是 PCI ID 不在驱动的支持列表里需要手动在源码里添加设备 ID。5.3 内核升级后驱动失效手动编译的驱动在apt upgrade内核后会失效因为新内核的vermagic变了旧模块加载不上。解决办法有两个一是每次内核升级后重新编译安装驱动二是改用dkms方案让dkms自动处理。如果选dkms需要把驱动源码放到/usr/src/rtw89-1.0/下然后执行sudo dkms add -m rtw89 -v 1.0 sudo dkms build -m rtw89 -v 1.0 sudo dkms install -m rtw89 -v 1.0这样内核升级时dkms会自动重新编译省去手动操作的麻烦。5.4 常见问题速查表问题现象可能原因解决方向make报找不到 build 目录内核头文件未装或版本不匹配下载对应版本linux-headers离线包安装modprobe报 Unknown symbol驱动与内核版本不兼容换驱动分支或打补丁适配内核dmesg报 firmware 加载失败firmware 文件缺失或路径错误拷贝对应.bin到/lib/firmware/rtw89/ip link无 wlan 接口驱动未绑定 PCI 设备检查lspci -k必要时手动添加设备 ID内核升级后网卡消失模块 vermagic 不匹配重新编译或改用 dkms6. 几个让离线安装更顺手的实操心得第一个心得是关于依赖包下载的。apt-get install --download-only默认会把包放到/var/cache/apt/archives/用-o Dir::Cache::archives$PWD可以改到当前目录但有时候apt-get会忽略这个参数尤其是当包已经在缓存里的时候。更稳妥的做法是先用apt-get clean清空缓存再执行下载命令这样能保证所有包都落到指定目录。第二个心得是关于 U 盘文件系统的。如果你用exfat格式的 U 盘Ubuntu 20.04 默认可能不认需要先装exfat-fuse和exfat-utils。但这两个包本身也要离线安装就陷入死循环了。所以最省事的办法是用ext4格式化 U 盘Linux 下读写都没问题Windows 下虽然不认但你是给 Ubuntu 用的不影响。第三个心得是关于驱动源码的版本选择。Realtek 的 GitHub 仓库分支很多有些分支是给特定内核版本用的选错了编译能过但运行不稳定。我一般会优先选仓库里 star 最多、最近有更新的分支然后看 README 里写的支持内核范围。如果 README 没写就去 issues 里搜一下有没有人报类似内核版本的兼容性问题。第四个心得是关于modprobe之后的等待时间。有些 Realtek 网卡加载 firmware 需要几秒钟modprobe返回成功不代表网卡已经就绪。我习惯modprobe之后sleep 5再用ip link检查接口。如果接口出现了但状态是DOWN用sudo ip link set wlan0 up手动拉起然后iwlist wlan0 scan看能不能扫到信号。第五个心得是关于 Secure Boot 的。如果目标机开了 Secure Boot未签名的内核模块会被拒绝加载dmesg里会报module verification failed。解决办法要么在 BIOS 里关掉 Secure Boot要么给模块签名。离线环境下签名比较麻烦需要mokutil和openssl配合所以最简单的做法还是关掉 Secure Boot。7. 驱动装好之后还能做点什么网卡驱动装好、wlan0能扫到信号之后如果你还想让这台机器在后续内核升级时不用重复折腾可以把驱动源码和dkms配置一起打包写一个自动重编译的脚本放到/etc/kernel/postinst.d/下。这样每次内核更新后脚本会自动触发dkms重新编译模块。脚本内容大概是这样#!/bin/bash dkms status | grep rtw89 | while read line; do module$(echo $line | cut -d, -f1 | cut -d/ -f1) version$(echo $line | cut -d, -f1 | cut -d/ -f2) dkms build -m $module -v $version dkms install -m $module -v $version done放到/etc/kernel/postinst.d/zz-rtw89-rebuild并加上可执行权限内核升级后就会自动跑。这个脚本我实测在 Ubuntu 20.04 上跑过几次内核小版本升级都能正常重编译省了不少手动操作。另外如果你手里不止一台机器要装这个驱动可以把整个离线包做成一个自解压的tar.gz里面包含依赖包、驱动源码和安装脚本插上 U 盘执行一个命令就能全自动完成。我给自己实验室的几台机器就是这么干的一次制作多次复用比每次手动敲命令快得多。

相关新闻

如何从零写一个 ARIS 技能:SKILL.md 规范与集成契约完整参考

如何从零写一个 ARIS 技能:SKILL.md 规范与集成契约完整参考

如何从零写一个 ARIS 技能:SKILL.md 规范与集成契约完整参考 【免费下载链接】Auto-claude-code-research-in-sleep ARIS ⚔️ (Auto-Research-In-Sleep) — Lightweight Markdown-only skills for autonomous ML research: cross-model review loops, idea discove…

2026/9/21 16:14:16 阅读更多 →
naive-ui Dialog 对话框:函数式 API 与组件式用法的完整指南

naive-ui Dialog 对话框:函数式 API 与组件式用法的完整指南

naive-ui Dialog 对话框:函数式 API 与组件式用法的完整指南 【免费下载链接】naive-ui A Vue 3 Component Library. Fairly Complete. Theme Customizable. Uses TypeScript. Fast. 项目地址: https://gitcode.com/gh_mirrors/na/naive-ui naive-ui 的 Dial…

2026/9/21 16:14:16 阅读更多 →
C++类型系统与IO优化实战指南

C++类型系统与IO优化实战指南

1. 从C到C的类型系统演进在C语言中,类型系统相对简单直接,主要依赖基本数据类型和指针操作。这种设计虽然高效,但也带来了不少潜在风险。记得我刚接触C语言时,经常因为类型不匹配导致难以调试的内存错误。比如下面这个典型例子&am…

2026/9/21 16:13:16 阅读更多 →

最新新闻

Django框架核心优势与开发实践指南

Django框架核心优势与开发实践指南

1. Django框架概述与核心优势Django作为Python生态中最成熟的Web框架之一,已经服务了从个人博客到Instagram等大型应用的开发。我第一次接触Django是在2013年一个电商项目里,当时就被它"开箱即用"的特性所震撼。这个框架最吸引我的地方在于它完…

2026/9/21 16:34:32 阅读更多 →
Pandas进行pivot_table数据透视

Pandas进行pivot_table数据透视

在数据分析领域中,处理和理解复杂的数据是十分重要的一环。Pandas库中的pivot_table函数提供了一个强大且灵活的工具,能够将数据重新组织并根据需要进行汇总。通过数据透视,能快速提取数据的关键信息,帮助分析师在海量数据中发现趋势和模式。本文将深入讲解如何利用Pandas的…

2026/9/21 16:34:32 阅读更多 →
OpenIM Server 源码级解析:开源即时通讯服务的架构、模块与部署实践

OpenIM Server 源码级解析:开源即时通讯服务的架构、模块与部署实践

OpenIM Server 源码级解析:开源即时通讯服务的架构、模块与部署实践 【免费下载链接】open-im-server IM Chat OpenClaw 项目地址: https://gitcode.com/gh_mirrors/op/open-im-server OpenIM 是一套专为开发者设计的开源即时通讯解决方案,由 Ope…

2026/9/21 16:33:32 阅读更多 →
GeeORM 第五天:为 ORM 框架实现 Hook 钩子机制(BeforeInsert / AfterQuery / BeforeUpdate / AfterDelete 等 8 个扩展点)

GeeORM 第五天:为 ORM 框架实现 Hook 钩子机制(BeforeInsert / AfterQuery / BeforeUpdate / AfterDelete 等 8 个扩展点)

GeeORM 第五天:为 ORM 框架实现 Hook 钩子机制(BeforeInsert / AfterQuery / BeforeUpdate / AfterDelete 等 8 个扩展点) 【免费下载链接】7days-golang 7 days golang programs from scratch (web framework Gee, distributed cache GeeCac…

2026/9/21 16:33:32 阅读更多 →
【热力学】基于FEM的二维热传导与对流边界附Matlab代码和报告

【热力学】基于FEM的二维热传导与对流边界附Matlab代码和报告

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、算法改进、程序设计科研仿真。🍎 往期回顾关注个人主页:完整代码获取 定制创新 论文复现私信🍊个人信条:做科研&#xff0c…

2026/9/21 16:33:32 阅读更多 →
如何 3 条命令快速上手 Auto-claude-code-research-in-sleep(ARIS):从安装到跑通第一个科研工作流

如何 3 条命令快速上手 Auto-claude-code-research-in-sleep(ARIS):从安装到跑通第一个科研工作流

如何 3 条命令快速上手 Auto-claude-code-research-in-sleep(ARIS):从安装到跑通第一个科研工作流 【免费下载链接】Auto-claude-code-research-in-sleep ARIS ⚔️ (Auto-Research-In-Sleep) — Lightweight Markdown-only skills for auton…

2026/9/21 16:33:31 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →