LinuxRuLinux без лишней теории
Bluetooth

Bluetooth в Linux: подключить наушники через bluetoothctl и настроить кодек

Редакция LinuxRu7 мин чтенияИнструкции

Если Bluetooth в Linux не работает, проверьте по порядку: видит ли ядро адаптер (dmesg), не заблокирован ли он в rfkill и запущена ли служба bluetooth. Дальше наушники подключаются через bluetoothctl командами pair, trust и connect, а кодек и профиль выбирает PipeWire, и его можно поменять вручную.

Bluetooth в Linux: подключить наушники через bluetoothctl и настроить кодек
Фото: www.digitalpush.net, CC BY 4.0, Wikimedia Commons
Содержание
  1. Как устроено
  2. Диагностика
  3. bluetoothctl
  4. Кодеки
  5. Микрофон и звук
  6. Настройки BlueZ
  7. Dual boot
  8. Частые вопросы

Из чего состоит Bluetooth в Linux

Когда Bluetooth не работает, полезно понимать, на каком этаже сломалось. Цепочка такая:

  1. Адаптер и драйвер ядра. Обычно модуль btusb плюс прошивка из пакета linux-firmware. Встроенные адаптеры Intel, Realtek и MediaTek в ноутбуках почти всегда висят на шине USB, даже если они на одной плате с Wi-Fi.
  2. rfkill. Программный или аппаратный выключатель радио. Режим "в самолёте" и функциональные клавиши ноутбука блокируют адаптер именно здесь.
  3. BlueZ и служба bluetooth. Официальный стек Bluetooth для Linux: сопряжение, профили, хранение ключей в /var/lib/bluetooth.
  4. PipeWire и WirePlumber. Для наушников и колонок звук идёт через звуковой сервер, он же выбирает кодек и профиль.
  5. Графический апплет в GNOME, KDE Plasma, Cinnamon или Blueman. Он лишь интерфейс к BlueZ.

Проверяем снизу вверх, и большинство проблем находятся за пару минут.

Bluetooth не работает: проверка адаптера, rfkill и службы

Сначала убедимся, что система вообще видит адаптер:

# виден ли контроллер на шине USB
lsusb | grep -i blue
# что сказал драйвер при загрузке
sudo dmesg | grep -i bluetooth
# заблокировано ли радио
rfkill list

В выводе rfkill list ищите строку Bluetooth. Soft blocked: yes снимается командой, Hard blocked: yes значит физический переключатель или клавиша Fn, тут команды не помогут.

sudo rfkill unblock bluetooth

Затем служба BlueZ:

systemctl status bluetooth
sudo systemctl enable --now bluetooth
journalctl -u bluetooth -b

Если пакет не установлен, в минимальных системах и Arch его ставят вручную:

# Debian, Ubuntu
sudo apt install bluez
# Fedora
sudo dnf install bluez
# Arch: bluetoothctl лежит в bluez-utils
sudo pacman -S bluez bluez-utils

Ошибка No default controller available

bluetoothctl запускается, но контроллера нет. Значит, BlueZ не получил адаптер от ядра. В dmesg часто видно причину: firmware file ... not found или failed to load. Обновите linux-firmware, для Realtek-адаптеров на старых ядрах помогает обновление ядра. Перезагрузить модуль без ребута можно так:

sudo modprobe -r btusb
sudo modprobe btusb

Адаптер на одной карте с Wi-Fi и прошивки к ним часто ломаются вместе. Если не работает и беспроводная сеть, начните со статьи про Wi-Fi в Linux, там подробно разобраны прошивки. Работа со службами через systemctl описана в отдельной инструкции.

bluetoothctl: сопряжение и подключение из терминала

bluetoothctl - консольный клиент BlueZ. Он работает везде, где есть BlueZ, и пишет понятные ошибки, которые графические апплеты прячут. Запускаем интерактивный режим и вводим команды по очереди:

