Ubuntu Bluetooth Troubleshooting Guide
March 10 2025 7:44pm • Est. Read Time: 7 MINBluetooth works on Ubuntu. However, sometimes it can need a little extra help.
- Bluetooth won't turn on in Settings.
sudo apt reinstall --purge bluez gnome-bluetooth
- If Bluetooth still won't work, try disabling tlp (if installed, then rebooting) - renable later if this isn't the issue:
sudo systemctl disable tlp.service
Is the module loaded?
lsmod | grep bluetooth
Should show Bluetooth.
Is Bluetooth service actively running?
sudo systemctl status bluetooth
Should show Active/Running.
If everything above looks good, let's try reinstalling Bluetooth and removing saved devices.
sudo rm -r /var/lib/bluetooth/
then
sudo apt reinstall --purge bluez gnome-bluetooth
Bluetooth is still not working
Sometimes you may find that Bluetooth simply won't cooperate no matter what you try. These next step will show you how to get Bluetooth working from the command line. Believe it or not, it's easier than you might think.
Getting started
Start off with the following on Ubuntu.
- Open a terminal.
- Type hciconfig.
- You will now have something that looks like:
Note the BD address. This represents your internal Bluetooth transmitter in your Framework computer. We know the device is detected, we know it's "UP Running" which is great. So whatever was going wrong previously using the GNOME Bluetooth controls, are unaffected here. Let's paid a Bluetooth headset.
- Type bluetoothctl
You'll notice two things here.
- First off, you have controller listed that matches what we observed previously with hciconfig.
- We are now at a Bluetooth prompt at the terminal.
- Now open a new terminal tab. Make sure Bluetooth isn't blocked and run:
sudo rfkill unblock all
- Close this terminal tab so only the bluetooth prompt remains open.
- Power on your headset and get it into pairing mode.
- Back at the tab with our bluetooth prompt.
power on
- This will show Changing power on succeeded.
- Next we'll look for that headset.
scan on
Ah, there is my JBL headphones. Let's grab that hardware address starting with 52 and ending with 4C.
- The next steps is to pair the headphones.
pair Device ID
Note it will get noisy fast from this point on.
- You will be asked to confirm the passkey (this will be a wall of text), when promoted type yes.
Note: You may not be prompted at all, it will depend on the device and may just automatically choose yes. For some devices, you may be asked to type in a pairing key or pin. This will depend on the device you're pairing with. Could be a pin of 1234 or 0000, could be something else depending on the Bluetooth device you're connecting with.
- Now we're paired and bonded...but we need to take a few most steps. First, let's grab that ID again.
devices
Copy that ID now again (mine begins in 52 and ends in D9).
trust ID
and then..
connect ID
This told your Bluetooth transmitter to trust this connection going forward, to avoid future prompts and setup. Then we connected it.
From now on, when you power on the Bluetooth headset and Bluetooth is turned on, your trusted device will simply connect.
Note: If you turn on your headset after rebooting the Framework and it's not connecting:
- Power off the headset.
- In a terminal, type
bluetoothctl
- At the Bluetooth prompt, type
power on
Under most circumstances, Bluetooth should be coming on when you reboot! If it is not, check if you have TLP installed and make sure Bluetooth is not set to start turned off.
Setting up Apple AirPods
For Apple AirPods to work properly, check the ControllerMode
setting in your Bluetooth configuration. First, run:
Is the module loaded?
lsmod | grep bluetooth
Then, check the main Bluetooth configuration:
cat /etc/bluetooth/main.conf | grep "ControllerMode"
If you see:
#ControllerMode = dual
…you will likely want to uncomment it and set it to:
ControllerMode = bredr
Before editing /etc/bluetooth/main.conf
, back it up:
sudo cp /etc/bluetooth/main.conf /etc/bluetooth/main.bak
Then edit /etc/bluetooth/main.conf
and uncomment or change the ControllerMode line as shown above. Afterward, run:
sudo systemctl restart bluetooth.service
Or simply reboot, then pair your AirPods again. With ControllerMode = bredr
set properly, you should have an easier time pairing and using Apple AirPods.
Advanced Bluetooth Connections - Two Bluetooth Radios
I should point out that the following will be “as is” and may not always work. But it is possible to have the Framework-provided Bluetooth radio that comes with the Wi-Fi card, plus one that is USB-A attached to your computer.
Why would anyone want or need something like this? Some users have their Framework 13 laptops located in an area where it might not be able to get a clear Bluetooth signal to their headphones. So said user decides to attach a USB-A Bluetooth dongle on an extended cable. Without fail, the Bluetooth device only connects to the internal Bluetooth radio and not the external.
To address this, open a terminal:
Run the following command:
sudo rfkill
With the extra Bluetooth device connected and assuming it's compatible with Ubuntu, you might see output similar to:
ID TYPE DEVICE SOFT HARD 1 bluetooth hci1 unblocked unblocked 2 wlan phy0 unblocked unblocked 3 bluetooth hci0 unblocked unblocked
Numbers may differ; this is just an illustration. However, this indicates that all radios are alive and active. That’s not ideal, as we now have two Bluetooth radios competing with one another.
Now let's get the addresses for the two Bluetooth devices:
Run the following command:
sudo hciconfig
This will give us something along the following:
hci0: Type: Primary Bus: USB BD Address: 00:00:00:00:00:00 ACL MTU: 1021:6 SCO MTU: 255:12 UP RUNNING RX bytes:324698 acl:133 sco:0 events:45894 errors:0 TX bytes:31301882 acl:45653 sco:0 commands:218 errors:0 hci1: Type: Primary Bus: USB BD Address: 00:00:00:00:00:00 ACL MTU: 1021:4 SCO MTU: 96:6 UP RUNNING RX bytes:100238 acl:153 sco:0 events:12567 errors:0 TX bytes:5962243 acl:8006 sco:0 commands:4469 errors:0
Right off the bat, there are two issues here. First, as indicated by rfkill
, both devices are unblocked, but this shows both devices as active as well.
We can bring down the internal device, but we need to know which one is which. Unplug the dongle, run sudo hciconfig
again, note which hci
device is listed and its number. Also write down or note which BD address is shown for that device – that’s the internal device we want to shut down so your external USB dongle will be the only thing running Bluetooth.
Plug your external Bluetooth dongle back in. Now we're going to block the internal device (the hci
label we noted earlier). Let's say it was hci1
that represented your internal Bluetooth radio. So that's what we're going to block.
Run rfkill
again:
sudo rfkill
ID TYPE DEVICE SOFT HARD 1 bluetooth hci1 unblocked unblocked 2 wlan phy0 unblocked unblocked 3 bluetooth hci0 unblocked unblocked
Now let's block it:
sudo rfkill block 1
ID TYPE DEVICE SOFT HARD 1 bluetooth hci1 blocked unblocked 2 wlan phy0 unblocked unblocked 3 bluetooth hci0 unblocked unblocked
Notice how hci1
is now showing as soft blocked? This means it's being blocked at the software level, versus a hardware switch. But it's off for the duration of this session until you reboot.
Now let's check the Bluetooth device status again:
Run the following command:
sudo hciconfig
hci0: Type: Primary Bus: USB BD Address: 00:00:00:00:00:00 ACL MTU: 1021:6 SCO MTU: 255:12 UP RUNNING RX bytes:324698 acl:133 sco:0 events:45894 errors:0 TX bytes:31301882 acl:45653 sco:0 commands:218 errors:0 hci1: Type: Primary Bus: USB BD Address: 00:00:00:00:00:00 ACL MTU: 1021:4 SCO MTU: 96:6 DOWN RX bytes:100238 acl:153 sco:0 events:12567 errors:0 TX bytes:5962243 acl:8006 sco:0 commands:4469 errors:0
Now we see that hci1
is down and hci0
(our external Bluetooth card) is the only thing active.
Also, on the GNOME desktop, you'll notice how your Bluetooth indicator shows as if it’s turned off. Leave this off. Do not turn it on. If you do, it will unblock hci1
again, and you'll be back to having two competing Bluetooth radios.
Now for the next step, we're going to assume that you're connecting Bluetooth headphones or a speaker. Keep the speaker or headphones turned off.
Run:
sudo hciconfig hci0 reset
After running this, we'll run:
bluetoothctl
You may see a lot of text going by—errors, notices, etc. Ignore all of it except for what is pointed out here. From the bluetooth
prompt, after running the above command, run:
show
We're looking at this section:
Powered: yes PowerState: off Discoverable: off
We need those last two entries to show as on
. Run:
power on
If this kicks out an error, then unplug the dongle, replug it back in. It will send up a ton of errors and messages—ignore them. Run show
again:
show
If it's still off, run power on
again—usually unneeded, but just in case:
power on
Then check your work with show
:
show Powered: yes PowerState: on Discoverable: no
Now run:
discoverable on
If it errors, run show
to check again to see if it shows discoverable, then run it again:
discoverable on
At this stage, show
should give you:
Powered: yes PowerState: on Discoverable: yes
Now run:
scan on
Which gives you Discovery started
. Then you should see something like:
[CHG] Controller 00:00:00:00:00:00 Discovering: yes [NEW] Device 00:00:00:00:00:00 Device_Name
Now pair it:
pair 00:00:00:00:00:00
Which gives you Attempting to pair
. Then Pairing successful
along with other device notifications. Now trust the device so it connects easier next time:
trust 00:00:00:00:00:00
Then connect to it:
connect 00:00:00:00:00:00
Now the bluetooth
prompt will likely change to the name of your device.
Upon Rebooting
After rebooting, you will still have the internal card soft blocked. However, you will have to redo some of the work. To make life easier, simply do the following:
Run:
bluetoothctl
Then run:
devices
Grab the Device address and replace 00:00:00:00:00:00
with your device address:
sudo systemctl restart bluetooth && (echo -e "power off\npower on\nremove 00:00:00:00:00:00\nscan on" | bluetoothctl) && sleep 10 && (echo -e "scan off\npair 00:00:00:00:00:00\nconnect 00:00:00:00:00:00\nquit" | bluetoothctl)
That’s it. This should allow you to run only off the external Bluetooth radio after soft-blocking the internal one.