ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Ubuntu 20.04蓝牙失效?MT7922网卡修复指南:升级内核+更新固件

Ubuntu 20.04蓝牙失效?MT7922网卡修复指南:升级内核+更新固件 先说结论省得你浪费时间MT7922 在 Ubuntu 20.04 下蓝牙打不开90% 是三个原因——内核版本太旧、linux-firmware 里缺固件、蓝牙服务被 rfkill 锁死。这篇文章把排查思路、命令、以及我踩过的坑完整写出来按步骤走基本能解决。先说下我的环境笔记本是 AMD 平台网卡是联发科 MT7922也就是很多机器上显示的 RZ616系统 Ubuntu 20.04.5 LTS。症状很典型设置里蓝牙开关是灰的点不动rfkill list能看到蓝牙被 hard blockdmesg里报 firmware 加载失败。这个问题的根源在于 MT7922 这个网卡太新而 Ubuntu 20.04 默认的内核版本是 5.4/5.8对它的支持几乎为零。所以整个修复思路就是两件事升级内核让内核能识别并驱动这个设备更新固件让驱动能真正把蓝牙模块跑起来。这篇文章适合谁看刚在笔记本上装完 Ubuntu 20.04、蓝牙怎么都打不开的朋友以及被 MT7922/MT7921/MT7920 这些联发科网卡折腾过的人。我不会只丢一堆命令让你复制粘贴而是把每一条命令的作用、每一步操作背后的原因都讲明白这样你遇到类似问题也能自己排查。1. 先搞清楚 MT7922 在 Ubuntu 20.04 里到底卡在哪1.1 症状全览这些表现你都遇见过哪种MT7922 蓝牙出问题不同机器、不同内核版本表现还不太一样。我把最常见的几种症状列出来你对照一下自己属于哪种方便后面精准定位。第一种蓝牙设置里开关是灰色完全点不了。这是最常见的表现打开系统设置里的蓝牙选项开关是灰的或者干脆没有。这时候你用rfkill list看大概率能看到蓝牙设备处在 hard blocked 或 soft blocked 状态。第二种输入dmesg | grep -i bluetooth能看到一堆报错常见的包括Direct firmware load for mediatek/mt7922_dual_bl.bin failed with error -2或者mt7921e: probe failed with error -110。这里最典型的就是 firmware 加载失败说明系统里根本没有对应的固件文件。第三种蓝牙模块能被识别lsusb或者lspci里能看到设备hciconfig -a也能看到 hci0 接口但用它连接任何设备都会失败或者连接上了过几秒就断开。第四种奇葩一点的蓝牙和设备都正常但每次重启之后就间歇性失效这次能用下次不能用找不出规律。这四种我都实际遇到过而且往往不是单一原因是内核太旧和固件缺失叠加在一起导致的。所以接下来的排查思路不是只解决某一种症状而是把所有可能出问题的环节都过一遍。1.2 为什么偏偏是 Ubuntu 20.04 出问题这事得从 MT7922 这个芯片的出身说起。MT7922 是联发科的 Wi-Fi 6E 网卡很多笔记本厂商采购回去之后重新贴牌叫 RZ616 或 RZ608。它刚量产是 2021 年前后真正大规模铺货是 2022 年。而 Ubuntu 20.04 是 2020 年发布的默认内核是 5.4 或者升级后的 5.8。你想想一个 2020 年的内核怎么可能对 2022 年才大量出现的芯片有完善支持说白了Ubuntu 20.04 的内核里虽然已经有了 mt76 驱动框架和 mt7921e/mt7922e 驱动模块的身影但那时候还是早期版本bug 多、功能不全对 mt7922 的支持更是半成品状态。而且 Linux 驱动这个东西很多时候不是内核里有了驱动模块就能用还得有配套的 firmware 固件文件。内核驱动只是个翻译官真正让硬件跑起来的是固件这个干活的手。Ubuntu 20.04 自带的 linux-firmware 包版本太老里面根本没有 mt7922 需要的固件文件。所以问题的根源很清晰内核太旧 固件缺失。两个问题叠加蓝牙自然打不开。相比之下Ubuntu 22.04 甚至 23.04 就很少遇到这个问题因为新系统默认内核版本高linux-firmware 包也新。但有些人可能因为工作环境、软件兼容性必须留在 20.04那这篇文章就是给你准备的。2. 一句话看懂蓝牙驱动链路内核、固件、蓝牙栈各管什么2.1 驱动加载链路到底是怎么回事很多人在网上搜MT7922 驱动下载以为像 Windows 一样下载个 exe 装一下就行。Linux 完全不是这个思路。在 Linux 里驱动模块、固件、蓝牙协议栈是三层各干各的活任何一层出问题都会导致最终蓝牙不可用。第一层是内核驱动模块。MT7922 对应的是mt7921ePCIe 接口这个模块它负责和硬件通信告诉内核我这个设备支持哪些能力。你可以用modinfo mt7921e查看这个模块的信息能看到它的版本、依赖项、参数等。内核版本越新这个模块对 mt7922 的支持越完善。第二层是固件文件。驱动模块本身不做具体计算它需要把一段微程序加载到蓝牙芯片里这段微程序就是固件。MT7922 的蓝牙固件文件放在/lib/firmware/mediatek/目录下关键文件叫mt7922_dual_bl.bin。这个文件不在驱动模块就算加载成功了蓝牙芯片也跑不起来。第三层是蓝牙协议栈。Ubuntu 用的是 BlueZ它是 Linux 的官方蓝牙协议栈。它负责处理 HCI 接口、配对、音频传输等上层逻辑。你运行bluetoothctl、hciconfig这些命令实际上都是和 BlueZ 打交道。如果前两层没问题BlueZ 一般也能正常工作。这三层的关系可以用一个生活化类比来理解驱动模块是快递员固件是货品本身蓝牙协议栈是收货签收的仓库管理员。快递员来了发现货品没到固件缺失仓库管理员自然签不了收最终你的蓝牙就用不了。2.2 固件文件才是大头没有它驱动等于空壳为什么说固件才是大头因为很多人在排查这个问题时看到内核模块已经加载了就以为驱动没问题转向排查蓝牙服务、设置项这些表面因素。但实际上MT7922 的驱动模块mt7921e在非常老的内核里也存在它并不是完全不支持这个芯片问题出在固件加载这一步。你可以在终端里执行sudo dmesg | grep -i mt7921 | grep -i firmware如果看到类似Direct firmware load for mediatek/mt7922_dual_bl.bin failed with error -2的提示那就说明内核模块已经尝试加载固件但系统里根本找不到这个文件。固件文件缺失的情况下蓝牙芯片得不到执行指令整个设备就像一块没有软件的硬件——空有电路板干不了活。MT7922 需要用到的固件文件不止一个。通常在/lib/firmware/mediatek/目录下需要存在这些文件mt7922_dual_bl.bin mt7922_wo.bin mt7922_a.bin mt7922_all_in_one.bin mt7922.bin不同内核版本对应的固件文件路径可能略有不同。比如有些版本会在mediatek/mt7922/子目录下找固件有些直接在mediatek/下找。这就涉及到内核版本和固件版本的匹配问题后面细说。3. 逐步实测从确认硬件到蓝牙恢复的完整流程3.1 动手前先确认你的网卡真的是 MT7922 吗这个问题听起来蠢但真的坑过不少人。很多笔记本的网卡型号在系统里显示的不是 MT7922而是 RZ616、RZ608 这些 OEM 贴牌型号。甚至有人的机器是 Intel 网卡因为硬件故障被卖家换成了联发科自己不不知道。在终端里执行下面的命令确认你的网卡到底是谁家产的lspci -nn | grep -Ei network|wireless|bluetooth输出结果类似这样02:00.0 Network controller [0280]: MEDIATEK Corp. MT7922 802.11ax PCI Express Wireless Network Adapter [14c3:0616]或者有的机器显示02:00.0 Network controller [0280]: Device [14c3:0616]看到14c3:0616这个 ID 基本就是 MT7922 了。14c3是联发科的 PCI Vendor ID0616是 MT7922 的设备 ID。如果显示14c3:7961那是 MT7921解题思路类似固件文件略有不同。另外一个更直观的方法是看蓝牙接口lsusbMT7922 的蓝牙走的是 USB 接口你会在输出里看到一个 MediaTek 的无线网卡通常显示为Bus 001 Device 002: ID 0e8d:0616 MediaTek, Inc. Wireless_Device如果看到ID 0e8d:0616或0e8d:7922那基本实锤了。这里有个容易迷惑的地方蓝牙设备往往在一个单独的 USB Bus 上面而 Wi-Fi 走 PCIe这正好体现了 MT7922 这个芯片的混合架构——Wi-Fi 走 PCIe蓝牙走 USB。这也解释了为什么蓝牙出了问题但 Wi-Fi 一切正常因为两者虽然共用同一个芯片但连接主机的通道和驱动程序是分开的。3.2 三步走方案升级内核、更新固件、加载模块确认了设备是 MT7922 之后接下来就是正式动手解决。我推荐按照这个顺序来升级内核 → 更新固件 → 重启加载。不要反过来。先说为什么要先升级内核。MT7922 的内核驱动模块mt7921e在后期的内核版本里才逐渐成熟特别是对蓝牙的支持。Ubuntu 20.04 默认的 5.4 内核里连mt7921e模块都找不到或者即使有也是旧版根本无法正确初始化设备。升级内核能确保驱动模块本身是新的能正确处理 mt7922 的硬件特性。再说为什么更新固件。仅升级内核还不行内核版本高不代表固件就新。Ubuntu 的 linux-firmware 包更新节奏比较保守即使你的系统已经升级到了 5.15 内核自带的 linux-firmware 版本还是可能缺少 mt7922 固件。所以必须单独从 linux-firmware 仓库拉取最新固件文件。最后是加载模块和重启。升级内核和更新固件之后最好重启一次系统让内核、驱动、固件在干净的启动流程里完成加载。有些人懒得重启用modprobe -r mt7921e modprobe mt7921e重载模块但实测下来不如重启干净因为蓝牙还有一堆服务依赖和 USB 设备重新枚举。3.3 实操完整命令走一遍第一步升级内核到 5.15 LTSUbuntu 20.04 可以通过 HWEHardware Enablement仓库直接升级到 5.15 内核这样所有驱动模块都跟着升级而且不会像用主线内核那样搞乱系统依赖。执行sudo apt update sudo apt install --install-recommends linux-generic-hwe-20.04装完之后确认一下内核版本uname -r正常情况下你会看到5.15.0-xx-generic。如果你的机器比较新也可以考虑安装 5.19 HWE 内核不过 5.15 是 LTS 长期支持版本稳定性和兼容性更好我推荐先用 5.15不够再升级 5.19。这里有个细节值得说下HWE 内核包是批量安装的它会自动处理依赖关系比如linux-image-generic-hwe-20.04、linux-headers-generic-hwe-20.04等。它会和系统原本的 5.4 内核共存启动时你可以在 GRUB 里选择用哪个。这是 Ubuntu 官方设计好的升级路径比你自己去 kernel.ubuntu.com 下载 deb 包要安全得多。第二步更新 linux-firmware这一步踩坑的人最多。直接apt install linux-firmware在 20.04 上经常得不到最新固件。最可靠的方式是从官方仓库拉取git clone --depth 1 https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git cd linux-firmware sudo cp -r mediatek /lib/firmware/如果你那边访问 git.kernel.org 比较慢也可以用 GitHub 的镜像仓库git clone --depth 1 https://github.com/wkennington/linux-firmware.git不过这个镜像更新可能不及时我更推荐直接用 Linux 内核官方的 linux-firmware 仓库。复制mediatek目录过去之后最好再确认一下关键固件文件是否到位ls -lh /lib/firmware/mediatek/mt7922*正常情况下你应该看到-rw-r--r-- 1 root root 1.7M ... mt7922_dual_bl.bin -rw-r--r-- 1 root root 1.4M ... mt7922_wo.bin -rw-r--r-- 1 root root 2.0M ... mt7922_a.bin -rw-r--r-- 1 root root 2.3M ... mt7922_all_in_one.bin -rw-r--r-- 1 root root 2.3M ... mt7922.bin注意不同版本的固件仓库文件列表会有差异有些版本只有mt7922_dual_bl.bin和mt7922_wo.bin这也没关系关键是mt7922_dual_bl.bin必须在。它是 MT7922 蓝牙启动时第一个要加载的固件。这里我想强调一个很多人容易忽略的点不要直接删除原来的 mediatek 固件目录再拷贝最好是先备份再覆盖sudo cp -r /lib/firmware/mediatek /lib/firmware/mediatek.bak sudo cp -r mediatek /lib/firmware/这样万一新固件有兼容性问题可以快速回滚。而且新固件文件里有些配置文件格式变了旧的内核可能不认覆盖安装后如果有问题回滚方案就能派上用场。第三步清理蓝牙相关模块缓存并重启在重启之前先把内核模块的依赖关系缓存刷新一下sudo depmod -a sudo update-initramfs -udepmod -a会重新生成模块依赖关系让新内核和固件文件的对应关系正确。update-initramfs -u会更新 initramfs 镜像确保启动时能加载到需要的模块和固件。然后执行sudo reboot第四步重启后验证 Bluetooth 是否恢复重启之后不要急着开系统设置里的蓝牙开关先去终端确认底层是否正常rfkill list如果蓝牙设备状态不再是 hard blocked说明硬件层面已经正常了。然后systemctl status bluetooth如果蓝牙服务正在运行再测试 HCI 接口是否注册成功hciconfig -a能看到 hci0 信息说明驱动加载成功了。最后可以用bluetoothctl做一些简单的配对测试bluetoothctl power on scan on如果能看到周围的蓝牙设备并及时响应说明问题已经解决。3.4 验证蓝牙彻底可用后再做这几件事到这一步你的蓝牙应该能用了但我建议你再做几件事确保长期稳定。第一件事确认稳定重启后的自启状态。连续重启两三次每次开机都检查一次蓝牙是否正常工作。因为有些机器的蓝牙控制器和 Wi-Fi 共用射频前端存在互相抢占的问题偶尔会出现某一次开机蓝牙设备随机掉线需要重新加载模块。这个我有一次折腾了整整半天才确定是硬件冲突不是软件问题。第二件事升级内核后验证 Wi-Fi 是否依然正常。升级 HWE 内核后Wi-Fi 驱动模块也会换新版本大部分情况下没问题但也有小概率出现 Wi-Fi 慢、丢包的情况。如果真遇到了多半是新的 mt7921e 驱动默认开启了某些省电特性导致的可以用以下命令关闭sudo modprobe -r mt7921e sudo modprobe mt7921e disable_aspm1如果有效就把它写入/etc/modprobe.d/mt7921e.conf永久生效echo options mt7921e disable_aspm1 | sudo tee /etc/modprobe.d/mt7921e.conf当然如果你的 Wi-Fi 正常就别动它ASPM 的disable_aspm1参数会略微增加功耗没必要为了用不上的特性牺牲续航。第三件事测试耳机和音频文件传输。蓝牙能连上不等于体验没问题。建议你连一下蓝牙耳机播放几分钟音频确认 A2DP 音频协议工作正常。再用蓝牙传几个大文件毕竟蓝牙音频和文件传输走的是不同 profile问题往往藏在这种边角场景里。4. 升级内核和更新固件这件事不能瞎搞4.1 内核版本怎么选不是越新越好MT7922 在 Linux 内核里的驱动支持有一个演进过程我可以给你梳理一下不同版本的情况内核版本蓝牙驱动支持情况推荐度5.4几乎没有 mt7921e 完整支持需要手动补丁不推荐5.8开始有 mt7921e 模块但固件缺失且 bug 多谨慎使用5.11支持有所改善但蓝牙功能仍不完善不推荐主力使用5.15驱动成熟配合新固件基本完美首选5.19最稳新特性完整但非 LTS推荐但有取舍6.x主线内核支持非常好依赖具体发行版支持所以对你来说5.15 HWE 内核是性价比最高的选择。它是 LTS 版本长期维护Ubuntu 官方会持续提供安全补丁同时它对 MT7922 的支持已经足够成熟。有些教程建议直接上 6.x 主线内核我不建议这么干。原因有三点第一6.x 主线内核不在 Ubuntu 官方仓库里你需要从 kernel.ubuntu.com 手动下载 deb 包这意味着你失去了系统的自动安全更新第二6.x 内核发布节奏快个别版本对某些网卡有回归 bug你需要赌运气第三升级主线内核后如果有第三方模块比如 DKMS 驱动的 VirtualBox、NVIDIA 驱动和新内核不兼容你会非常痛苦。4.2 固件不是装一次就完事的东西很多人以为更新一次固件就万事大吉了其实不是。linux-firmware 仓库更新很勤快联发科也会根据实测反馈不断调整 mt7922 的固件版本。如果你的机器在使用过程中出现蓝牙断连、音质卡顿等问题先别急着怀疑硬件故障去 linux-firmware 仓库看看有没有新固件发布。一个可行的操作是每隔一两个月重新同步一次 linux-firmware 仓库然后覆盖拷贝mediatek目录到/lib/firmware/。覆盖之后不用立刻重启基础固件更新会在下次重启时生效cd linux-firmware git pull sudo cp -r mediatek /lib/firmware/但是这里有个坑我必须提醒你不要随随便便把整个 linux-firmware 仓库目录全量覆盖到/lib/firmware/。因为 linux-firmware 仓库里有大量其他厂商的固件文件某些文件可能和 Ubuntu 当前内核版本存在兼容性差异全量覆盖容易引入新的问题。我一般只拷贝mediatek这个子目录这样就只更新了目标芯片的固件风险最小。另外一个容易踩的坑是权限问题。拷贝固件文件过去之后最好确认一下文件属主和权限sudo chown root:root /lib/firmware/mediatek/* sudo chmod 644 /lib/firmware/mediatek/*如果权限不对比如出现了-rw-r--r-- 1 user user的情况内核在加载固件时会因为无法读取文件而失败。这个问题在从 Git 仓库手动拷贝文件时特别容易遇到。4.3 升级内核前别忘备份这不是吓唬你升级内核听起来简单但如果你这台 Ubuntu 上有重要的开发环境、数据库或其他服务升级内核之前最好做一次系统快照或者备份关键数据。特别是如果你用的是 LVM 文件系统可以在升级前做一个 LVM 快照万一新内核启动不了还能快速回退到旧内核。GRUB 里内核是共存的所以如果升级后出现问题手动重启在 GRUB 菜单里选Advanced options for Ubuntu就能看到旧内核的启动项切回去就行。所以实际风险没有想象中那么大但备份一份总归安心。5. 常见问题与排查技巧实录5.1 问题速查表这一部分我把自己折腾过程中遇到的问题整理成了表格方便你直接对照。现象可能原因解决方向rfkill list显示蓝牙 hard blocked笔记本物理开关或 BIOS 设置检查键盘上的飞行模式快捷键、BIOS 里 Wireless 开关dmesg报Direct firmware load for mediatek/mt7922_dual_bl.bin failed固件文件缺失或路径不对更新 linux-firmware确认/lib/firmware/mediatek/mt7922_dual_bl.bin存在蓝牙能开启但扫描不到任何设备蓝牙模块没进入可发现模式或射频被电源管理关闭执行bluetoothctl power onbluetoothctl scan on必要时调整电源管理策略能配对成功但连接失败BlueZ 版本太旧或 profile 不匹配更新 BlueZ或检查设备支持的蓝牙协议版本开机蓝牙随机失效重启后恢复硬件初始化时序问题或 RF 冲突更新内核和固件或尝试关闭 Wi-Fi 的 ASPM 功能蓝牙连接后声音卡顿断断续续蓝牙模式下 Wi-Fi 干扰或者电源管理频繁切换关闭 Wi-Fi 的省电模式或更换蓝牙音频传输模式这张表是个抛砖引玉实际遇到问题还得结合自己的dmesg日志和journalctl -u bluetooth日志判断。5.2 几个隐藏很深的坑这里分享几个我实际踩过、网上也不太好搜到的坑希望你能避开。第一个坑是mt7922_dual_bl.bin存在但仍然报加载失败。这种问题通常发生在新旧固件混装的场景比如你的系统里mediatek目录是新的但内核模块是旧的两者版本不匹配。旧内核驱动加载固件的路径可能是mediatek/mt7922/mt7922_dual_bl.bin而不是mediatek/mt7922_dual_bl.bin。解决方案是确认内核版本然后让固件文件同时存在于两个路径下或者干脆升级内核到 5.15 以上保持一致性。第二个坑是升级完内核后蓝牙好了但 Wi-Fi 的 5GHz 频段连不上了。MT7922 是 Wi-Fi 6E 芯片蓝牙和 Wi-Fi 共用天线和射频在某种模式下会有频段协调问题特别是蓝牙开启时占用 2.4GHz 频段会影响 Wi-Fi 的 2.4G 连接。正常来说驱动会自动协调但新内核 新固件配老环境的组合下偶尔会出问题。遇到这个情况试试把蓝牙的省电模式关掉sudo hciconfig hci0 lp none sudo hciconfig hci0 lm master这条命令把蓝牙的链路策略改成 master能缓解一部分 Wi-Fi 和蓝牙共存干扰的问题。实测下来对联想小新、华硕无畏系列的机器效果明显。第三个坑是 BIOS 里有一个 Wireless LAN 的开关有些厂商默认会把蓝牙和 Wi-Fi 分开控制但有的则是合在一起。如果你的rfkill list显示蓝牙硬件被 blocked但你的电脑又没有物理的无线开关那十有八九是 BIOS 里把蓝牙单独禁用了。进 BIOS 看看 Wireless、Bluetooth 相关选项改成 Enabled这一步能解决一大批硬件没问题但硬锁的情况。第四个坑比较隐蔽部分机器在系统挂起再唤醒之后蓝牙会彻底消失lsusb里也看不到设备。这是 USB 设备掉线的问题因为 MT7922 的蓝牙走 USB 通道挂起时 USB 控制器可能会把它断开。解决办法是把蓝牙设备从系统挂起时自动断电的名单里剔除。可以创建一个 systemd 服务来处理这个问题但这个操作较复杂如果你遇到再具体研究。大部分情况下升级到 5.15 内核后这个问题会自动解决因为新内核的 USB 电源管理对这类问题有明显改善。5.3 一句忠告先看日志再动手别瞎试我在网上看到很多人遇到蓝牙问题第一反应就是重装驱动、装第三方工具、改一堆配置。其实遇见 Linux 硬件问题最忌讳的就是盲目操作。Linux 的优势在于几乎所有问题都会在日志里留下线索dmesg、journalctl就是你的排查利器。遇到问题第一件事就是执行sudo dmesg -T | grep -Ei bluetooth|mt7921|mt7922|firmware sudo journalctl -u bluetooth --since 5 minutes ago看输出再判断下一步。固件文件缺失就更新固件模块加载失败就换内核硬件被锁就去查 BIOS。这样能少走很多弯路。我在实际解决过的类似问题里有一半以上都是固件缺失或者路径不对剩下的要么是 BIOS 设置要么是内核版本过旧。只要路径正确、版本匹配MT7922 的蓝牙在 Ubuntu 20.04 上完全可以正常工作而且稳定性并不差。6. 一些零散的实操心得最后分享几个零散但实用的心得给准备动手折腾的朋友做个参考。第一升级 HWE 内核之后如果蓝牙问题解决了但你对系统稳定性有顾虑可以观察一段时间再决定是否保留。HWE 内核会跟着 Ubuntu 20.04 的硬件支持更新持续获取补丁稳定性通常是有保障的。第二MT7922 这个网卡在 Linux 下的社区支持其实已经很不错了驱动和固件更新都很及时。不像某些小众芯片几年都没人维护。所以遇到问题不用慌大概率是配置层面的问题而不是硬件问题。第三如果你手上正好有支持蓝牙的 USB 设备比如蓝牙耳机、蓝牙鼠标修好之后务必挨个测试一遍。蓝牙耳机主要看 A2DP 音频是否流畅蓝牙鼠标要注意会不会休眠后断连。每个设备走的是不同 profile有的问题要用了才知道。第四如果你以后升级到 Ubuntu 22.04会发现 MT7922 的支持几乎是开箱即用的因为新系统自带的 5.15 内核和新版 linux-firmware 已覆盖这个芯片。如果你不是必须在 20.04完全可以直接装新系统少折腾很多。最后再说一个我的习惯每次调整完内核或固件我都会在终端里敲一遍sudo dmesg把关键信息存一份留着以后对比。这个习惯帮我在后续几次驱动更新后快速定位了回归问题。Linux 排障这种事经验和日志积累得越多处理起来越快。希望这篇文档能让你少走点弯路少熬几个夜。
返回列表