Hi! We can track down why your Proxmox USB passthrough to printer fails and why the USB device never shows up inside the VM or LXC container.
To avoid randomly rebooting things, I need a quick picture of your setup:
• Which Proxmox VE version (7, 8, etc.) and host OS?
• Is the printer a USB-only printer or a multi-function device, and is the guest OS Linux (CUPS print server) or Windows?
• Are you using the Proxmox web UI “Add → USB Device” or do you manage the VM with Libvirt/virt-manager and a hostdev XML rule?
• When passthrough “fails”, what exactly happens — the printer never appears in lsusb inside the guest, CUPS can’t detect it, or Libvirt throws a “USB device not found / permission denied” error?
Once I know that, I’ll walk you through the typical Proxmox USB printer passthrough checks, including the Libvirt rule and udev permissions that often block the device.
Customer
Proxmox VE 8 on top of Debian. I have a USB laser printer connected to the host. I want a small Ubuntu VM to act as a CUPS print server. I added the USB device with vendor/product ID in virt-manager (Libvirt) and also tried the Proxmox “Add > USB Device” option. The USB passthrough to the printer fails either way: the VM boots, but lsusb inside the VM never shows the printer and CUPS can’t find it. Sometimes Libvirt complains about hostdev permission errors.
Got it — classic case of USB printer passthrough not working on Proxmox, mixed with a bit of Libvirt hostdev confusion.
A few things that usually break Proxmox USB device passthrough:
• Proxmox uses its own QEMU stack, while Libvirt rules expect to fully control the VM XML. Mixing both can leave the USB printer defined in one place but blocked or ignored in the other.
• The printer gets grabbed by the host CUPS service or usblp kernel driver, so it’s “busy” and Libvirt/Proxmox can’t attach it to the guest.
• The Libvirt hostdev XML for the USB device uses a changing bus/device address instead of stable vendor/product IDs, so after a re-plug the rule points to the wrong device.
• Permissions/udev: on some setups, the Libvirt or QEMU process has no access to /dev/bus/usb nodes until you add a custom udev rule.
We’ll first confirm that Proxmox sees the printer, then decide whether you want to rely on the Proxmox GUI USB passthrough or keep using a Libvirt rule and adjust it correctly.
Customer
On the Proxmox host, lsusb shows the printer fine, and it even works if I add it directly to host CUPS. In the VM hardware tab, I tried adding it as a USB device by vendor/product ID. The VM restarts, but there’s still no USB printer in lsusb inside the guest. With virt-manager, the Libvirt hostdev rule sometimes fails on start with “could not open /dev/bus/usb/00x/00y: permission denied”. So it looks like Proxmox USB passthrough to printer fails at the device node level.
Perfect, that tells us the Proxmox host detects the USB printer, so the problem is in how it’s assigned to the guest.
Step 1 — Make sure the host lets go of the printer
1) On the Proxmox host, stop anything that might “grab” the printer:
• Stop or disable host CUPS while you test: systemctl stop cups.
• Check for the usblp driver: lsmod | grep usblp. If it’s loaded and you only use the printer in the VM, you can temporarily remove it: rmmod usblp.
2) Unplug and re-plug the printer, then run lsusb again to confirm the vendor/product ID.
Step 2 — Decide on a single passthrough method
• If you’re happy to manage the VM from the Proxmox web UI, we’ll use “Hardware → Add → USB Device” with that vendor/product ID and let Proxmox write the QEMU args.
• If you prefer Libvirt hostdev XML, we’ll clean up the Proxmox USB entry and then fix the Libvirt rule and udev permissions so the printer can be attached reliably.
Mixing both usually leads to the type of USB passthrough failures you’re seeing now.
Customer
I’d rather keep using the Proxmox GUI if possible; I only tried virt-manager because the printer wasn’t showing in the VM. After stopping CUPS and unloading usblp, Proxmox still lets me select the device as “Use Vendor/Device ID”. But when I reboot the VM, I still don’t see the printer in lsusb inside the guest. So Proxmox USB passthrough to the USB printer still isn’t working, even with the host not using it.
No problem — we’ll stay within the Proxmox USB passthrough workflow and verify each piece.
Step 3 — Re-add the USB printer in Proxmox the “clean” way
1) Shut down the VM completely (not just reboot).
2) In Proxmox, open the VM → Hardware → remove any old USB device entries for that printer.
3) Click Add → USB Device and choose:
• “Use Vendor/Device ID” and select your printer from the dropdown, or manually enter the IDs you saw with lsusb on the host.
• Optionally tick “Use USB3” only if the guest has an xHCI controller and the printer behaves as USB 2.0/3.0 properly.
4) Start the VM again and run lsusb inside it — the same vendor/product ID should now appear.
If the printer still doesn’t show, we’ll look at the VM config file and, if needed, set up a more advanced USB physical port mapping instead of just the device ID, which often stabilises flaky USB printer passthrough on Proxmox.
Customer
I followed that: removed old USB devices, added the printer again by Vendor/Device ID, and started the VM. Still no printer in lsusb inside the guest. If I check the VM config on the Proxmox host, I see a line like usb0: host=1234:abcd. So the config is there, but USB passthrough to the printer fails at runtime. I’ve also tried different USB ports and a short cable.
Good, seeing usb0: host=1234:abcd confirms Proxmox wrote the USB device mapping. We’ll now switch to a USB physical port mapping style and double-check for any leftover Libvirt rules.
Step 4 — Map the physical USB port instead of just the device ID
• On the Proxmox host, run lsusb -t to see which bus and port the printer is on (for example, bus 1, port 4).
• In the VM config (/etc/pve/qemu-server/<VMID>.conf), you can change the USB line from:
usb0: host=1234:abcd
to something like:
usb0: host=1-4
so Proxmox passes the entire USB port through, not just a vendor/product pair that might change after power cycles.
Step 5 — Remove conflicting Libvirt hostdev rules
If you previously used virt-manager, make sure you’re not starting the VM through Libvirt with its own domain XML that also tries to passthrough the printer. For this VM, stick to one definition method — Proxmox’s config — and disable any Libvirt service that manages the same guest. That avoids double-attaching and subtle hostdev permission errors for the USB printer.
Customer
I changed the config to usb0: host=1-4 based on lsusb -t, then stopped the VM and started it again. Now lsusb inside the guest finally shows the printer. CUPS also sees it and I can add it. So the Proxmox USB passthrough to the printer works with port mapping. I still have a Libvirt XML for that VM, but I’m not using it anymore.
Nice — that confirms the problem was how the USB device was being addressed, not the printer itself.
If in the future you do want to use a Libvirt rule for USB passthrough (for example on a different host that uses Libvirt directly), the safer pattern is:
• Describe the printer as a hostdev with vendor/product IDs instead of volatile bus/device numbers.
• Add a matching udev rule under /etc/udev/rules.d/ that sets stable permissions and group ownership on the /dev/bus/usb entry for that printer.
• Ensure the Libvirt/QEMU process runs under a user/group that is allowed to access that device node (often the libvirt-qemu user in distro defaults).
That combination prevents the classic “Libvirt USB passthrough fails with permission denied” message when the printer is re-plugged, and it plays much nicer with long-running CUPS print server VMs.
Customer
Makes sense. One more question: I also have a small LXC container where I tried to run CUPS and pass the printer via USB. There, the device would randomly disappear or never create the right /dev/usb/lp0. Is USB printer passthrough to LXC on Proxmox more fragile than doing it to a full VM?
Great question. In practice, USB printer passthrough to LXC containers on Proxmox is trickier than to full KVM VMs.
With LXC:
• You have to grant access via cgroup device rules (for example lxc.cgroup2.devices.allow: c 189:* rwm) and bind-mount the correct /dev/bus/usb/... nodes into the container.
• Permissions inside the container must match whatever group owns the device on the host, or CUPS inside the container can’t talk to the printer.
• Hot-plug is limited: if the printer appears under a different path after re-plugging, the container config won’t follow automatically.
That’s why for a long-running CUPS print server, a small VM with Proxmox USB port mapping is usually the more stable option. You can absolutely make it work in LXC, but it needs more manual config and careful udev/device rules.
Customer
Understood. I’ll keep the CUPS server as a VM with USB port mapping then. For long term stability, is there anything else I should adjust so I don’t end up with Proxmox USB passthrough to printer failing again after a reboot or kernel update?
Definitely — a few small tweaks make Proxmox USB printer passthrough much more reliable long-term.
Preventive setup for Proxmox USB printers
• Choose one physical USB port on the host for the printer and stick to it; keep using the same host=bus-port mapping in the VM config.
• Keep host CUPS stopped for that printer, or blacklist usblp if you never print from the host, so the device is always free for passthrough.
• After Proxmox or kernel updates, quickly verify with lsusb on host and VM that the USB passthrough still works before exam- or business-critical print jobs.
• Back up the VM config (/etc/pve/qemu-server/<VMID>.conf) in Git or a safe folder so you can restore the USB port mapping quickly if something overwrites it.
• If you later move to another host, remember that the physical port numbering may change, so redo the lsusb -t check and update host=bus-port accordingly.
With those in place, it’s rare to see Proxmox USB passthrough to a USB printer fail unless there’s a cable or hardware issue.
Customer
That all makes sense. Mapping the physical port and turning off host CUPS fixed the issue, and now the printer appears in lsusb and prints fine from the CUPS VM. I also like the tips about backups and port mapping. Thanks for walking me through this Proxmox USB passthrough to printer problem step by step!
Anytime! Quick recap: when
Proxmox USB passthrough to a printer fails, first make sure the host isn’t grabbing the printer (CUPS/usblp), then use either
Vendor/Device ID or, even better,
USB physical port mapping in the VM config. Avoid mixing Proxmox and Libvirt definitions for the same VM; if you do use a
Libvirt hostdev rule, pair it with a udev rule so the device node is always accessible. For LXC, extra cgroup and mount rules are needed, so a small VM is often simpler for a stable CUPS print server. Not sure how to adjust your config safely?
Open the chat and an expert will walk through it with you.
Why Proxmox USB passthrough to a printer often fails
Most Proxmox USB passthrough not working cases boil down to three root causes: the host system keeps control of the printer, the USB device is addressed in an unstable way, or access to the device node is blocked. On many Proxmox VE hosts, CUPS and the usblp kernel driver automatically grab USB printers; once that happens, QEMU or Libvirt cannot attach the same device to the guest. When passthrough uses only changing bus/device numbers instead of a stable USB physical port mapping, moving the cable or rebooting can make the mapping invalid. Finally, missing or restrictive udev and Libvirt rules can leave /dev/bus/usb entries unreadable to the QEMU process, producing cryptic “permission denied” or “device not found” messages.
This is why reliable setups treat the printer like any other dedicated host device: the host only detects it, then hands it off to the guest using either the Proxmox “Add → USB Device” flow or a carefully written Libvirt hostdev XML stanza. Cleaning up old configurations, using one management layer, and locking passthrough to a specific USB port usually eliminates most intermittent USB printer passthrough failures on Proxmox VE.
How to test if Proxmox USB printer passthrough is really fixed
Once you change the passthrough method, it’s important to verify that the USB printer is actually inside the guest and not still being held by the host. A simple checklist:
First, with the VM shut down, run lsusb on the Proxmox host, note vendor/product ID and port, configure usb0: host=bus-port or “Add → USB Device” in the GUI, then start the VM. Inside the guest, run lsusb again — you should see the same device listed. Next, in the guest OS (Linux CUPS or Windows), check that the printer driver or CUPS detects a new USB printer and that a test page prints without errors. If the device appears and then disappears mid-print, watch dmesg on both host and guest for USB reset/disconnect messages, which might indicate power or cable issues rather than a Proxmox or Libvirt rule problem.
If the printer never shows up in lsusb inside the VM but does on the host, you still have a passthrough configuration issue (wrong port mapping, conflicting Libvirt config, or permissions). If it shows up in lsusb but not in CUPS or Windows, focus on guest-side drivers, groups and print service settings instead of Proxmox USB passthrough itself.
Proxmox USB passthrough to printer fails — quick troubleshooting tips
Check host device ownership, use stable USB port mapping, and avoid mixing Proxmox and Libvirt configs.
Fast path: verify the USB printer is visible on the Proxmox host with lsusb, stop host CUPS and unload usblp if you only print from the VM, then configure passthrough using either Vendor/Device ID or USB physical port mapping in the VM config. Reboot the VM and confirm the printer appears in lsusb and in your guest OS’s printer list. If Libvirt is still in the mix, standardise on a single Libvirt hostdev rule with matching udev permissions and don’t let Proxmox and Libvirt both edit the same guest. When in doubt, switch to port mapping and a dedicated USB port — it solves many flaky USB printer passthrough problems.
Disclaimer: This information is AI-generated and intended for general guidance only. For advice specific to your Proxmox VE version, printer model, guest OS and production environment, please consult a verified expert on Whizz-Tech before making configuration changes.
Why does Proxmox USB passthrough to my printer fail even though the host sees it?
Usually the host is still “owning” the printer (via CUPS or the usblp driver), or the USB device is mapped in an unstable way. Proxmox might show the printer in the host’s lsusb, but if the host print stack holds the device node open, QEMU cannot pass it to the VM. Switching to USB port mapping, stopping host CUPS and unloading usblp often fixes USB printer passthrough failures.
Is it better to passthrough a USB printer to a Proxmox VM or an LXC container?
For most setups, a small KVM VM is more reliable than LXC for USB printers. LXC needs explicit cgroup device rules and bind-mounted /dev/bus/usb nodes, and hot-plug can be limited. A VM lets Proxmox and QEMU handle USB passthrough directly, so CUPS or Windows inside the guest sees the USB printer much like it would on bare metal.
When do I need a Libvirt hostdev rule instead of the Proxmox GUI?
If you manage VMs entirely with Libvirt/virt-manager (on a different host or stack), a hostdev rule with vendor/product IDs plus a matching udev rule is the standard way to pass through a USB printer. On a Proxmox VE host, however, it’s usually simpler to rely on the Proxmox web UI to define USB devices and avoid editing Libvirt XML, because Proxmox already generates the QEMU parameters for you.
How can I make Proxmox USB printer passthrough survive reboots and cable re-plugs?
Use a stable USB port, not just vendor/product IDs, in the VM config (for example usb0: host=1-4), keep the printer on the same physical port, and avoid adding host services that fight for the device. After kernel or Proxmox upgrades, quickly test with lsusb on host and guest. Back up your VM config so you can restore the USB passthrough mapping if needed.