Bluetooth în Linux

Aceasta e o versiune anterioară a paginii.


Bluetooth în Linux

Bluetooth-ul în Linux este gestionat prin stiva BlueZ, care include serviciul de sistem bluetooth, utilitarul în linie de comandă bluetoothctl și suportul la nivel de kernel prin modulele bluetooth și btusb. Articolul de față urmează structura Arch Wiki și adaptează informația pentru toate distribuțiile principale.

Instalare

BlueZ și modulul kernel

Driverul generic de Bluetooth este modulul kernel btusb. Verifică dacă este încărcat:

lsmod | grep btusb

Dacă nu apare, încarc-ă manual:

sudo modprobe btusb

Instalează pachetele de bază. bluez furnizează stiva de protocol, bluez-utils furnizează bluetoothctl:

sudo apt install bluez bluez-tools

sudo pacman -S bluez bluez-utils

sudo dnf install bluez bluez-tools

sudo zypper install bluez bluez-tools

sudo emerge --ask net-wireless/bluez

sudo apk add bluez bluez-deprecated

sudo xbps-install -S bluez

Pe Gentoo, activează mai întâi suportul Bluetooth global prin USE flag dacă nu l-ai activat deja, apoi actualizează sistemul:

# În /etc/portage/make.conf: USE="bluetooth"
sudo emerge --ask --changed-use --deep @world

Pornește și activează serviciul:

systemd (Debian, Ubuntu, Mint, Arch, Fedora, openSUSE):

sudo systemctl enable --now bluetooth

OpenRC (Gentoo cu OpenRC, Alpine cu OpenRC):

sudo rc-update add bluetooth default
sudo rc-service bluetooth start

runit (Void Linux):

sudo ln -s /etc/sv/bluetoothd /var/service/
Notă: Câteva situații speciale de reținut:
  • Unele adaptoare Bluetooth sunt integrate cu placa Wi-Fi (ex. Intel Centrino mai vechi). Pe acestea, Wi-Fi-ul trebuie activat primul (de obicei printr-o combinație de taste pe laptop) pentru ca kernelul să vadă adaptorul Bluetooth.
  • Unele plăci Broadcom intră în conflict cu adaptorul de rețea - asigură-te că dispozitivul Bluetooth se conectează înaintea serviciului de rețea la boot.
  • bluetooth.service necesită existența directorului /sys/class/bluetooth, creat de modulul kernel bluetooth. Dacă directorul nu există, verifică dacă modulul este încărcat: lsmod | grep bluetooth.

Unelte depreciate BlueZ

Opt unelte BlueZ au fost depreciate și eliminate din bluez-utils: hcitool, hciconfig, hcidump, rfcomm, ciptool, sdptool, gatttool, hciattach. Nu primesc actualizări și pot eșua silențios pe hardware modern. Înlocuitorul primar este bluetoothctl, completat de btmgmt și btmon.

Tabel cu înlocuitorii recomandați:

Unealtă depreciată Înlocuitor recomandat
gatttool btgatt-client, D-Bus Gatt API
hciattach btattach
hciconfig btmgmt (și bluetoothctl)
hcidump btmon (și btsnoop)
hcitool lipsă; D-Bus Device API disponibil
rfcomm lipsă; implementează cu D-Bus Profile/ProfileManager API
sdptool lipsă; funcționalitate dispersată în D-Bus

Dacă ai nevoie totuși de ele (urmezi un tutorial mai vechi, ai un caz specific):

sudo apt install bluez-hcidump

sudo pacman -S bluez-deprecated-tools

sudo dnf install bluez-deprecated-tools

sudo zypper install bluez-deprecated-tools

# Activează USE flag: deprecated
sudo emerge --ask net-wireless/bluez

Transfer de fișiere (OBEX)

Începând din 2024, bluez-obex și bluez-mesh sunt separate de bluez. Dacă vrei să trimiți sau să primești fișiere prin Bluetooth, trebuie instalat separat și serviciul de utilizator obex.service activat:

sudo apt install bluez-obexd
systemctl --user enable --now obex.service

sudo pacman -S bluez-obex
systemctl --user enable --now obex.service

sudo dnf install bluez-obexd
systemctl --user enable --now obex.service

sudo zypper install bluez-obexd
systemctl --user enable --now obex.service

# Activează USE flag: obex
sudo emerge --ask net-wireless/bluez

