Posted in

I run Windows in a Proxmox VM full-time, and it's good enough to replace my…

The topic I run Windows in a Proxmox VM full-time, and it’s good enough to replace my… is currently the subject of lively discussion — readers and analysts are keeping a close eye on developments.

This is taking place in a dynamic environment: companies’ decisions and competitors’ reactions can quickly change the picture.

Having attempted everything from running Hackintosh instances inside virtual machines to running hypervisors within virtualization environments, I’m no stranger to wacky home lab projects. Heck, I’ve tried running Windows 11 as a VM across a bunch of Proxmox nodes, with each experiment teaching me new tweaks to turn a mere virtual machine into something that can run everyday tasks.

But now that I’ve been using a virtualized Windows 11 environment for my coding projects, video-editing tasks, and full-fledged remote gaming escapades, I have to admit that my VM is good enough to replace my daily driver.

VirtualBox may be simpler, but Hyper-V is better for power users

Compared to typical Linux virtual machines, getting a Windows 11 instance up and running involves a handful of workarounds. For starters, Windows 11 needs a TPM 2.0 module, and enabling it requires the OVMF (UEFI) BIOS, alongside a pool to store the NVRAM variables for the EFI BIOS and the TPM files. During my early Proxmox days, I also realized that switching to host CPU architecture gets rid of the virtualization layer between the processor and the VM, thereby giving an extra boost to its performance. This applies to Windows 11 instances, especially when I want to use them for coding projects.

I’ve currently configured GPU passthrough for my primary Windows 11 VM, but I went with the Pro version of the OS, so I could access it over RDP before arming it with a graphics card. Then there’s the VirtIO driver collection, which is not only necessary for getting the Windows 11 installer to detect the virtual SCSI drive, but it also adds support for the paravirtualized Ethernet adapter, memory ballooning, QXL, and guest-agent functionality.

So far, I’ve only talked about the tweaks during the installation sequence. However, GPU passthrough single-handedly made my virtualized Windows instance as capable as my daily driver. Of course, a VM is bound to introduce some processing overhead compared to a bare-bones setup. But with the CPU host setting and full-on GPU passthrough, its performance gets scarily close to the real deal. RDP produces some latency when streaming games, which is why I use Parsec for my GPU-equipped Windows 11 virtual machine.

In fact, I recently ran an experiment where I tried running my Steam library on an old Pascal card that I’d passed to a Windows 11 VM on my secondary cluster node, and the frame rates were extremely impressive for something running on a virtualized environment. The only time I encountered a snag was when I tried running multiplayer titles with anti-cheat provisions, as they detected I was using a VM and promptly refused to boot. Single-player titles, on the other hand, work so well that I’ve actively been using the VM to stream games to my smartphone. Likewise, video-editing tools like Davinci Resolve run without any issues, and since I’ve got it permanently hardwired to the same switch as my main NAS server, logging into my Windows 11 VM from my laptops and editing videos is a lot faster than manually transferring the files onto my portable devices over a Wi-Fi connection.

The best part? GPU passthrough is extremely simple these days. I followed the GPU passthrough guide I’d written ages ago when I rebuilt this VM back in February, and I had no trouble getting my graphics card detected on the Windows 11 instance. But if that sounds tiresome, dedicated script repositories like the Proxmox Enhanced Configuration Utility make this process a cakewalk.

On the coding front, I’ve always preferred using virtual machines for projects instead of relying on bare-metal systems. Backups, for example, make recovering from botched experiments as simple as pressing a single button. Besides my automated backup tasks, I have a habit of creating quick snapshots before I start working on a project or if I’m about to mess with a configuration file that can potentially bring down the entire VM – something that happens quite a lot during my DevOps training sessions and PowerShell scripting misadventures.

Finally, nested virtualization is the last missing piece in my Windows 11 VM puzzle. Yes, I’m aware that it drains extra system resources, but it’s perfect for projects that require WSL2 environments and Docker containers. Since my graphics card doesn’t have SR-IOV support, it’s the only way I can develop Linux-based apps requiring GPU acceleration from my Windows 11 VM.

Leaving aside the few multiplayer games I can’t run on my virtual machine, it’s actually pretty effective at helping out with my everyday tasks. If I want to code something, I can log in to it from any system in my arsenal and get cracking without polluting the client machine with unnecessary project files. With my automated snapshot pipeline syncing files with a dedicated Proxmox Backup Server, it remains more error-proof than my daily driver.