一、问题背景我的电脑安装 Ubuntu 20.04 后可以正常进入桌面但是右上角完全没有 WiFi 选项。打开系统设置后也看不到无线网络。电脑的无线网卡是 Realtek RTL8852CEPCI 设备编号为10ec:c852系统环境如下系统Ubuntu 20.04 内核5.15.0-67-generic 电脑联想笔记本 无线网卡Realtek RTL8852CE PCI ID10ec:c852最后通过以下方式解决临时使用手机 USB 网络共享安装编译工具和当前内核头文件编译rtw89驱动补充rtw8852c_fw.bin固件解决最新版驱动与 5.15 内核的error -22兼容问题切换到兼容提交6dc944重新编译、安装并重启WiFi 成功出现。本文记录完整过程。二、先检查无线网卡状态打开终端执行nmcli device status我最开始看到的是DEVICE TYPE STATE CONNECTION enp4s0 ethernet 不可用 -- lo loopback 未托管 --正常情况下应该有一项wlo1 wifi 已断开 --但是这里完全没有wifi说明不是单纯没有连接 WiFi而是系统根本没有创建无线网卡接口。三、查看无线网卡型号执行lspci -nnk | grep -iA3 -E network|wireless|ethernet输出中包含03:00.0 Network controller [0280]: Realtek Semiconductor Co., Ltd. Device [10ec:c852] (rev 01) DeviceName: Realtek Subsystem: Lenovo Device [17aa:5852]其中10ec:c852对应 Realtek RTL8852CE 无线网卡。有线网卡输出类似RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller Kernel driver in use: r8169这说明有线网卡驱动是正常的只是当时没有插网线。四、检查无线网卡是否处于 UNCLAIMED执行sudo lshw -C network无线网卡显示*-network UNCLAIMEDUNCLAIMED表示Ubuntu 能识别到这个 PCI 硬件但是没有驱动成功接管它所以 NetworkManager 无法创建 WiFi 接口。五、检查 WiFi 是否被禁用执行rfkill list all我的输出中无线网卡是Soft blocked: no Hard blocked: no说明没有被软件禁用没有被物理开关禁用不是飞行模式问题真正问题是驱动没有加载。如果显示Soft blocked: yes可以执行sudo rfkill unblock wifi然后重新检查rfkill list all六、先解决临时联网问题因为后面需要下载源码、编译工具和固件所以必须先让 Ubuntu 临时联网。可以使用以下任意一种方式方法一手机 USB 网络共享使用数据线连接手机和电脑手机打开“USB 网络共享”Ubuntu 一般会自动识别为有线网络。执行nmcli device status如果看到usb0 ethernet 已连接说明 USB 网络共享成功。方法二插网线将普通网线连接到电脑网口 ↔ 路由器 LAN 口然后执行nmcli device status测试网络ping -c 3 baidu.com七、安装编译环境先更新软件源sudo apt update安装 Git、编译工具、内核头文件、固件包和下载工具sudo apt install -y git build-essential linux-headers-$(uname -r) linux-firmware wget检查当前内核uname -r我的内核是5.15.0-67-generic确认内核头文件存在ls /usr/src | grep $(uname -r)八、下载并编译 rtw89 驱动进入用户主目录cd ~下载驱动源码git clone https://github.com/lwfinger/rtw89.git进入源码目录cd ~/rtw89开始编译make -j$(nproc)其中$(nproc)表示自动使用电脑的 CPU 核心数进行并行编译。编译过程中可能看到Skipping BTF generation ... due to unavailability of vmlinux这通常不是错误可以忽略。也可能看到warning: the compiler differs from the one used to build the kernel如果 GCC 大版本一致例如都是 GCC 9.4.0一般也不是致命问题。只要最后没有出现error并成功生成rtw_8852ce.ko rtw_8852c.ko rtw89pci.ko rtw89core.ko就说明编译成功。九、安装驱动执行sudo make install如果成功会看到Install rtw89 SUCCESS复制联想电脑的兼容配置sudo cp 70-rtw89.conf /etc/modprobe.d/更新内核模块依赖sudo depmod -a尝试加载驱动sudo modprobe rtw_8852ce注意正确的模块名是rtw_8852ce不是rtw89_8852ce如果写成sudo modprobe rtw89_8852ce可能会报错Module rtw89_8852ce not found十、检查驱动模块是否加载执行lsmod | grep -E rtw_8852|rtw89我的输出中出现rtw_8852ce rtw_8852c rtw89pci rtw89core mac80211 cfg80211这说明模块文件已经加载进内核。但是执行nmcli device status仍然没有 WiFi。再执行lspci -nnk -s 03:00.0当时只显示Kernel modules: rtw_8852ce却没有Kernel driver in use这说明模块虽然存在但并没有成功接管无线网卡。十一、查看驱动初始化日志执行sudo dmesg | grep -iE rtw|8852|firmware|03:00.0 | tail -n 100第一次看到的关键错误是Direct firmware load for rtw89/rtw8852c_fw.bin failed with error -2 failed to early request firmware: -2 failed to wait firmware completion failed to setup chip information probe of 0000:03:00.0 failed with error -22其中最关键的是Direct firmware load for rtw89/rtw8852c_fw.bin failed with error -2error -2表示文件不存在。驱动需要的固件路径是/lib/firmware/rtw89/rtw8852c_fw.bin十二、下载缺少的 RTL8852C 固件创建固件目录sudo mkdir -p /lib/firmware/rtw89下载固件sudo wget -O /lib/firmware/rtw89/rtw8852c_fw.bin \ https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/rtw89/rtw8852c_fw.bin下载完成后检查ls -lh /lib/firmware/rtw89/rtw8852c_fw.bin我这里显示-rw-r--r-- 1 root root 1.5M /lib/firmware/rtw89/rtw8852c_fw.bin说明文件已经正确下载不是 0 字节。更新启动镜像sudo update-initramfs -u出现以下提示不是错误The initramfs will attempt to resume from ... Set the RESUME variable to override this.然后重启sudo reboot十三、补充固件后仍然没有 WiFi重启后再次执行nmcli device status仍然没有 WiFi。手动加载驱动sudo modprobe rtw_8852ce等待几秒sleep 3再次检查nmcli device status还是没有无线网卡。于是重新查看日志sudo dmesg | grep -iE rtw|8852|firmware|03:00.0 | tail -n 100这次日志已经变成loaded firmware rtw89/rtw8852c_fw.bin Firmware version 0.27.56.14 chip rfe_type is 1 failed to register hw failed to register core hw failed to register core probe of 0000:03:00.0 failed with error -22这说明固件已经加载成功无线芯片已经开始初始化但是当前版本驱动无法在 Ubuntu 20.04 的 5.15 内核上注册硬件问题从“缺少固件”变成了“驱动版本兼容问题”。十四、切换到兼容版本 6dc944对我的 Ubuntu 20.04、Linux 5.15 和 RTL8852CE 网卡最终有效的方法是切换到rtw89的兼容提交6dc944进入驱动源码目录cd ~/rtw89卸载当前安装的版本sudo make uninstall恢复源码目录git reset --hard切换到兼容版本git checkout 6dc944如果出现You are in detached HEAD state属于正常现象不是错误。确认当前版本git rev-parse --short HEAD正常应该显示6dc944或者以6dc944开头。十五、重新编译兼容版本清理之前的编译文件make clean重新编译make -j$(nproc)确认没有error后安装sudo make install成功时显示Install rtw89 SUCCESS重新复制联想兼容配置sudo cp 70-rtw89.conf /etc/modprobe.d/更新模块依赖sudo depmod -a更新启动镜像sudo update-initramfs -u最后重启sudo reboot十六、重启后验证重启后查看无线网卡驱动lspci -nnk -s 03:00.0成功时输出03:00.0 Network controller [0280]: Realtek Semiconductor Co., Ltd. Device [10ec:c852] (rev 01) DeviceName: Realtek Subsystem: Lenovo Device [17aa:5852] Kernel driver in use: rtw89_8852ce Kernel modules: rtw_8852ce最关键的是Kernel driver in use: rtw89_8852ce这说明驱动已经真正接管无线网卡。注意modprobe时模块名是rtw_8852celspci中驱动名称可能显示为rtw89_8852ce两者写法不同是正常的。再执行nmcli device status成功后输出类似DEVICE TYPE STATE CONNECTION usb0 ethernet 已连接 有线连接 2 wlo1 wifi 已断开 -- p2p-dev-wlo1 wifi-p2p 已断开 -- enp4s0 ethernet 不可用 -- lo loopback 未托管 --其中wlo1 wifi 已断开表示无线网卡已经正常识别只是还没有连接 WiFi。十七、扫描并连接 WiFi打开 WiFinmcli radio wifi on扫描附近的无线网络nmcli device wifi list连接 WiFinmcli device wifi connect WiFi名称 password WiFi密码例如nmcli device wifi connect TP-LINK_1234 password 12345678连接后检查nmcli device status正常应该显示wlo1 wifi 已连接 TP-LINK_1234测试网络ping -c 3 baidu.com也可以直接点击 Ubuntu 右上角网络图标连接。连接成功后即可关闭手机 USB 网络共享。十八、完整命令汇总下面是整个过程的命令汇总。1. 检查网卡nmcli device status lspci -nnk | grep -iA3 -E network|wireless|ethernet sudo lshw -C network rfkill list all2. 安装编译工具sudo apt update sudo apt install -y git build-essential linux-headers-$(uname -r) linux-firmware wget3. 下载并编译驱动cd ~ git clone https://github.com/lwfinger/rtw89.git cd ~/rtw89 make -j$(nproc) sudo make install sudo cp 70-rtw89.conf /etc/modprobe.d/ sudo depmod -a4. 加载驱动sudo modprobe rtw_8852ce5. 查看驱动日志lsmod | grep -E rtw_8852|rtw89 lspci -nnk -s 03:00.0 sudo dmesg | grep -iE rtw|8852|firmware|03:00.0 | tail -n 1006. 安装缺少的固件sudo mkdir -p /lib/firmware/rtw89 sudo wget -O /lib/firmware/rtw89/rtw8852c_fw.bin \ https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/rtw89/rtw8852c_fw.bin ls -lh /lib/firmware/rtw89/rtw8852c_fw.bin sudo update-initramfs -u sudo reboot7. 切换兼容版本cd ~/rtw89 sudo make uninstall git reset --hard git checkout 6dc944 git rev-parse --short HEAD make clean make -j$(nproc) sudo make install sudo cp 70-rtw89.conf /etc/modprobe.d/ sudo depmod -a sudo update-initramfs -u sudo reboot8. 验证和连接 WiFilspci -nnk -s 03:00.0 nmcli device status nmcli radio wifi on nmcli device wifi list nmcli device wifi connect WiFi名称 password WiFi密码十九、常见问题1.modprobe: Module rtw89_8852ce not found原因是模块名写错了。错误写法sudo modprobe rtw89_8852ce正确写法sudo modprobe rtw_8852ce2.Direct firmware load ... failed with error -2说明缺少/lib/firmware/rtw89/rtw8852c_fw.bin重新执行固件下载命令sudo mkdir -p /lib/firmware/rtw89 sudo wget -O /lib/firmware/rtw89/rtw8852c_fw.bin \ https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/rtw89/rtw8852c_fw.bin3.failed to register hw和error -22如果日志已经显示loaded firmware rtw89/rtw8852c_fw.bin但后面仍然显示failed to register hw probe ... failed with error -22说明固件已经正常问题是当前驱动版本和内核不兼容。对我的环境切换到下面的提交后解决git checkout 6dc9444.module verification failed可能看到module verification failed: signature and/or required key missing - tainting kernel这表示当前驱动是自己编译的外部模块没有 Ubuntu 内核的官方签名。如果模块仍能正常加载这条提示不一定影响使用。如果出现Key was rejected by service说明 Secure Boot 阻止了模块加载。检查 Secure Bootmokutil --sb-state可以进入 BIOS 关闭 Secure Boot或者对模块进行签名。5. 更新内核后 WiFi 又消失手动编译的驱动通常只安装在当前内核目录下。如果 Ubuntu 更新了内核例如从5.15.0-67-generic升级到其他版本可能需要重新编译。进入源码目录cd ~/rtw89重新编译安装make clean make -j$(nproc) sudo make install sudo depmod -a sudo update-initramfs -u sudo reboot在重新编译之前确保新内核头文件已安装sudo apt install linux-headers-$(uname -r)6.git clone提示目录已经存在如果之前已经下载过fatal: destination path rtw89 already exists不需要重新下载直接进入cd ~/rtw89二十、我的最终成功状态修复前*-network UNCLAIMED并且nmcli device status完全没有 WiFi。修复后Kernel driver in use: rtw89_8852ce同时wlo1 wifi 已断开这说明 RTL8852CE 已经被 Ubuntu 20.04 正常识别。整个问题实际上分成两层第一层缺少 rtw8852c_fw.bin 固件 第二层最新版 rtw89 与 Linux 5.15 存在兼容问题只有同时解决这两个问题WiFi 才能正常出现。二十一、总结Ubuntu 20.04 安装后没有 WiFi不能只看右上角有没有无线网络图标。建议按照以下顺序排查1. nmcli 检查是否存在 wifi 设备 2. lspci 查看无线网卡型号 3. lshw 检查是否为 UNCLAIMED 4. rfkill 排除飞行模式 5. 安装内核头文件和编译工具 6. 编译安装 rtw89 7. 用 dmesg 检查固件错误 8. 补充 rtw8852c_fw.bin 9. 如果出现 error -22切换兼容驱动版本 10. 重启后检查 Kernel driver in use对我的联想电脑、Ubuntu 20.04、Linux 5.15 和 RTL8852CE最终有效的关键步骤是安装固件 rtw8852c_fw.bin 切换 rtw89 提交 6dc944文章标签Ubuntu 20.04 Linux WiFi驱动 Realtek RTL8852CE rtw89 无线网卡 Ubuntu没有WiFi 联想电脑 Linux驱动