Interfețe grafice

  • GNOME Bluetooth - integrat în GNOME; gnome-bluetooth-3.0 furnizează backend-ul, gnome-shell furnizează applet-ul, gnome-control-center furnizează panoul grafic. Poți lansa direct bluetooth-sendto pentru a trimite fișiere. Primirea de fișiere funcționează numai cât timp panoul Bluetooth este deschis.
  • BlueDevil - unealta KDE Plasma; dacă nu apare iconița în system tray, activeaz-o din opțiunile tray-ului sau adaugă un widget.
  • Blueberry - spin-off Linux Mint al GNOME Bluetooth, funcționează în orice mediu desktop. Nu suportă primirea fișierelor prin Obex Object Push.
  • Blueman - manager complet, independent de desktop. Recomandat pentru XFCE, LXDE, Openbox, i3, Sway etc.
  • bluetuith - manager TUI cu suport OBEX și mouse.
  • bluetui - manager TUI simplu.
  • Overskride - client Bluetooth simplu și performant.
  • Bluetooth Manager Sidebar - manager GTK4/libadwaita pentru sesiuni Wayland, se deschide ca sidebar.
  • toolBLEx - scanner și analizor pentru dispozitive BLE și Bluetooth clasic.

sudo apt install blueman

sudo pacman -S blueman
# sau pentru KDE:
sudo pacman -S bluedevil

sudo dnf install blueman

sudo zypper install blueman

sudo emerge --ask net-wireless/blueman

sudo apk add blueman

sudo xbps-install -S blueman

Asocierea dispozitivelor

Notă: Înainte de a folosi un dispozitiv Bluetooth, asigură-te că nu este blocat de rfkill: rfkill list bluetooth. Dacă apare Soft blocked: yes, rulează sudo rfkill unblock bluetooth.

Această secțiune descrie configurarea directă a BlueZ prin bluetoothctl. Dacă folosești o interfață grafică (GNOME Bluetooth, Blueman etc.), pașii următori nu sunt necesari.

Procedura exactă depinde de dispozitivele implicate și de capacitățile lor de intrare. Mai jos este conturul general al asocierii unui dispozitiv cu bluetoothctl.

Pornești sesiunea interactivă și tastezi help pentru lista de comenzi disponibile:

bluetoothctl

Pașii în cadrul promptului [bluetooth]#:

  1. (opțional) Selectează un controller implicit cu select MAC_address
  2. (opțional) Pornește controllerul cu power on dacă este oprit - vezi Starea implicită a adaptorului
  3. devices pentru a vedea adresele MAC ale dispozitivelor cunoscute deja
  4. scan on dacă dispozitivul nu este încă în listă
  5. agent on sau alege un agent specific (apasă Tab de două ori după agent pentru lista agenților disponibili); agentul gestionează codul de asociere Bluetooth
  6. pair MAC_address pentru asociere (Tab completează adresa)
  7. trust MAC_address dacă dispozitivul nu are PIN, pentru a-i permite reconectarea automată
  8. connect MAC_address pentru a stabili conexiunea

O sesiune completă de exemplu:

$ bluetoothctl

[NEW] Controller 00:10:20:30:40:50 hostname [default]
[bluetooth]# agent KeyboardOnly
Agent registered

[bluetooth]# default-agent
Default agent request successful

[bluetooth]# power on
Changing power on succeeded
[CHG] Controller 00:10:20:30:40:50 Powered: yes

[bluetooth]# scan on
Discovery started
[CHG] Controller 00:10:20:30:40:50 Discovering: yes
[NEW] Device 00:12:34:56:78:90 device name
[CHG] Device 00:12:34:56:78:90 LegacyPairing: yes

[bluetooth]# pair 00:12:34:56:78:90
Attempting to pair with 00:12:34:56:78:90
[CHG] Device 00:12:34:56:78:90 Connected: yes
[CHG] Device 00:12:34:56:78:90 Connected: no
[CHG] Device 00:12:34:56:78:90 Connected: yes
Request PIN code
[agent] Enter PIN code: 1234
[CHG] Device 00:12:34:56:78:90 Paired: yes
Pairing successful
[CHG] Device 00:12:34:56:78:90 Connected: no

[bluetooth]# connect 00:12:34:56:78:90
Attempting to connect to 00:12:34:56:78:90
[CHG] Device 00:12:34:56:78:90 Connected: yes
Connection successful
Sfat: Pentru a automatiza comenzi bluetoothctl, folosești echo -e „command1\ncommand2\n“ | bluetoothctl sau bluetoothctl – command.

Salvarea configurației

Toată configurația BlueZ - dispozitivele asociate, cheile de pairing, setările trust - se află în /var/lib/bluetooth/. Structura directorului:

/var/lib/bluetooth/
└── AA:BB:CC:DD:EE:FF/          ← MAC-ul adaptorului tău Bluetooth
    ├── settings                ← setările controlerului
    ├── cache/                  ← cache cu dispozitivele descoperite
    └── XX:XX:XX:XX:XX:XX/      ← câte un director per dispozitiv asociat
        └── info                ← cheile și metadata dispozitivului

Backup și restaurare completă:

