Ubuntu Bluetooth Troubleshooting Guide

March 10 2025 7:44pm • Est. Read Time: 7 MIN

Bluetooth 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.