Linux 多用户环境下 AirPods 已连接但没有声音排查与修复
一台 Ubuntu 双系统主机上,AirPods 可以完成蓝牙配对,也能显示为已连接,但 GNOME 的声音输出列表里没有 AirPods,应用音频仍然只能输出到板载声卡或 HDMI。这是 Linux 多用户音频服务抢占了蓝牙音频 profile。
蓝牙层看起来正常:
bluetoothctl devices Connected
能看到 AirPods 已连接:
Device AA:BB:CC:DD:EE:FF AirPods Pro
设备详情也显示已配对、已信任、已连接,并且包含音频相关 UUID:
Paired: yes
Trusted: yes
Connected: yes
UUID: Audio Sink
UUID: Handsfree
但 PipeWire 里没有对应的蓝牙音频设备:
wpctl status
只看到本机声卡输出,看不到类似下面的条目:
AirPods Pro [bluez5]
真正根因:多个用户的 WirePlumber 抢占 BlueZ 蓝牙音频 profile
Ubuntu 24.04 默认使用 PipeWire 和 WirePlumber 管理音频。蓝牙音频由 WirePlumber 向 BlueZ 注册 A2DP/HFP profile。
问题在于:
- BlueZ 是系统级服务
- 蓝牙音频 profile 是全系统资源
- WirePlumber 是用户级服务
- 多个登录用户可以各自启动自己的 WirePlumber
如果这台机器除了桌面用户外,还有 SSH 用户、VS Code Remote 用户或残留登录会话,它们也可能启动自己的:
pipewire
pipewire-pulse
wireplumber
于是多个用户的 WirePlumber 会同时尝试向 BlueZ 注册蓝牙音频 profile。谁先注册成功,谁就占住资源。桌面用户如果没有抢到,就会出现:
RegisterProfile() failed: org.bluez.Error.NotPermitted
WirePlumber 日志里还可能看到:
Multiple sound server instances are probably trying to use Bluetooth audio at the same time
这时蓝牙连接本身是正常的,但桌面用户的 PipeWire 无法创建 AirPods 的音频 sink,所以声音设置里没有该设备。
诊断步骤
1. 确认蓝牙层是否正常
bluetoothctl info AA:BB:CC:DD:EE:FF
重点看:
Paired: yes
Trusted: yes
Connected: yes
UUID: Audio Sink
如果这些都存在,说明蓝牙配对和连接层基本正常。
2. 确认 PipeWire 是否生成蓝牙输出
wpctl status
正常情况下应该看到:
Audio
├─ Devices:
│ AirPods Pro [bluez5]
├─ Sinks:
│ * AirPods Pro
如果蓝牙已连接但这里没有 AirPods,问题通常在音频 profile 注册或 PipeWire/WirePlumber。
3. 查看 WirePlumber 日志
journalctl --user -u wireplumber -n 120 --no-pager
如果看到:
RegisterProfile() failed: org.bluez.Error.NotPermitted
或者:
Multiple sound server instances are probably trying to use Bluetooth audio at the same time
基本可以确认是多用户音频服务抢占。
4. 查看是否有其他用户的音频服务
ps -ef | grep -Ei "wireplumber|pipewire|pipewire-pulse|pulseaudio|bluealsa"
问题场景中可能会看到类似:
desktop-user ... /usr/bin/wireplumber
ssh-user-a ... /usr/bin/wireplumber
ssh-user-b ... /usr/bin/wireplumber
还可以查看登录会话:
loginctl list-users
loginctl list-sessions
如果只有一个桌面用户,却有多个 SSH 用户的 WirePlumber 正在运行,就很可能是根因。
临时修复
先终止非桌面用户的残留会话,释放 BlueZ profile:
sudo loginctl terminate-user ssh-user-a
sudo loginctl terminate-user ssh-user-b
然后重启桌面用户的音频栈:
systemctl --user restart wireplumber pipewire-pulse pipewire
重新连接 AirPods:
bluetoothctl connect AA:BB:CC:DD:EE:FF
再确认输出设备:
wpctl status
成功后应能看到:
AirPods Pro [bluez5]
* AirPods Pro
长期修复
如果这台机器又有桌面用户,又有 SSH 或 VS Code Remote 使用,那么建议不要让 SSH 用户启动 WirePlumber。
可以对非桌面用户禁用用户级 WirePlumber:
sudo -u ssh-user-a XDG_RUNTIME_DIR=/run/user/1002 systemctl --user mask --now wireplumber.service
sudo -u ssh-user-b XDG_RUNTIME_DIR=/run/user/1003 systemctl --user mask --now wireplumber.service
如果对应用户没有正在登录,可能需要等该用户登录后执行,或者由管理员在用户级 systemd 配置中做持久化处理。
核心原则是:让唯一的桌面用户运行 WirePlumber,并由它负责注册蓝牙音频 profile。不要让多个 SSH 用户的 WirePlumber 同时尝试管理 BlueZ 蓝牙音频。

浙公网安备 33010602011771号