# Backup
sudo cp -r /var/lib/bluetooth/ ~/bluetooth-backup-$(date +%Y%m%d)/
 
# Restaurare (după reinstalare, pe alt sistem cu același adaptor)
sudo cp -r ~/bluetooth-backup-20250101/ /var/lib/bluetooth/
sudo systemctl restart bluetooth

Dispozitivele asociate anterior se vor reconecta automat fără re-pairing.

Dual boot pairing (Linux + Windows/macOS)

Pe sisteme cu dual boot Linux+Linux, copierea sau symlinking-ul întregului director /var/lib/bluetooth/MAC_ADAPTOR/ face toate dispozitivele să funcționeze pe ambele instalări fără re-pairing.

Pe sisteme cu Windows sau macOS, problema este că fiecare sistem de operare generează propria cheie de asociere și o suprascrie pe cea de pe dispozitiv. Soluția este sincronizarea cheilor.

Notă: Unele dispozitive, precum Logitech MX Master și Logitech 604 Lightspeed, incrementează un octet al adresei MAC (de obicei ultimul) la fiecare nouă asociere. Verifică dacă dispozitivul tău face asta pentru a ține cont la final.

Procedura generală

  1. Asociezi dispozitivul în Linux (se creează fișierele în /var/lib/bluetooth/)
  2. Repornești în Windows/macOS și asociezi același dispozitiv
  3. Oprești dispozitivul Bluetooth pentru a preveni tentative de conexiune automată
  4. Extragi cheile generate de Windows/macOS
  5. Repornești în Linux și aplici cheile
  6. Repornești bluetooth.service

Extragerea cheilor din Windows

Cheia de pairing poate fi extrasă fie din Windows, fie direct din Linux (fără a porni Windows).

Extragere din Windows cu PsExec:

Cheia din registru este accesibilă numai prin contul SYSTEM, deci ai nevoie de PsExec din Microsoft Sysinternals. Dintr-un terminal de administrator:

.\PsExec64.exe -s -i regedit.exe

Navighezi în registry la:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys

Există câte un subkey per adaptor Bluetooth (după adresa MAC). În subkey-ul adaptorului găsești perechi nume-valoare pentru fiecare dispozitiv asociat. Dacă dispozitivul are și propriul subkey (cu valori de tipul LTK, IRK etc.), este un dispozitiv Bluetooth 5.1. Dacă are numai o pereche nume-valoare simplă, este un dispozitiv clasic. Exportezi subkey-ul adaptorului ca fișier .reg și îl muți în Linux.

Extragere din Linux cu chntpw:

sudo apt install chntpw

sudo pacman -S chntpw

sudo dnf install chntpw

sudo zypper install chntpw

Notă: Dacă partiția Windows este criptată cu BitLocker, nu poți accesa registrul din Linux cu chntpw.

Montezi partiția Windows, navighezi la registry hive și pornești chntpw:

cd /path/to/windows/Windows/System32/config
chntpw -e SYSTEM

În consola chntpw:

> cd CurrentControlSet\Services\BTHPORT\Parameters\Keys
# (sau ControlSet001 în loc de CurrentControlSet - verifică cu ls)
> ls
> cd MAC_adaptor
> ls
> cd MAC_dispozitiv
> ls

Dacă dispozitivul nu este Bluetooth 5.1, vei vedea o singură valoare. Afișezi hexdump-ul cheii:

> hex ab12cd34ef56

:00000 XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX

Dacă dispozitivul este Bluetooth 5.1, vei vedea mai multe valori: LTK, KeyLength, ERand, EDIV, IRK, Address etc. Afișezi cu hex VALOARE fiecare în parte.

Extragerea cheilor din macOS

macOS Monterey sau mai nou:

Deschizi Keychain Access (pe Tahoe și mai nou: Passwords), cauți Bluetooth, sortezi după dată. Deschizi intrarea, dai click pe „Show password“, copiezi conținutul XML și îl salvezi în ~/bt_keys.txt.

High Sierra sau mai nou:

sudo defaults read /private/var/root/Library/Preferences/com.apple.bluetoothd.plist LinkKeys > ~/bt_keys.txt

Sierra sau mai vechi:

sudo defaults read /private/var/root/Library/Preferences/blued.plist LinkKeys > ~/bt_keys.txt
Notă: Pe versiunile mai vechi de macOS (High Sierra și anterioare), cheile sunt stocate în format inversat și trebuie inversate înainte de aplicare. Exemplu: 98 54 2f aa bb cc dd ee ff gg hh ii jj kk ll mm devine MM LL KK JJ GG FF EE DD CC BB AA 2F 54 98. Inversare cu Python: key = „98 54 2f…“; „ “.join(reversed(key.split()))

Aplicarea cheilor în Linux

