DEV Community

Cover image for Proxmox Bluetooth Passthrough: Why It Silently Fails (and the One-Line Fix)
Lucid Fabrics
Lucid Fabrics

Posted on • Originally published at Medium

Proxmox Bluetooth Passthrough: Why It Silently Fails (and the One-Line Fix)

I run a gaming VM on Proxmox with an AMD GPU passed through. Steam works. Games work. Everything works except Bluetooth.

My Xbox controller would blink forever trying to pair, and every fix I found online led to the same place: pass a USB Bluetooth device into the VM and watch it fail anyway.

The forum threads all read the same way. Someone finds a controller. Someone else says "just pass the USB device through." The original poster tries it, and the thread goes quiet. No follow-up. No "it worked."

Xbox controller connected inside the Proxmox gaming VM

Why passthrough fails

My board has an Intel BE200, a Wi-Fi 7 and Bluetooth 5.4 combo card found on many modern motherboards. Intel onboard Bluetooth in the BE200, AX200, AX210, and AX211 family depends on the host driver loading firmware at boot.

A passthrough handoff re-enumerates the USB device and clears that firmware. The guest must load it again. A full Debian, Ubuntu, or Arch guest may have the matching driver and firmware blobs, so passthrough can work there. Trimmed or immutable guests such as ChimeraOS, Bazzite, and Home Assistant OS often do not.

In my case the guest got stuck here:

Reading Intel version command failed (-110)
Enter fullscreen mode Exit fullscreen mode

Again and again. I spent hours thinking the chip was defective. It wasn't. The handoff was the problem.

Try plain USB passthrough first

A regular USB Bluetooth dongle passed into a normal Linux distribution often works fine:

qm set <vmid> -usb0 host=<vendor:product>
Enter fullscreen mode Exit fullscreen mode

If the guest reports a missing firmware blob, install it and reboot:

# Debian, with non-free-firmware enabled
sudo apt install firmware-iwlwifi

# Ubuntu
sudo apt install linux-firmware

# Fedora, ChimeraOS, or Bazzite
sudo rpm-ostree install linux-firmware
Enter fullscreen mode Exit fullscreen mode

If that fixes it, keep the simpler setup. You do not need this project.

What worked: keep the chip on the host

Instead of handing the adapter to the VM, the Proxmox host keeps it initialized. btproxy, a small tool from the official BlueZ source tree, opens the adapter in raw HCI mode and streams it over TCP.

The VM runs btproxy in reverse. It creates a virtual Bluetooth controller through hci_vhci and feeds it the stream. BlueZ inside the guest sees a normal local adapter. The physical chip never resets, so there is no firmware handoff to fail.

I packaged the setup as proxmox-bluetooth.

On the Proxmox host:

curl -fsSL https://raw.githubusercontent.com/lucid-fabrics/proxmox-bluetooth/main/install.sh | sudo bash
Enter fullscreen mode Exit fullscreen mode

The installer prints the matching command to run inside the VM. Paste that line there. Both services start at boot and reconnect automatically.

Installing the Bluetooth bridge on the host and VM

My Xbox controller paired within a minute. It has stayed paired through host reboots, VM reboots, and a full AC power cycle.

Check before installing

Run this on the host:

curl -fsSL https://raw.githubusercontent.com/lucid-fabrics/proxmox-bluetooth/main/install.sh | sudo bash -s -- --check
Enter fullscreen mode Exit fullscreen mode

It lists each adapter and tells you whether it is healthy. If an Intel chip is stuck in its blank boot state, shut the machine down and switch off AC power for 15 seconds. A reboot is not enough because the radio can remain powered.

One security detail that matters

btproxy uses plain, unauthenticated TCP on port 9700. By default, the first machine on your LAN that connects gets the Bluetooth chip. Restrict it to the VM once you know its address:

./install.sh --allow 192.168.1.50
Enter fullscreen mode Exit fullscreen mode

That installs an nftables rule without interfering with pve-firewall. Treat the bridge as a trusted-LAN tool. Do not expose it to the internet.

The project is MIT licensed. The bundled bridge is unmodified BlueZ code under its upstream licenses, and CI rebuilds it from source on every commit to verify the binary byte for byte.

Source and installation guide: github.com/lucid-fabrics/proxmox-bluetooth

Top comments (0)