Proxmox is a bit of a rabbit hole, and there are a lot of things you can do with virtualization and containers. One of the more odd choices to use Proxmox for would be as a gaming server, which works thanks to GPU passthrough, something which has always fascinated me.
Armed with a modestly powerful AM4 system, I experimented with virtual machine gaming and was surprised at how good it turned out to be. However, as you might quickly find out, setting it up was a bit of an ordeal, largely thanks to my specific hardware combination.
Using a gaming PC as a Proxmox server
Need to turn off the RGB first
It might not be the most power-efficient setup out there, but turning my gaming PC into a Proxmox server has been rather fun, and dare I say, useful. The system in question is an AM4-based Ryzen 5600G system, paired with 32GB RAM and an RX 9070 (non-XT).
It’s a standard desktop PC through and through, and even comes equipped with fancy RGB lighting, which I despise. That being said, transforming this into a Proxmox box was a bit of an involved process.
I started by flashing Proxmox using a Ventoy stick, opting to install it on a 120GB SATA SSD. Proxmox itself takes up very little space, and I’d much rather use the motherboard’s dual M.2 slots for game installations and virtual machines.
As for the BIOS, there wasn’t much to tinker with, aside from enabling virtualization settings like SVM and IOMMU. You could also tweak some of the CPU undervolting sections to save on more power.
I planned to use my RX 9070 for virtualization, and that meant I needed a secondary GPU for Proxmox to hook onto. Given my mATX motherboard and case, slotting in another GPU was impossible.
So I kept my Ryzen 5600G as-is and used its integrated graphics for the Proxmox host. The RX 9070 would be “borrowed” from the server and then transferred onto a virtual machine for some GPU-accelerated gaming as and when needed.
This completely lifts the RX 9070 from the Proxmox server for GPU passthrough. If you want to split your GPU into multiple, smaller vGPUs, you’ll need a very specific series of GPUs.
With everything deployed, Proxmox booted and ran without hitches, save for an odd problem. The RX 9070 passed through to a virtual machine just fine at first, but then immediately fell off the bus. This “locked” it into a limbo-like state, making it basically unusable, where the only fix was to force a power reset.
The RX 9070 needs a hook script to work properly
Once it’s set up, there aren’t any further issues
AMD GPUs suffer from a nasty reset bug on Linux. In short, unbinding an AMD GPU in Linux from the vfio-pci driver causes it to sort of drift around, bound to nothing. This “limbo state” persists until a full reset.
This makes GPU passthrough a bit of an annoyance, but there have been a few fixes. Unfortunately, these fixes are all over the place, with a few variants. The most common fix is a vendor reset, but it’s mostly tailored to RDNA 2 GPUs, so my RDNA 4-based RX 9070 couldn’t use this patch.
Technically, a vendor reset isn’t needed for my RX 9070 (since it is entirely unsupported), but the GPU still failed to initialize cleanly no matter what I tried.
Out of options, I turned to Claude for advice (along with a look at the Proxmox forums). Turns out, I needed to create a hook script that dynamically binds and unbinds the amdgpu/vfio drivers for a GPU-passthrough virtual machine.
The script runs every time you cleanly shut down the virtual machine and ensures that the RX 9070 doesn’t get stuck. It’s practically essential for all GPU passthrough virtual machines, and is a hard requirement.
Trying out some virtual machines on Proxmox
Windows and Bazzite, for starters
Now to actually getting the virtual machines up and running. I chose to create two: one for Windows 11 LTSC and the other for Bazzite, so I could have a more SteamOS-like experience. Creating the virtual machines was pretty straightforward using the GUI, although I did have to manually pass the RX 9070 and make sure to add the hook script.
For the virtual resources, I allocated 8 virtual CPUs (out of 12) and 16GB RAM to each virtual machine. I kept storage at a minimum for the OS, giving 50GB to Bazzite and 120GB to Windows. I also passed through one of the NVMe drives attached to the homelab as a shared game drive.
One installation and a few updates later, I was ready to rock. As for performance, I honestly couldn’t tell a difference between running games natively and on the virtual machine.
Given that the 5600G runs on PCIe 3.0 (and the RX 9070 is a PCIe 5.0 card), there should be some noticeable performance loss. I personally think it performs just fine for the weaker CPU in place, and it’s a compromise I can live with.
Further upgrades and some compromises
Obviously, I won’t be using two virtual machines at the same time. This GPU can’t be split into vGPUs, and I don’t have enough RAM to do it either. That said, running a headless, gaming-capable Proxmox server (while other containers run in the background) worked surprisingly well, and it’s a setup I’m keen to keep using.
As for future upgrades and optimizations, a 5950X might be in order, for its sheer 16-core, 32-thread CPU count alone. A shift to an ATX-sized board might also be in order, with an X570 looking like the best option right now (to fit a secondary GPU). Perhaps a project for another day.