Devii root și navighezi la directorul adaptorului:

sudo -i
cd /var/lib/bluetooth/MAC_ADAPTOR/MAC_DISPOZITIV
Notă: Dacă dispozitivul incrementează adresa MAC la fiecare asociere (Logitech MX Master etc.), mută directorul la noua adresă: mv MAC_VECHI MAC_NOU. Copiezi adresa din Windows sau o incrementezi manual - fiecare octet este un număr hexazecimal de două cifre.

Dispozitive clasice (Bluetooth ≤ 4.0, fără subkey 5.1):

Editezi fișierul info și modifici valoarea Key din secțiunea [LinkKey]. Toate literele trebuie să fie majuscule, fără spații:

[LinkKey]
Key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Dispozitive Bluetooth 5.1:

Transformările necesare diferă în funcție de dispozitiv. Mai jos sunt regulile generale și cele pentru cele mai comune dispozitive. Utilitare Python pentru conversii:

# Eliminare spații
"key_value".replace(" ", "")
 
# Inversare octeți
ERand = " 63 02 84 B8 5D 40 44 DF "
ERand = list(reversed(ERand.strip().split()))
 
# Conversie la decimal (după inversare)
int("".join(ERand), 16)
# => 16088054540146049635
 
# Conversie base64 → hex (macOS)
import base64, binascii
binascii.hexlify(base64.decodebytes(b'...')).upper()
 
# Conversie macOS Encrypted Diversifier
import struct, base64
struct.unpack('<H', base64.decodebytes(b'...'))
 
# Conversie macOS Random Number
struct.unpack('<Q', base64.decodebytes(b'...'))

Exemplu general: un LTK 48 4D AF CD 0F 92 22 88 0A 52 9A F4 76 DA 8B 94 devine Key=484DAFCD0F9222880A529AF476DA8B94; un ERand 63 02 84 B8 5D 40 44 DF devine Rand=16088054540146049635; un EDIV 37520 devine EDiv=37520.

Tabel cu transformările per categorie de dispozitiv:

Dispozitiv Cheie Windows Fișier destinație
Logitech MX Anywhere 3S, MX Master 3/3S, MX Keys, MX Keys Mini, MX Mechanical, Xbox One S Wireless IRK: elimini spațiile IdentityResolvingKey.Key
(același grup) LTK: elimini spațiile SlaveLongTermKey.Key și PeripheralLongTermKey.Key
Logitech MX Anywhere 2S, ELECOM Bitra IRK: elimini spațiile IdentityResolvingKey.Key
(același grup) CSRK: elimini spațiile LocalSignatureKey.Key
(același grup) LTK: elimini spațiile LongTermKey.Key
(același grup) KeyLength: decimal LongTermKey.EncSize
(același grup) EDIV: decimal LongTermKey.EDiv
(același grup) ERand: inversezi octeții, convertești la decimal LongTermKey.Rand
ThinkPad TrackPoint Keyboard II, Pebble M350, Logitech G604 IRK: inversezi octeții IdentityResolvingKey.Key
(același grup) LTK: elimini spațiile LongTermKey.Key
(același grup) ERand: inversezi octeții, convertești la decimal LongTermKey.Rand
(același grup) EDIV: inversezi octeții, convertești la decimal LongTermKey.EDiv
Alte dispozitive LTK: elimini spațiile LongTermKey.Key
Xbox wireless controller LTK: elimini spațiile SlaveLongTermKey.Key

Exemplu pentru un controller Xbox One S (fișierul info după modificare):

[IdentityResolvingKey]
Key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
[PeripheralLongTermKey]
Key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
[SlaveLongTermKey]
Key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Repornești serviciul bluetooth (și PulseAudio dacă îl folosești):

sudo systemctl restart bluetooth
# dacă folosești PulseAudio:
pulseaudio -k && pulseaudio --start
Notă: În funcție de managerul Bluetooth folosit, poate fi necesară repornirea completă a sistemului pentru reconectare.

Unelte automate pentru dual boot

  • bt-dualboot - automatizează sincronizarea cheilor Linux↔Windows; nu suportă Bluetooth Low Energy
  • bluetooth-dualboot script - proces semi-automat, nu modifică fișiere direct, dar ajută la formatarea valorilor

Configurare

Starea implicită a adaptorului

Începând cu BlueZ 5.65, comportamentul implicit este pornirea automată a tuturor adaptoarelor la pornirea serviciului sau la revenirea din suspend. Dacă vrei să dezactivezi (ex. pentru a economisi baterie pe laptop), editează /etc/bluetooth/main.conf:

[Policy]
AutoEnable=false

Adaptorul poate fi pornit manual oricând cu power on din bluetoothctl.

Vizibilitate permanentă

