Ubuntu 20.04 离线安装 Realtek b852 网卡驱动实战指南

发布时间:2026/9/21 16:14:33
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 盘执行一个命令就能全自动完成。我给自己实验室的几台机器就是这么干的一次制作多次复用比每次手动敲命令快得多。