Imagine you could run anything you want on a windows virtual machine with minimal loss of performance. Written by André Clemente, MD3 Team Software Engineer
You could do anything from testing some software, edit videos or even play highly demanding games.
Kernel-based Virtual Machine (KVM) is an open-source virtualization technology built into Linux. Specifically, KVM lets you turn Linux into a hypervisor that allows a host machine to run multiple, isolated virtual environments called guests or virtual machines.
Virtual Machines are pretty standard nowadays. People use them 100% out of the box with no problems. But when you think of the possibility of having a virtual machine with same or really close performance as bare-metal it seems unreal. But that can be accomplished by a KVM, which is also a really easy setup. The challenge begins when you want to do PCI passthrough.
KVM converts Linux into a type-1 (bare-metal) hypervisor. All hypervisors need some operating system-level components, such as a memory manager, process scheduler, input/output (I/O) stack, device drivers, security manager, a network stack and more, to run VMs.
KVM has all these components because it’s part of the Linux kernel. Every VM is implemented as a regular Linux process, scheduled by the standard Linux scheduler, with dedicated virtual hardware like a network card, graphics adapter, CPU(s), memory, and disks.
Well, I guess it depends on what your goal is. When I first heard about KVM, I was really curious about how much performance could I get on a Windows VM, because I would really like to remove the dual boot (Linux & Windows) from my computer and just have Linux. But I still want to use Windows sometimes, mostly for playing games… so here it starts my little big project. Now I really want to try this.
I started by watching a tutorial explaining how to do it and I tried to replicate it. The problem is that I own a laptop, not a desktop. Which becomes my first big obstacle. Why? Well, basically your laptop can either be MUXless, which means that, instead of directly connecting to the monitor, the dGPU transfers the rendered image to iGPU, which in turn sends them to the monitor or MUXed where there is a switch on the motherboard circuit and the HDMI port and the monitor can be allocated to different GPUs on-demand.
Unfortunately, my laptop is MUXless. I’ve searched all over the internet and finally some sign of hope: HDMI dummy plug. So let’s try it! Nope, it doesn’t work, you dummy… Your HDMI connector is not connected directly to the GPU. Here is where my expectations were really low, but I couldn’t forget about this… So I’ve found Intel’s GVT-g and this really took my experience inside the Windows Guest to another level, I had finally 3d acceleration! But not enough... So none of those alternatives would provide.
I just couldn’t let it go, there had to be a way. And then, I’ve learned about eGPU (External GPU).
So, would my laptop be compatible with an eGPU? This would be a really long hard shot. Maybe it wasn’t even worth trying… But there was a cheap component that I could buy to test it… Here we go!!!
I built an eGPU with an EXP GDC Beast, put a NVIDIA 1660 Super on it and voilà! It works!!!
Great to finally have my Windows Guest working as I would like, or do I? Well, there’s a game with a monster anti-cheat that doesn’t let me play on a VM… Oh, no! So what could I do?
There are actually some ways to hide a VM from being detected by the guest. So, one more challenge to overcome. I found out that enabling nested virtualization would make my guest “think” that it isn’t a VM itself and bang!
Of course, there’s always some tweak I can do to make it a little better, but overall it’s done. As you can realize, it wasn’t an easy process. But now that it is accomplished, I actually feel good about it and I’ve learned a lot.
If you would like to try it, here are some useful links:
Cookie | Duration | Description |
---|---|---|
_GRECAPTCHA | 6 months | Set by google api recaptcha. Used to validate form submission. It does not store any personal data. |
cookielawinfo-checkbox-analytics | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics". |
cookielawinfo-checkbox-necessary | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary". |
CookieLawInfoConsent | 6 months | The cookie is set by the GDPR Cookie Consent plugin and is used to store the consented cookie categories options. It does not store any personal data. |
pll_language | 6 months | The cookie is set by Polylang plugin and is used to store the selected language. It does not store any personal data. |
viewed_cookie_policy | 11 months | The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data. |
Cookie | Duration | Description |
---|---|---|
_ga | 2 years | This cookie is set by Google Analytics. The cookie is used to calculate visitor, session, campaign data and track site usage for the site's analytics report. Cookies store information anonymously and assign a randomly generated number to identify unique visitors. |
_ga_122676620_1 | 2 years | Set by Google to distinguish users. Connections on the same site only. |
_gac_gb_UA-122676620-1 | 90 days | This cookie is set by Google Analytics. Connections on the same site only. |
_gid | 24 hours | This cookie is set by Google Analytics. The cookie is used to store information about how visitors use a website and helps create an analytics report on how the website is doing. The data collected, including the number of visitors, the source from which they came and the pages visited in an anonymous form. |