Dacă dispozitivul trebuie să fie mereu vizibil și direct conectabil:

[General]
DiscoverableTimeout = 0

Trezirea sistemului din suspend

Pentru a permite tastaturii, mouse-ului sau altor dispozitive Bluetooth să trezească sistemul din suspend, verifică mai întâi că Wake from USB este activat în BIOS/UEFI (în multe cazuri, Bluetooth-ul de pe placă este un dispozitiv USB intern). Adaugă o regulă udev pentru adaptoare Bluetooth USB (Wireless Controller Base Class, Bluetooth Programming Interface):

sudo tee /etc/udev/rules.d/91-bluetooth-wakeup.rules << 'EOF'
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", \
    ATTR{bDeviceClass}=="e0", \
    ATTR{bDeviceProtocol}=="01", \
    ATTR{bDeviceSubClass}=="01", \
ATTR{power/wakeup}="enabled"
EOF
sudo udevadm control --reload-rules

Transport implicit (BR/EDR vs LE)

Implicit, BlueZ folosește modul dual (ControllerMode=dual) - atât Bluetooth clasic (BR/EDR) cât și Low Energy (LE). Dacă vrei să forțezi protocolul clasic (ex. pentru a simplifica dual boot pairing cu un dispozitiv Bluetooth 3.0):

[General]
ControllerMode=bredr

Funcții experimentale

BlueZ ține funcțiile noi în spatele unor opțiuni experimentale. Printre cele disponibile astfel: raportarea nivelului de baterie pentru căști mai vechi. Activează în /etc/bluetooth/main.conf:

[General]
# Activează interfețele D-Bus experimentale
Experimental = true
 
# Activează funcțiile kernel experimentale
KernelExperimental = true

Alternativ, prin fișier drop-in systemd:

sudo mkdir -p /etc/systemd/system/bluetooth.service.d/
sudo tee /etc/systemd/system/bluetooth.service.d/override.conf << 'EOF'
[Service]
ExecStart=
ExecStart=/usr/lib/bluetooth/bluetoothd --experimental
EOF
sudo systemctl daemon-reload
sudo systemctl restart bluetooth
Notă: Modul experimental poate împiedica unele căști (ex. Sony WH-1000XM3) să se conecteze automat. bluez-mesh trebuie activat separat dacă îl folosești.

Audio Bluetooth

Audio Bluetooth necesită un pas suplimentar față de instalarea BlueZ de bază - integrarea cu serverul de sunet. Vezi și pagina dedicată căștilor Bluetooth pentru mai multe detalii.

Profiluri audio

Profil Descriere Calitate Microfon
A2DP Redare stereo de calitate înaltă Înaltă (SBC, SBC-XQ, AAC, LDAC, AptX, AptX HD) Nu
HSP Headset Profile clasic, mono Scăzută Da
HFP Hands-Free Profile Scăzută/medie (mSBC) Da
LE Audio / BAP Standard nou, LC3 codec Înaltă Da

Kernelul, BlueZ 5 și PipeWire suportă toate trei profilele principale. PulseAudio și ALSA suportă numai A2DP și HFP/HSP. LE Audio (LC3) este experimental în BlueZ și dezactivat implicit (din feb. 2025).

PipeWire (recomandat)

PipeWire, începând cu v0.3.19, activează suportul Bluetooth implicit. Oferă suport A2DP cu SBC/SBC-XQ, AptX, LDAC, AAC și HFP/HSP out-of-the-box.

sudo apt install pipewire pipewire-pulse libspa-0.2-bluetooth wireplumber
systemctl --user enable --now pipewire pipewire-pulse wireplumber

sudo pacman -S pipewire pipewire-pulse wireplumber
# Se pornesc automat ca servicii de utilizator

# Inclus implicit, adaugă:
sudo dnf install pipewire-pulseaudio wireplumber

sudo zypper install pipewire pipewire-pulseaudio wireplumber

sudo emerge --ask media-video/pipewire media-video/wireplumber

sudo apk add pipewire pipewire-pulse wireplumber

sudo xbps-install -S pipewire wireplumber

PulseAudio

Dacă folosești PulseAudio în loc de PipeWire, instalează modulul Bluetooth și repornește daemonul:

sudo apt install pulseaudio pulseaudio-module-bluetooth
pulseaudio -k

sudo pacman -S pulseaudio pulseaudio-bluetooth
pulseaudio -k

sudo dnf install pulseaudio pulseaudio-module-bluetooth
pulseaudio -k

Dacă folosești PulseAudio la nivel de sistem (system-wide), asigură-te că utilizatorul care rulează daemonul (de obicei pulse) este în grupul lp și că modulele Bluetooth sunt încărcate în /etc/pulse/system.pa:

load-module module-bluetooth-policy
load-module module-bluetooth-discover

