Running Tails in Proxmox
Table of contents
- Overview
- Download and verify Tails image
- Resize Tails USB image
- Create the virtual machine
- Run the virtual machine
Overview
Proxmox Virtual Environment is a complete open-source platform for virtualization.
Running Tails from a USB image in Proxmox allows you to use a Persistent Storage in a virtual machine.
Running Tails inside a virtual machine has various security implications
All commands in this instruction are run as root on the Proxmox host.
Download and verify Tails image
- Check and set the latest version of Tails
VERSION=7.3.1 - Download Tails as a USB image:
cd /tmp wget -O tails-amd64.img https://download.tails.net/tails/stable/tails-amd64-$VERSION/tails-amd64-$VERSION.img - Download the signature file:
wget -O tails-amd64.img.sig https://tails.net/torrents/files/tails-amd64-$VERSION.img.sig - Download and import the Tails signing key
wget https://tails.net/tails-signing.key gpg --import tails-signing.keyExpected output (example):
gpg: key 0xDBB802B258ACD84F: public key "Tails developers <tails@boum.org>" imported gpg: Total number processed: 1 gpg: imported: 1 - Verify the image
gpg --verify tails-amd64.img.sig tails-amd64.imgExpected result, you should see something like:
gpg: Signature made ... gpg: using RSA key DBB802B258ACD84F gpg: Good signature from "Tails developers <tails@boum.org>"You may also see:
gpg: WARNING: This key is not certified with a trusted signature!This warning is normal. It only means you haven’t manually verified the key fingerprint yet.
- Verify the key fingerprint
gpg --fingerprint DBB802B258ACD84FExpected fingerprint (must match exactly):
A490 D0F4 D311 A415 3E2B B7D4 DBB8 02B2 58AC D84F
Resize Tails USB image
- Resize the Tails USB image:
qemu-img resize -f raw tails-amd64.img 16G
Minimum allowed by Tails: 7200M
Recommended: 8G or more
- Verify the resize:
qemu-img info tails-amd64.imgExpected result:
image: tails-amd64.img file format: raw virtual size: 16 GiB (17179869184 bytes) disk size: 1.9 GiB
Create the virtual machine
- Pick a free VM ID (for example
301) and VM storage (for examplevm-osorlocal).VMID=301 STORAGE=vm-os - Create the VM:
qm create $VMID \ --name tails-usb \ --machine q35 \ --bios ovmf \ --memory 4096 \ --cores 4 \ --cpu host \ --net0 virtio,bridge=vmbr0 \ --ostype l26 - Import the USB image into Proxmox storage
qm importdisk $VMID tails-amd64.img $STORAGEThis creates something like:
unused0: successfully imported disk 'vm-os:vm-301-disk-0' - Get imported disk image path:
pvesm path $STORAGE:vm-$VMID-disk-0 DISK_PATH=$(pvesm path $STORAGE:vm-$VMID-disk-0) - Attach the image as a USB removable disk:
qm set $VMID --args "-device qemu-xhci,id=xhci \ -drive id=usbdisk,file=$DISK_PATH,format=raw,if=none,cache=writeback \ -device usb-storage,bus=xhci.0,drive=usbdisk,removable=on" - Fix boot order (will let OVMF handle boot discovery):
qm set $VMID --delete boot
This setup intentionally does not use a persistent EFI variables disk (NVRAM).
This matches the behavior of a real live USB device and avoids PXE boot issues.
- Do not use ballooning with Tails:
qm set $VMID --balloon 0 - Verify VM config:
qm config $VMIDExample printout:
args: -device qemu-xhci,id=xhci -drive id=usbdisk,file=/dev/zvol/slowpool/vm-os/vm-301-disk-0,format=raw,if=none,cache=writeback -device usb-storage,bus=xhci.0,drive=usbdisk,removable=on balloon: 0 bios: ovmf boot: cores: 4 cpu: host machine: q35 memory: 4096 meta: creation-qemu=10.1.2,ctime=1765902838 name: tails-usb net0: virtio=BC:24:11:FE:76:7C,bridge=vmbr0 ostype: l26 smbios1: uuid=0f36b186-e060-4c01-865e-0ea8655634ba unused0: vm-os:vm-301-disk-0 vmgenid: 5ddae391-ce59-41fb-bf81-93cbfd3218b7
There is
unused0: vm-os:vm-301-disk-0
This is expected and correct.
The disk is intentionally not attached as scsi0, it is consumed directly by QEMU via
file=/dev/zvol/slowpool/vm-os/vm-301-disk-0.
⚠️ Do NOT deleteunused0
⚠️ Do NOT attach it as scsi/sata
Run the virtual machine
- Start the VM:
qm start $VMID -
Open the console from the Web UI.
-
Create Persistent Storage (inside Tails), once booted: Welcome Screen → Persistent Storage
- Reboot when prompted
Persistence now survives reboots inside Proxmox.
Last tested: Tails 7.3.1 in Proxmox 9.1.2