bluetoothctl
power on
agent on
default-agent
scan on
# дождитесь строки вида [NEW] Device AA:BB:CC:DD:EE:FF WH-1000XM5
scan off
pair AA:BB:CC:DD:EE:FF
trust AA:BB:CC:DD:EE:FF
connect AA:BB:CC:DD:EE:FF
quit

Наушники перед поиском переведите в режим сопряжения, обычно долгим нажатием кнопки питания или отдельной кнопкой. Без этого они видны только тому устройству, с которым были связаны раньше.

Команда trust часто забывается, а именно она позволяет устройству подключаться самому, без ручного connect после каждой перезагрузки.

Полезные команды

bluetoothctl devices            # известные устройства
bluetoothctl info AA:BB:CC:DD:EE:FF   # статус, профили, заряд
bluetoothctl disconnect AA:BB:CC:DD:EE:FF
bluetoothctl remove AA:BB:CC:DD:EE:FF # забыть устройство

Ошибка Failed to connect: org.bluez.Error.Failed при успешном pair чаще всего значит, что сохранённые ключи разошлись. Лечение: remove на компьютере, "забыть устройство" или сброс на наушниках, затем сопряжение заново.

Наушники и кодеки в PipeWire: SBC, AAC, aptX, LDAC

Беспроводные наушники передают звук в одном из кодеков. Какой будет выбран, решают обе стороны: наушники должны его поддерживать, а PipeWire должен быть собран с ним.

КодекПрофильКачествоКомментарий
SBCA2DPсреднееесть у всех наушников, запасной вариант
AACA2DPхорошееосновной у AirPods и многих моделей
aptX, aptX HDA2DPхорошеенаушники с чипами Qualcomm
LDACA2DPвысокоеSony и другие, капризен к помехам
CVSD, mSBCHSP/HFPнизкоегарнитура: работает микрофон
LC3LE Audioхорошееновые наушники и адаптеры, поддержка ещё созревает

В Ubuntu 26.04 и Debian модули кодеков для PipeWire лежат в пакете libspa-0.2-bluetooth, в его зависимостях есть LDAC, aptX (через свободную реализацию libfreeaptx), LC3. Обычно он уже стоит, проверить можно так:

apt policy libspa-0.2-bluetooth

В Fedora и Arch Bluetooth-модуль PipeWire ставится вместе с основными пакетами. Если нужного кодека нет в списке профилей, поищите отдельный пакет: dnf search pipewire-codec или pacman -Ss ldac.

Как увидеть и сменить кодек

wpctl status
pactl list cards | grep -A 30 bluez
pactl set-card-profile bluez_card.AA_BB_CC_DD_EE_FF a2dp-sink-ldac

Профили в PipeWire называются по кодекам: a2dp-sink-aac, a2dp-sink-sbc, headset-head-unit и так далее. Точные имена берите из вывода pactl list cards, они зависят от наушников. В KDE Plasma и GNOME то же самое выбирается в настройках звука, в списке профилей устройства.

Звук стал как из телефона: профиль гарнитуры и автопереключение

Классическая жалоба: музыка звучала нормально, потом открылся Telegram или Zoom, и звук стал глухим и моно. Это не поломка. Когда приложение запрашивает микрофон, WirePlumber переключает наушники из A2DP в профиль гарнитуры HSP/HFP, а он гораздо беднее по звуку. Микрофон в A2DP классического Bluetooth не работает, это ограничение протокола, а не Linux.

Если микрофон наушников вам не нужен (пользуетесь веб-камерой или отдельным микрофоном), отключите автопереключение:

wpctl settings --save bluetooth.autoswitch-to-headset-profile false

Или создайте файл ~/.config/wireplumber/wireplumber.conf.d/90-no-bt-autoswitch.conf:

wireplumber.settings = {
  bluetooth.autoswitch-to-headset-profile = false
}

и перезапустите звуковой стек: systemctl --user restart wireplumber pipewire pipewire-pulse. Синтаксис относится к WirePlumber 0.5, в старых системах с 0.4 конфигурация была на Lua. Справочник по параметрам есть в документации WirePlumber.