Adaugă opțional load-module module-switch-on-connect dacă vrei comutare automată pe dispozitivul Bluetooth la conectare.

ALSA (fără PulseAudio/PipeWire)

BlueZ 5 nu mai are integrare directă cu ALSA. Dacă nu poți sau nu vrei să folosești PulseAudio/PipeWire, instalează bluez-alsa (bluez-alsa-git din AUR pe Arch), pornește serviciul bluealsa și adaugă utilizatorul în grupul audio. Testezi cu:

aplay -D bluealsa:SRV=org.bluealsa,DEV=XX:XX:XX:XX:XX:XX,PROFILE=a2dp FILE.wav

Și adaugi în ~/.asoundrc:

defaults.bluealsa {
    service "org.bluealsa"
    device "XX:XX:XX:XX:XX:XX"
    profile "a2dp"
}

Bluetooth serial (module HC-05, HC-06)

Pentru comunicare serială Bluetooth cu module HC-05, HC-06:

Asociezi dispozitivul cu bluetoothctl ca de obicei, instalezi bluez-deprecated-tools pentru rfcomm, apoi legi adresa MAC la un terminal tty:

sudo rfcomm bind rfcomm0 MAC_address_of_Bluetooth_device

Acum poți deschide /dev/rfcomm0 pentru comunicare serială:

picocom /dev/rfcomm0 -b 115200

Probleme frecvente

Diagnosticare generală

Oprești serviciul și îl pornești manual cu debug:

sudo systemctl stop bluetooth
sudo /usr/lib/bluetooth/bluetoothd -n -d

Sau folosești btmon pentru a urmări activitatea HCI în timp real:

sudo btmon

systemd: serviciul bluetooth este sărit la boot

bluetooth.service necesită directorul /sys/class/bluetooth, creat de modulul kernel bluetooth. Acesta este autoîncărcat de systemd-udev numai dacă detectează hardware Bluetooth real. Dacă directorul nu există:

lsmod | grep bluetooth
sudo modprobe bluetooth btusb
sudo systemctl restart bluetooth

Modulele posibile în funcție de chipset: btusb, btrtl, btintel, btbcm, bnep.

Dacă serviciul a pornit cu succes dar bluetoothctl returnează org.Bluez.Error.NotReady la scan on, încearcă un restart complet al sistemului și verifică dacă directoarele și modulele sunt prezente.

Bluetooth trezește imediat sistemul din suspend-to-idle

Pe sisteme cu suspend-to-idle/S2idle/S0ix/Modern Standby, controllerele Bluetooth rămân active în sleep și trezesc sistemul imediat dacă un dispozitiv este conectat. Soluție - dezactivează Bluetooth înainte de suspend cu un serviciu systemd:

sudo tee /etc/systemd/system/bluetooth-disable-before-sleep.service << 'EOF'
[Unit]
Description=Disable Bluetooth before going to sleep
Before=sleep.target
Before=suspend.target
Before=hybrid-sleep.target
Before=suspend-then-hibernate.target
StopWhenUnneeded=yes
 
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/bluetoothctl power off
ExecStop=/usr/bin/bluetoothctl power on
 
[Install]
WantedBy=sleep.target
WantedBy=suspend.target
WantedBy=hybrid-sleep.target
WantedBy=suspend-then-hibernate.target
EOF
sudo systemctl enable bluetooth-disable-before-sleep.service
Notă: Cu acest workaround activ, trezirea sistemului din suspend cu mouse/tastatură Bluetooth nu va funcționa.

Bluetooth se oprește la delogare (sistem headless/server)

Două cauze posibile:

  • PulseAudio și PipeWire rulează ca servicii de utilizator și se opresc la terminarea ultimei sesiuni. Activează lingering pentru utilizator: sudo loginctl enable-linger UTILIZATOR
  • WirePlumber rulează un logind-monitor care activează Bluetooth la login și îl dezactivează la logout. Vezi WirePlumber - Keep Bluetooth running after logout.

hcitool scan: Device not found

  • Pe unele laptop-uri (ex. Dell Studio 15, Lenovo ThinkPad X1) trebuie comutat modul de la HID la HCI. Instalează bluez-hid2hci - udev face asta automat. Sau manual:
sudo /usr/lib/udev/hid2hci
  • Dacă dispozitivul tot nu apare și ai Windows pe același calculator, pornești Windows și activezi adaptorul Bluetooth de acolo, apoi revii în Linux.
  • Uneori ajunge pur și simplu:
bluetoothctl power on

bluetoothctl: No default controller available

Mai întâi verifici că nu este blocat de rfkill. Dacă folosești USBGuard, verifică că nu blochează controllerul Bluetooth.

