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

Содержание
Из чего состоит Bluetooth в Linux
Когда Bluetooth не работает, полезно понимать, на каком этаже сломалось. Цепочка такая:
- Адаптер и драйвер ядра. Обычно модуль
btusbплюс прошивка из пакета linux-firmware. Встроенные адаптеры Intel, Realtek и MediaTek в ноутбуках почти всегда висят на шине USB, даже если они на одной плате с Wi-Fi. - rfkill. Программный или аппаратный выключатель радио. Режим "в самолёте" и функциональные клавиши ноутбука блокируют адаптер именно здесь.
- BlueZ и служба bluetooth. Официальный стек Bluetooth для Linux: сопряжение, профили, хранение ключей в
/var/lib/bluetooth. - PipeWire и WirePlumber. Для наушников и колонок звук идёт через звуковой сервер, он же выбирает кодек и профиль.
- Графический апплет в 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 должен быть собран с ним.
| Кодек | Профиль | Качество | Комментарий |
|---|---|---|---|
| SBC | A2DP | среднее | есть у всех наушников, запасной вариант |
| AAC | A2DP | хорошее | основной у AirPods и многих моделей |
| aptX, aptX HD | A2DP | хорошее | наушники с чипами Qualcomm |
| LDAC | A2DP | высокое | Sony и другие, капризен к помехам |
| CVSD, mSBC | HSP/HFP | низкое | гарнитура: работает микрофон |
| LC3 | LE 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.
Документация и источники
- BlueZ, official Linux Bluetooth protocol stack, GitHub, 2026
- WirePlumber documentation, freedesktop.org, PipeWire, 2026
- libspa-0.2-bluetooth package, Ubuntu 26.04, Ubuntu Packages, 2026
Читайте также
Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.