ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Ubuntu 20.04 蓝牙打不开?MT7922 内核与固件排查全指南

Ubuntu 20.04 蓝牙打不开?MT7922 内核与固件排查全指南 1. 问题初现UI 开关像坏了蓝牙图标一直灰着很多人在 Ubuntu 20.04 上遇到蓝牙问题时第一反应是“设置里的开关坏了”或者“蓝牙服务崩了”。我最初也是这样笔记本装好系统打开右上角状态栏蓝牙图标是灰的点设置里的蓝牙开关打开之后过两秒又自动弹回去像被什么东西强制按下来一样。更奇怪的是WiFi 完全正常网速飞快但蓝牙就是死活不亮。这个组合其实非常典型无线网卡型号是 MT7922联发科 WiFi 6E 蓝牙 5.2 二合一芯片系统是 Ubuntu 20.04而且不是个例很多笔记本比如某些搭载 RZ616 网卡的型号都栽在这上面。MT7922 在 Windows 下有官方驱动但在 Ubuntu 20.04 上默认内核 5.4 实在太老既不带完整的驱动模块linux-firmware 里也没有对应的固件文件于是蓝牙部分直接“失联”甚至连rfkill都看不到蓝牙设备。这篇文章我会完整记录我自己的排查思路和解决过程从确认硬件、看日志、装固件、换内核到最终正常使用。如果你是 Ubuntu 20.04 MT7922 或者类似 MT7921/MT7921e 网卡的用户直接照着做就行。不想折腾内核的我也会给出一条相对稳的捷径愿意多花一点时间完全搞懂的建议从头到尾看一遍。2. 先别急着装驱动三个命令确认问题出在哪2.1 看清楚网卡到底以什么形态存在MT7922 有 USB 和 PCIe 两种硬件形态笔记本里常见的是 PCIe 接口部分迷你主机用的是 USB 形态。第一步一定要确认硬件能被系统识别不然后面全是白忙。终端执行lspci -nnk | grep -i network lsusb我这边输出能看到类似03:00.0 Network controller [0280]: MEDIATEK Corp. MT7922 [RZ616] [14c3:0616]如果你的是 USB 形态lsusb里会出现ID 0e8d:7922 MediaTek Inc.之类的条目。只要硬件被识别了说明问题大概率不是硬件损坏而是系统层的驱动或固件没就位。接着确认当前内核版本uname -rUbuntu 20.04 刚装好时大部分镜像默认内核是5.4.0-xxx-generic部分后期镜像可能是5.15.0-xxx-generic。MT7922 正式进 mainline 内核支持的版本线大约在 5.12 之后Ubuntu 官方 HWE 内核到 5.13/5.15 才算稳定支持。所以如果uname -r输出的是 5.4 或 5.8那基本可以断定不是驱动模块加载失败而是内核里压根就没有能正确驱动这颗芯片的代码。2.2 日志里写满了原因dmesg 和 rfkill 怎么看确认硬件存在后接下来把内核日志翻出来。这步非常关键能直接告诉你到底是固件缺失、模块冲突还是单纯的 rfkill 屏蔽。dmesg | grep -i -E bluetooth|mt792|firmware rfkill list systemctl status bluetooth --no-pager我这次排查时dmesg输出里出现了几类很有代表性的信息第一类找不到固件文件mt7921e 0000:03:00.0: Direct firmware load for mediatek/mt7922_fw.bin failed with error -2 mt7921e 0000:03:00.0: Falling back to sysfs fallback for: mediatek/mt7922_fw.bin firmware: failed to load mediatek/mt7922_fw.bin第二类蓝牙底层命令超时Bluetooth: hci0: command 0xfc05 tx timeout Bluetooth: hci0: Reading local version information failed第三类rfkill list里只有 WiFi完全没有蓝牙设备0: hci0: Bluetooth Soft blocked: no Hard blocked: yes如果你看到Hard blocked: yes那很可能是笔记本的物理开关或 Fn 快捷键把蓝牙关了这种不是驱动问题按一下FnF系列键不同品牌键位不一样就能解决。但如果你和我一样rfkill list里压根没有蓝牙或者蓝牙显示hci0但下面紧跟超时日志那就是驱动/固件层面的问题了。注意Hard blocked: yes通常是 BIOS 或硬件开关层面的问题和驱动无关。遇到这个先别折腾软件去查笔记本的飞行模式快捷键。2.3 判断结论缺固件还是缺驱动根据日志可以做一个快速分流现象结论处理方向dmesg找不到mt7922_*.bin固件文件缺失安装 linux-firmware 或手动放固件dmesg显示Direct firmware load failed且命令超时固件与内核版本不匹配升级内核 同步升级固件rfkill list完全没有蓝牙模块未加载或内核太旧升级内核加载mt7921e模块蓝牙存在但bluetoothctl里No default controller availablebluez 服务或 dbus 配置问题重装/重启 bluez我属于第二、三种混合旧内核里mt7921e模块加载是加载了但固件找不到hci 初始化直接失败。这种情况你单纯重启bluetooth.service一百遍也没用必须从驱动和固件层解决。3. MT7922 为什么在 Ubuntu 20.04 上这么难搞3.1 芯片身份与 Linux 驱动的对应关系很多人在搜索时会把 MT7922 和mt7921e搞混。这里有一个 Linux 内核命名的历史原因MT7922 在 Linux 的mt76驱动栈里和 MT7921 共用了同一个驱动模块mt7921e内核通过读取芯片的 PCI ID比如14c3:0616来区分具体型号再加载对应的固件。所以你在lsmod | grep mt792里看到的只有mt7921e这并不代表它驱动的是 MT7921MT7922 在 Linux 下就是挂在mt7921e名下的。固件方面MT7922 对应的文件路径是/lib/firmware/mediatek/mt7922_fw.bin、mt7922_rom_patch.bin、mt7922_rom_patch_mcu.bin等。注意不要和/lib/firmware/mediatek/mt7921_*.bin搞混两者文件不通用混着放会导致加载异常。3.2 Ubuntu 20.04 默认内核到底缺了什么Ubuntu 20.04 是 2020 年 4 月发布的默认内核 5.4。而 MT7922 这颗芯片是 2021 年底到 2022 年才大规模出现在市场上的Linux 内核正式合入对应驱动和固件支持的时间更晚。可以这么理解Ubuntu 20.04 的默认系统镜像“出生”时这颗网卡还不存在当然不可能原生支持。很多朋友会想那我单独编译一个驱动模块不就行了说实话不推荐。因为 MT7922 的驱动依赖内核的mac80211和bluetooth子系统接口旧内核的 API 和现在差别很大把新版驱动源码往老内核上编译大概率是报一堆错就算强行打补丁编过了蓝牙部分的 hci 初始化也很容易超时。与其花时间逆向折腾不如直接把内核升上去让官方支持来接管。3.3 驱动、固件、bluez 的配合逻辑简单梳理一下蓝牙启动的链路内核检测到 PCIe 设备加载mt7921e模块驱动读取芯片 ROM 信息向/lib/firmware/mediatek/请求固件固件加载成功芯片进入工作状态内核创建hci0蓝牙设备bluez 的bluetooth.service通过 dbus 与hci0交互暴露给上层图形界面这条链路上任何一步断了你看到的都是“蓝牙打不开”。最普遍的断点是第 2 步——固件缺失。而第 2 步解决后又可能暴露第 1 步的问题——内核太老模块本身无法正常驱动这颗芯片。所以我一贯的建议是先升内核到受支持的版本再确认固件存在最后再看 bluez 服务状态。顺序不要反过来否则容易做无用功。4. 实操记录从换内核到蓝牙正常亮起4.1 第一步备份当前状态留好退路升级内核前该记录的记录下来防止出问题之后回不到原来状态。uname -r kernel_before.txt lspci -nnk | grep -i network kernel_before.txt dpkg -l | grep linux-image kernel_before.txt如果你在 VMware、VirtualBox 或 PVE 里跑的虚拟机升级前最好打个快照。物理机也建议保持电源稳定尽量避免升级中途断电。4.2 第二步升级内核选稳妥路线Ubuntu 20.04 官方提供 HWEHardware Enablement内核可以直接通过 apt 安装最省事sudo apt update sudo apt install --install-recommends linux-generic-hwe-20.04这条命令会把内核升级到 5.15 系列的 HWE 版本对 MT7922 来说 5.15 已经足够好。我之前实测过 5.15.0-xx 系列内核下mt7921e驱动和蓝牙部分都工作正常。不用去追最新的 6.x mainline稳定才是王道。如果你因为别的依赖原因不能装 HWE也可以直接从 kernel.ubuntu.com 或 canonical 的 mainline 仓库下载linux-image-*.deb手动安装。但 mainline 内核不带 Ubuntu 特有的 patch一些笔记本的电源管理、音频可能会有小毛病所以能用 HWE 就先用 HWE。装完重启sudo reboot重启后先确认内核版本uname -r应该能看到5.15.0-xxx-generic。到这个节点硬件识别的环境已经改善了一大截但固件还不能保证完整。4.3 第三步搞定固件两条路可选新内核装好后dmesg起来可能依然会提示找不到mt7922_fw.bin因为 Ubuntu 20.04 的linux-firmware包相对旧不一定包含新芯片的固件。两条路一条是升级整个固件包另一条是手动拉取单独文件。升级固件包sudo apt update sudo apt install --install-recommends linux-firmwareUbuntu 20.04 的linux-firmware如果从 jammy 或 kinetic 仓库拉新版本依赖关系上可能会有问题。我更推荐第二种方式手动补齐 MT7922 固件git clone https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git sudo cp linux-firmware/mediatek/mt7922_* /lib/firmware/mediatek/复制完记得刷新固件缓存并加载模块sudo mkinitramfs -u sudo modprobe -r mt7921e sudo modprobe mt7921e注意如果你原来/lib/firmware/mediatek/下存在的是mt7921_*.bin不要直接删掉因为某些 WiFi 功能可能需要它。只需要确保mt7922_*存在即可。4.4 第四步启动服务、解除屏蔽、验证结果固件和内核都到位后接下来按顺序操作sudo systemctl enable bluetooth sudo systemctl restart bluetooth sudo rfkill unblock all然后看设备rfkill list dmesg | grep -i -E bluetooth|mt792|hci bluetoothctl正常情况下rfkill list里会出现蓝牙控制器bluetoothctl进交互界面后执行scan on能扫到附近的手机、耳机等设备。我实测下来从升级内核到蓝牙可用全程不到二十分钟期间唯一一个额外的坑是bluetoothctl提示No default controller available这个一般是服务启动时序问题重启一次bluetooth.service或者把用户的 dbus 会话重启一下就好了sudo systemctl restart dbus sudo systemctl restart bluetooth4.5 如果还是不行手动确认模块加载状态打开蓝牙开关还是失败的话可能是模块没有自动加载。手动执行sudo modprobe mt7921e如果提示modprobe: ERROR: could not insert mt7921e: No such device那说明内核和硬件 ID 的匹配有问题可能你需要的是旧固件或不同分支驱动如果提示Operation not permitted大概率是 Secure Boot 拦住了未签名内核模块。这种情况在 Ubuntu 上比较常见最简单的办法是在 BIOS 里关闭 Secure Boot或者用mokutil给模块签名。如果提示的是Resource temporarily unavailable则是 rfkill 问题执行rfkill unblock all后再试。5. 重启后蓝牙依然打不开这些坑我都替你踩过了5.1 hci0 命令超时别急着怀疑硬件蓝牙设备在rfkill里出现了但dmesg一直刷Bluetooth: hci0: command 0xfc05 tx timeout Bluetooth: hci0: Reading local version information failed0xfc05 是 Vendor 命令用于读取芯片信息这类超时通常说明固件状态不对。我的解决顺序是确认mt7922_fw.bin和mt7922_rom_patch.bin都存在于/lib/firmware/mediatek/检查固件版本是否和内核匹配新固件配旧内核也可能超时可以尝试使用稍微老一点的稳定内核比如5.15.0-76-generic而不是最新的5.15.0-91-generic有一种情况是 Linux 内核自带的mt7921e驱动升级后对固件做了新的 API 校验老的固件文件不再兼容导致命令超时。如果 apt 已经升过内核但linux-firmware没升就手动拉取最新固件再试一次。反过来如果内核升到 6.x 之后出现超时也可以退到 5.15 系列很多 6.x 的蓝牙问题反而是回归 bug。5.2 能扫描但是连不上耳机/音箱这个现象比较隐蔽蓝牙开关能打开bluetoothctl也能扫到设备但是配对失败或配对成功后立即断开。我在 MT7922 上遇到过几次原因集中在笔记本和耳机之间隔了 USB 3.0 设备产生 2.4G 干扰蓝牙和 WiFi 同时工作时的天线共存问题针对干扰问题可以通过模块参数关闭 ASPM 节能sudo tee /etc/modprobe.d/mt7921e.conf options mt7921e disable_aspm1 sudo modprobe -r mt7921e sudo modprobe mt7921e关闭 ASPM 后我实测蓝牙连接稳定性有明显提升。代价是 WiFi 的功耗会稍微大一点点但对台式机和插电使用的场景来说几乎无感。如果你更在意续航可以只在连接蓝牙音频设备时临时启用这个参数。5.3 升级内核后 WiFi 反而挂了这是很多人不敢升级内核的原因。其实大多数情况下升级 HWE 内核后 WiFi 挂掉不是因为内核本身而是因为linux-firmware里的 WiFi 固件版本和内核自带的mt7921e驱动不匹配。解决思路很简单把/lib/firmware/mediatek/下的mt7921_*和mt7922_*固件都同步到官方仓库最新版。cd linux-firmware # 前面 git clone 过的目录 sudo cp -r mediatek /lib/firmware/ sudo mkinitramfs -u sudo reboot如果你原来用的内核是 5.15WiFi 正常蓝牙不正常那就只复制mt7922_*不要动mt7921_*。反过来如果蓝牙正常但 WiFi 弱那就检查mt7921_*是否被误删了。5.4 双系统用户Windows 配对记录带来的怪问题如果你装了 Windows Ubuntu 双系统在 Windows 里配对过的蓝牙鼠标/耳机在 Ubuntu 里经常出现“能发现、能配对、就是连不上”的怪现象。这往往和蓝牙地址BD Address不一致有关Windows 和 Linux 对部分网卡可能会生成不同的蓝牙地址导致外设记住了旧地址。我的处理方法是先在 Ubuntu 里把设备的 pairing 记录清掉再在外设端删除旧配对记录重新配对。bluetoothctl remove 设备MAC地址 scan on # 找到后 pair、trust、connect5.5 问题排查速查表症状最可能原因快速解决办法设置里蓝牙开关闪烁后自动关闭固件缺失安装mt7922_*固件rfkill list无蓝牙设备内核太旧升级 HWE 内核到 5.15dmesg报command tx timeout固件/内核不匹配同步升级 linux-firmware 或换 5.15 内核蓝牙能开但扫不到设备模块未挂载或 rfkill 屏蔽modprobe mt7921erfkill unblock all连上后频繁断连ASPM 节能问题options mt7921e disable_aspm1提示No default controllerbluez 服务未拉起systemctl restart bluetoothmodprobe报 Operation not permittedSecure Boot 拦截关闭 Secure Boot 或签名模块6. 一点个人体会先看日志再动手少走一半弯路回到最开始的问题为什么 UI 上的蓝牙开关像坏了一样我后来才意识到它其实是被内核层的不稳定状态拖累的。系统设置里的开关只是bluetoothctl的一个图形化前端底层hci0设备初始化失败开关自然怎么打都打不开。这种情况去重装bluez、改bluetooth.conf都是徒劳。真正的问题在更底层必须从dmesg和lsmod里找答案。我个人在处理这类设备支持问题时养成了一套固定的动作先uname -r再lspci -nnk然后dmesg | grep -i firmware最后才决定动什么。这套动作帮我避开过很多“明明按照网上的教程配置了但就是不生效”的陷阱。因为很多时候网上的教程是基于新系统写的而你手里的 Ubuntu 20.04 却被老内核和旧固件卡住了。如果你现在正被 MT7922 的蓝牙问题折磨我的建议是不要上来就编驱动先把 HWE 内核装上再把 MT7922 固件补齐90% 的问题能在这一步解决。剩下 10% 的问题用dmesg里的报错关键字去搜绝对比你盲目尝试各种工具高效得多。最后再分享一个小技巧如果你在 VMware 里装 Ubuntu 20.04 只是为了测试物理机又是 MT7922那还是建议真机操作虚拟机内网卡透传对蓝牙这类需要 USB/PCIe 直通的设备支持并不好容易误判驱动问题。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进