Alte cauze posibile:

  • Unele controllere de pe placa de bază au un bug care provoacă această eroare. Verifici în jurnal: journalctl | grep hci. Dacă apare command tx timeout sau Reading Intel version command failed, oprește complet calculatorul și scoate cablul de alimentare câteva secunde (nu simplu restart) - asta forțează reîncărcarea firmware-ului.
  • Unele plăci Intel (ex. 8260) nu sunt preluate corect de serviciul Bluetooth. Încearcă cu bluez-deprecated-tools în loc de bluez-utils.
  • Power saving poate cauza probleme - adaugă parametrul kernel btusb.enable_autosuspend=n (sau echivalentul prin modprobe: options btusb enable_autosuspend=0 în /etc/modprobe.d/btusb.conf).
  • Descărcarea și reîncărcarea modulului fără opțiuni ajută uneori:
sudo modprobe -r btusb
sudo modprobe btusb

Adaptor USB Bluetooth nu este recunoscut

Verifici recunoașterea la inserare:

journalctl -f   # monitorizezi live la inserare

La inserarea unui dongle funcțional, ar trebui să apară:

kernel: usb 4-1: new full-speed USB device number 3 using uhci_hcd
bluetoothd: HCI dev 0 registered
bluetoothd: Listening for HCI events on hci0
bluetoothd: HCI dev 0 up
bluetoothd: Adapter /org/bluez/4568/hci0 has been enabled

Dacă apar primele linii dar nu și ultimele (adaptorul este detectat dar nu inițializat), trebuie ridicat manual cu btmgmt:

sudo btmgmt
 
[mgmt]# select hci0
[hci0]# power up

Sau cu bluetoothctl:

bluetoothctl power on

Verifici versiunea de Bluetooth a adaptorului (HCI version din btmgmt info mapează la versiunea Bluetooth conform specificației oficiale; ex. HCI version 6 = Bluetooth 4.0).

Audio skip la distanță mică de la dongle

Dacă alte dispozitive USB partajează același hub cu adaptorul Bluetooth, pot întrerupe comunicarea cu dispozitivele audio. Asigură-te că adaptorul Bluetooth este singurul dispozitiv pe bus-ul respectiv:

lsusb
Notă: Dongle-ul CSR cu ID 0a12:0001 (Cambridge Silicon Radio, Bluetooth Dongle HCI mode) are un regression bug și funcționează numai în kernelul ≥5.17 și <6.0. Vezi Kernel Bug 60824.

Logitech Bluetooth USB Dongle

Dongle-urile Logitech (ex. MX5000) funcționează în două moduri: Embedded (emulează USB HID) și HCI. Pentru HCI, ții apăsat butonul roșu de pe dongle la inserare timp de 3-5 secunde. Alternativ, instalezi bluez-hid2hci care face comutarea automat prin udev.

Foxconn / Hon Hai / Lite-On Broadcom

Aceste dispozitive necesită uneori flash de firmware la boot. Pachetul broadcom-bt-firmware (din AUR pe Arch) furnizează fișierele pentru mai multe plăci. Alternativ, firmware-ul poate fi convertit dintr-un fișier Windows .hex cu utilitarul hex2hcd (inclus în bluez-utils):

# Identifici device-ul
lsusb   # ex: Bus 002 Device 004: ID 04ca:2006 Lite-On...
 
# Descarci driverul Windows corespunzător și extragi .hex
# Conversia:
hex2hcd fisier.hex fisier.hcd
 
# Copiezi în locul potrivit (verifici dmesg pentru numele exact)
sudo cp fisier.hcd /lib/firmware/brcm/BCM.hcd
 
# Reîncarci modulul
sudo modprobe -r btusb && sudo modprobe btusb

MediaTek MT7921 sau MT7961 în dual boot cu Windows

Dacă versiunile de firmware Bluetooth diferă între Windows și Linux, adaptorul nu funcționează după reboot din Windows. Soluția recomandată este actualizarea driverelor Bluetooth la ultima versiune pe ambele sisteme. Dacă nu poți găsi firmware actualizat pentru Windows, poți copia fișierul din Linux:

/usr/lib/firmware/mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin.xz

Îl extragi și îl copiezi pe Windows în C:\WINDOWS\system32\DRIVERS\.

Adaptorul dispare după suspend/resume

Identifici vendor ID și product ID-ul adaptorului:

lsusb -tv

Apoi folosești usb_modeswitch pentru a-l reseta:

sudo usb_modeswitch -R -v VENDOR_ID -p PRODUCT_ID

Calculatorul nu este vizibil pentru alte dispozitive

bluetoothctl discoverable on
bluetoothctl show   # verifici Discoverable: yes

Dacă calculatorul tot nu apare, încearcă să schimbi clasa dispozitivului în /etc/bluetooth/main.conf:

