Here is a quick guide I’ve put together to show you how to set up a Linux Container (LXC) in Proxmox to host an SDR++ server. By connecting an RTL-SDR usb stick to my server, this LXC acts as a remote listening station to which I can connect from anywhere in the world and hear what’s happening on the airwaves back home.

Creating the LXC

First we’ll create a new LXC on the proxmox dashboard with an Ubuntu 24.04 template. We’ll allocate the following resources:

  • 4 GB Disk
  • 2 CPU Cores
  • 512 MB Memory

For the network settings, I usually just set the IPv4 and IPv6 to DHCP as I always connect via tailscale anyway. For the DNS I usually like to add 1.1.1.1 as the DNS server.

Before running the LXC, we must prevent the Proxmox host from claiming the SDR dongle. To do this we have to blacklist its drivers. Use a text editor to create a blacklist file. I like to use vim, which isn’t installed by default but can easily be installed with apt install -y vim.

vim /etc/modprobe.d/blacklist-rtlsdr.conf

and add these lines

blacklist dvb_usb_rtl28xxu
blacklist rtl2832
blacklist rtl2830

now run a quick reboot of the host

reboot

LXC Setup

Now we plug in our SDR Dongle into the USB port we expect to keep it on. Run the following command on the Proxmox host

lsusb

We should see which bus is associated to Realtek and RTL2838 or something similar. In my case it with and RTL-SDR Blog V4 it was

Bus 001 Device 006: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T

Now in the Proxmox web GUI, we can navigate to the LXC we made and go to Resources > Add > Device Passthrough. We then enter the path with the correct Bus/Device numbers. In my case the path was

/dev/bus/usb/001/006

Installing SDR++

Now we can launch the LXC. We’ll start by updating packages and installing the dependencies for SDR++.

apt update && apt install -y libfftw3-dev libvolk-dev libairspyhf-dev libiio-dev libad9361-dev librtaudio-dev libhackrf-dev librtlsdr-dev

The package name for the VOLK library (Vector-Optimized Library of Kernels) changes depending on which version of Debian or Ubuntu your LXC is running. For older versions libvolk2-dev might work, and on newer versions like Debian 12 or Ubuntu 24.04 libvolk-dev works. VOLK is what allows SDR++ to process radio signals efficiently by using the CPU’s advanced instructions (like AVX or SSE). Without it the server would struggle to stream high-bandwidth signals.

We can also run

apt install -y librtlsdr2

Now navigate to the releases page for the SDR++ repo on Github. You may need to click “see all assets” to find the correct version. Since my LXC is Ubuntu 24.04, also known as Noble, and its running on an x86 system, I copied the link (by right clicking on the download link and copying) for sdrpp_ubuntu_noble_amd64.deb. Then, back in the LXC’s shell we can run

wget https://github.com/AlexandreRouma/SDRPlusPlus/releases/download/nightly/sdrpp_ubuntu_noble_amd64.deb

Now install it using apt (your file name may differ)

apt install ./sdrpp_ubuntu_noble_amd64.deb

Now we can launch SDR++ as a headless server using the --server flag.

sdrpp --server

The default port is going to be 5259.

After launching the server, there should be a bunch of output in your shell. Depending on the SDR unit you’re using you may need to install additional drivers. For my case, since I’m using an RTL-SDR, the important line of output was

[24/12/2025 20:50:42.000] [INFO] Loading /usr/lib/sdrpp/plugins/rtl_sdr_source.so

and

Found Rafael Micro R820T tuner

Device Passthrough Persistence

With the current configuration, anytime the host is rebooted or the SDR dongle unplugged and plugged back in, the passthrough will stop working as the device ID changes. Here is one way you can address this problem.

If your SDR dongle is usually plugged into the same physical USB port (or at least stays on the same USB Bus), you can pass the entire USB bus to the container. Even if the Device ID changes from 004 to 005, it will stay within that bus directory.

  1. On the Proxmox host, run lsusb to see which bus your SDR is on (e.g., Bus 001).
  2. Edit your LXC config: vim /etc/pve/lxc/ID.conf. Replacing ID with your LXC ID.
  3. Add these lines (replacing 001 with your actual bus number):
lxc.cgroup2.devices.allow: c 189:* rwm
lxc.mount.entry: /dev/bus/usb/001 dev/bus/usb/001 none bind,optional,create=dir
  1. Restart the LXC. Now, any device plugged into Bus 001 will automatically appear inside the container’s /dev/bus/usb/001/ folder.

Setting Up SDR++ as a Service

Now we want SDR++ to run so long as the container is running. To do this we can make it a service.

In the SDR LXC terminal, create a new service configuration file:

vim /etc/systemd/system/sdrpp.service

Paste the following block into the editor. This configuration assumes you want the server to run with standard settings.

[Unit]
Description=SDR++ Headless Server
After=network.target

[Service]
Type=simple
# Change 'root' to your username if you aren't running as root
User=root
ExecStart=/usr/bin/sdrpp --server
# This ensures it restarts automatically if it crashes
Restart=always
RestartSec=5
# Prevents log files from growing too large
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Now we can enable and start the service using the following commands

systemctl daemon-reload
systemctl enable sdrpp.service
systemctl start sdrpp.service

and check its status using

systemctl status sdrpp.service

Now that it’s running in the background, you won’t see the output in your terminal, so some of the following commands may be useful:

  • View Live Logs: journalctl -u sdrpp -f
  • Restart: systemctl restart sdrpp (Use this after you’ve changed your USB passthrough settings).

Installing Tailscale (Optional)

Depending on your use case, it can be convenient to install tailscale in the LXC to have secure remote access. If you just want to be able to access this service on your local network then this step is not necessary. As a quick tip, if you set up the LXC to use DHCP and don’t know what IP was assigned to the container you can check what it is under the “Network” tab for the container.

To install Tailscale on the LXC I will refer you to the official guide here.