Если звук рвётся, первым делом проверьте не настройки, а эфир. Bluetooth и Wi-Fi на 2,4 ГГц делят один диапазон и часто одну антенну. Подключите ноутбук к сети на 5 ГГц, уберите USB 3.0 флешку от USB-адаптера Bluetooth и попробуйте кодек попроще, например AAC вместо LDAC. Это помогает чаще, чем правка конфигов.

Наушники подключились, но звука нет совсем: проверьте, что они выбраны устройством вывода в wpctl status. Полный порядок диагностики PipeWire описан в статье PipeWire без звука.

Полезные настройки в /etc/bluetooth/main.conf

Главный конфиг BlueZ лежит в /etc/bluetooth/main.conf. Почти всё в нём закомментировано, и это правильно, но три параметра бывают нужны:

[General]
# быстрее переподключение, расходует чуть больше энергии
FastConnectable = true
# только классический Bluetooth: иногда лечит проблемные наушники
#ControllerMode = bredr

[Policy]
# включать адаптер при загрузке
AutoEnable = true

ControllerMode = bredr отключает Bluetooth Low Energy. Этот приём помогает со старыми наушниками, которые путаются в двух режимах, но ломает фитнес-браслеты, современные мыши и LE Audio, так что включайте его, только если других вариантов не осталось. После правки: sudo systemctl restart bluetooth.

Уровень заряда наушников GNOME и Plasma показывают в апплете, если наушники сообщают его по стандартному протоколу. В старых версиях BlueZ для этого требовался параметр Experimental = true, в свежих дистрибутивах обычно ничего включать не нужно.

Наушники приходится переподключать после Windows

При двойной загрузке Linux и Windows наушники помнят только одну систему. Причина в ключе сопряжения: каждая ОС генерирует свой, а наушники хранят последний. Адрес адаптера одинаковый, поэтому наушники думают, что это то же устройство, и отвергают старый ключ.

Решение - сделать ключ одинаковым. Сначала выполните сопряжение в Linux, затем в Windows. Потом ключ из реестра Windows (раздел HKLM\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys, читается из Linux утилитой chntpw) переносится в файл /var/lib/bluetooth/адрес_адаптера/адрес_устройства/info, строка Key= в секции [LinkKey]. Для наушников с Bluetooth LE ключей больше, и процедура сложнее. Есть утилиты, которые автоматизируют перенос, например bt-dualboot, но перед запуском любой из них сделайте копию /var/lib/bluetooth.

Если возиться не хочется, проще держать для одной из систем отдельный USB-адаптер: у него свой адрес, и наушники будут помнить оба компьютера как разные устройства. Как уживаются две системы на одном диске, рассказано в статье Linux рядом с Windows 11.

Частые вопросы

Почему Bluetooth в Linux не находит наушники?

Чаще всего наушники не в режиме сопряжения, адаптер заблокирован в rfkill или не запущена служба bluetooth. Проверьте rfkill list и systemctl status bluetooth, затем запустите scan on в bluetoothctl.

Как подключить наушники к Linux из терминала?

В bluetoothctl выполните power on, agent on, scan on, затем pair, trust и connect с MAC-адресом наушников. Команда trust нужна для автоподключения.

Почему звук в наушниках стал плохим при звонке?

Приложение включило микрофон, и наушники переключились в профиль гарнитуры HSP/HFP. Если микрофон не нужен, отключите bluetooth.autoswitch-to-headset-profile в WirePlumber.

Поддерживает ли Linux LDAC и aptX?

Да, PipeWire поддерживает LDAC, aptX, AAC и SBC при наличии модулей кодеков. В Ubuntu и Debian они входят в пакет libspa-0.2-bluetooth.

Что делать с ошибкой No default controller available?

BlueZ не видит адаптер. Посмотрите dmesg на ошибки прошивки, обновите linux-firmware и ядро, перезагрузите модуль btusb.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.