[General]
# Class = 0x000100   # implicit: Computer
Class = 0x100100     # Object-Transfer Service + Computer
Notă: În unele cazuri, Class din main.conf este suprascrisă după inițializarea dispozitivului. În acel caz, setează clasa direct: hciconfig hci0 class 100100 (deprecated, dar funcțional).

Televizoarele LG (și altele) descoperă dispozitive din categoria audio. Folosind clasa 000414 (soundbar) poți face calculatorul vizibil pentru astfel de dispozitive. Generatorul de clase: bluetooth class generator.

Dispozitivul se conectează și se deconectează după câteva secunde

Un bug introdus în BlueZ 5.83 (prezent și în 5.86) provoacă o deconectare după o tentativă eronată de autentificare pe dispozitive cu suport multipoint. Workaround temporar: sudo systemctl restart bluetooth. Pe KDE Plasma, oprirea sau dezactivarea KDE Connect poate rezolva problema.

Dacă în jurnal apar:

bluetoothd: Unable to get connect data for Headset Voice gateway: getpeername: Transport endpoint is not connected (107)
bluetoothd: connect error: Connection refused (111)

Cauza este probabil că dispozitivul a fost asociat și cu alt sistem de operare pe același adaptor Bluetooth. Urmează instrucțiunile din Dual boot pairing.

Dispozitivele LE nu apar în scan

Unele dispozitive Bluetooth Low Energy (ex. Logitech MX Master) nu apar la scanarea normală. Folosești scanarea filtrată pe transport LE:

bluetoothctl
 
[bluetooth]# menu scan
[bluetooth]# transport le
[bluetooth]# back
[bluetooth]# scan on
[bluetooth]# devices

BLE nu funcționează pe Intel AX200

Scanarea pasivă BLE este defectă pe acest adaptor. Vezi upstream bug report.

Nu se poate reconecta după sleep

Dacă în jurnal apar:

bluetoothd[487]: Authentication attempt without agent
bluetoothd[487]: Access denied: org.bluez.Error.Rejected

Dispozitivul nu este marcat ca trusted. Rulezi bluetoothctl trust MAC_ADDRESS.

Mouse Bluetooth lag / disconnect / nu răspunde

Poți ajusta parametrii de conexiune direct în fișierul info al dispozitivului, adăugând sau modificând secțiunea [ConnectionParameters]:

[ConnectionParameters]
MinInterval=6
MaxInterval=9
Latency=44
Timeout=216

Valorile implicite sunt optimizate pentru economie de energie și pot introduce latență. Aceste setări se aplică și unor tastaturi Keychron BLE. Repornești Bluetooth sau faci re-pair după modificare.

Audio device nu se conectează: br-connection-profile-unavailable

Un dispozitiv audio Bluetooth eșuează la conectare dacă PipeWire este instalat dar nu rulează nicio instanță. Pornești manual serviciul sau redai orice sunet pentru a porni daemonul, apoi reîncerci conectarea:

systemctl --user start pipewire.service

Interferențe între căști și mouse

Dacă audio se întrerupe când folosești simultan mouse Bluetooth și căști, poți încerca:

hciconfig hci0 lm ACCEPT,MASTER
hciconfig hci0 lp HOLD,SNIFF,PARK

Adaugă în /etc/bluetooth/main.conf:

[General]
JustWorksRepairing = always
FastConnectable = true
Class = 0x000100
 
[GATT]
ReconnectIntervals=1,1,2,3,5,8,13,21,34,55
AutoEnable=true

Repornești bluetooth.service. Driver-ul xpadneo nu este necesar.

rfkill unblock: nu deblocheaz pe sisteme cu ConnMan

connmanctl enable bluetooth

Dacă transferurile primite eșuează și în jurnal apare open(…): Operation not permitted pe un path cu symlink-uri, adaugă un drop-in pentru obex.service:

mkdir -p ~/.config/systemd/user/obex.service.d/
tee ~/.config/systemd/user/obex.service.d/10-symlink.conf << 'EOF'
[Service]
ExecStart=
ExecStart=/usr/lib/bluetooth/obexd --symlinks
EOF
systemctl daemon-reload --user
systemctl restart --user obex.service

Dezactivarea Bluetooth-ului

Dezactivare temporară:

sudo rfkill block bluetooth

Dezactivare permanentă prin udev:

sudo tee /etc/udev/rules.d/80-disable-bluetooth.rules << 'EOF'
SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"
EOF
sudo udevadm control --reload-rules

Dezactivare prin blacklist modul kernel:

sudo tee /etc/modprobe.d/blacklist-bluetooth.conf << 'EOF'
blacklist bluetooth
blacklist btusb
blacklist bnep
blacklist btrtl
blacklist btbcm
blacklist btintel
EOF

Resurse