I've talked before about how I wish I could use Linux as a daily driver on my computer, but there are several blockers to me doing so that have prevented me from being able to make the switch. However, I recently built a rather overpowered Proxmox-based machine, and I've been migrating some of my older services while adding new ones to it. Among those services is a full-fledged Ubuntu Server install, with 400 GB of storage, 16GB of RAM, and about half of the Intel Core i7-14700K's cores assigned to it. With the magic of remote desktop technology, I can use it as if it were a native machine.

Before diving into how to do it, I'm sure you're wondering why I don't just install a virtual machine on my primary PC, instead of using Proxmox and a remote desktop. The answer to that question is answered by the difficulties I faced with switching to Linux on my main PC in the first place, as a virtual machine on my main PC is also, unfortunately, not an option. With this method, I get the best of both worlds: a full Linux install that feels native, while nothing is actually touching my primary computer.

Turning Ubuntu Server into a fully remote desktop environment on Proxmox

The "tasksel" program is the best way to do it

 
Credit:  

The first step was fairly obvious: given that Ubuntu Server, as the name suggests, doesn't ship with a graphical environment out of the box. That's actually the primary difference between the two, as they use the same application repositories and can be converted from one to the other with relative ease. Thankfully, there's an easy tool to install a graphical environment that handles everything for you, and that's "tasksel". I opted for KDE Plasma, both because I had never actually used it before, and I really like the advanced features that it has in customization and extensibility.

Once I ran tasksel and selected KDE Plasma, it installed everything for me. If you have a non-US keyboard, you may need to change the locale in the /usr/share/sddm/scripts/Xsetup file. Here, I added "set xkbmap 'gb'" which allowed me to log in from the Proxmox UI after rebooting. If you find yourself locked out of your account and unable to add this, you can press Ctrl+Alt+F3 to get to the regular terminal window from within the Proxmox UI when the noVNC window is open.

Crucially, installing KDE Plasma with tasksel will also automatically install XRDP, which is an open-source implementation of Microsoft's Remote Desktop Protocol. The beauty of it is that connecting from any device will automatically dictate the resolution of the virtual machine. Connect from a device with a 4K screen? You'll connect to a 4K session. The only downside I've found with this configuration is that I can't access anything network-related from inside KDE Plasma, as it doesn't seem to understand that my Ubuntu install uses cloud-init. None of the GUI applications think I have an internet connection, though I imagine there's a way to get this working by modifying netplan.

This brings me to the next hurdle, though, and that's audio. By default, audio forwarding over RDP is a bit hit-or-miss on Linux, and XRDP has it disabled by default. However, there's a PipeWire module that you can compile and run in less than five minutes. I just went line by line through the instructions on the official GitHub repository to install it, and after restarting my VM, audio came through perfectly. I was able to listen to Spotify without any problem through my RDP session.

Of course, there are some limitations to this setup. Aside from network problems (which I suspect is due to cloud-init) is the most annoying, but the most universal will undoubtedly be latency. Microsoft's RDP is actually pretty robust and often praised for its simplicity, but there are a couple of frames of delay even over my 2.5 GbE LAN. It's good enough for work though, and as someone who would typically be quite sensitive to that, I was impressed by how quick it is.

Why not use Sunshine and Moonlight? Well, the answer is that it didn't really work. It froze immediately when I connected, and threw an error saying it didn't have permission to start the virtual input adapters. Furthermore, I'd see the first frame of whatever was on the screen, but I could see that it had entirely frozen as nothing I did in my RDP session was reflected in my Moonlight client. When I started Sunshine as root (to see if it would solve the permissions problem), it allowed me to connect to the login screen, but then threw a generic error and disconnected me. There are automated ways to get it working with a virtual display, but honestly, RDP works well enough that I wasn't bothered investing the time into it.

It's the best of both worlds for me

A VM that's accessible from any device

As I can't run a Linux VM on my main PC, this is the best of both worlds. It's an entirely isolated virtual machine accessible from any of my devices, even if my computer is off. I can access it remotely via Tailscale, or use it on the same network as if it were a native machine. It's fast enough to not bother me, especially when I'm just writing, and it's a full-fledged Linux install with ample resources for development, research, and work.

If you want to run a Linux VM on Proxmox and want the flexibility of turning it into a desktop environment you can access remotely, give this a try. It's been incredibly powerful, very useful, and I love how seamlessly it works. The native adaptation to my primary monitor's resolution is a big plus, and it's "plug and play" in a way I simply didn't expect.

Linux often gets a bad rap for being complicated, but aside from needing to compile the audio module myself, this was surprisingly simple. I was pleasantly surprised.