Gaming VM (Win10 Questions)

So I have a great deal off problems when it comes to gaming, and I don’t want to go windows daily driver just because two applications and a bunch of games wont work in Linux.

I have been really interested in creating a Win10 VM though, with a pass-through of my GPU, and since the CPU now has integrated graphics, I can actually pull it off.

It’s a RX 6700 XT. What do I have to think about on beforehand? Should I perhaps also pass-through two or three of my m.2 NVMe’s to install applications and games on? Is that a bit too ambitious? Is there any real benefits to this?

There have been so much irritation for me regarding the games that I own, not being able to be played in linux, and games that I want to test out won’t start etc. "/ I’m thinking, maybe I should make a game-VM.

Are there any suggestions or info that someone cares to share about the situation? I am used to using VM’s in qemu, but I have yet to actually get a pass-through to work.

From my experience, I never got good performance until I actually passed through a HDD with native Win10 installation. It gives the benefit of also being able to boot into the bare metal installation.

The most annoying thing for me has been broken IOMMU groupings when upgrading the BIOS, forcing the use of the ACS patch or BIOS rollback. Depending on your hardware setup you may be fortunate enough to pass an entire controller through.

Another recent annoyance was the vendor reset issue after changing the pass through GPU from a R9 390 to a 5600XT. Fortunately this was resolved with the amazing vendor-reset by gniff.

I don’t really play much multiplayer games but I do know there are cases of games detecting a VM which prevents them from running. I actually encountered this with an indie game once before so that’s something to keep note of.

I now rarely use the VM but I like to have it available and it’s much better than having to dual boot. As you already have the hardware I think it’s worth testing it.

1 Like

Morning @Querzion

I have the same issue. I need Win10 for work support and VR gaming, but use multiple Linux distros for the majority of what I do.

I installed Win10 onto NVMe and I have two Linux drives (Mint and Zorin Pro) on separate drives. They are all independent installs without dual-boot. I go into my BIOS and select the OS I want to boot too. That way I have 100% of my resources for whatever I need to do on the OS I run.

I have a home lab on a pair of HP micro servers as well, but their performance compared to my TR Pro workstation is weedy and they have no GPU. I find the BIOS boot works well and no OS is aware of the others.

Much easier setup to install and maintain and no pass through issues as the OS is native. Simplifies things across the board.

Cheers.

1 Like

I have had decent luck with using GPU passthrough with windows 10 vms. I am running fedora 37, and using a rx480 as my passthrough card. Mostly, i am using qcow images for my gaming vms . I have several vms which i sometimes clone for different games. 1 unactivated windows10 for no mans sky. 1 activated for ARK, etc. I have only directly passed through a drive for a windows 7 gaming VM which i still occasionally use(bare metal drive which i converted to vm), but never as a primary drive for a windows 10 machine. My performance has been pretty good, i can’t recall ever having any major problems or lag issues. However, as i recall getting the initial W10 machine set up was a real pain in the neck and caused all kinds of problems. Otherwise, it works well for my needs.

If it will help, i can post my xml for one of my vms.

1 Like

use VIRTIO, where possible.

once you get GPU passthrough working AVOID making changes to drivers or kernels until something becomes necessary. it will be tempting to grab a new gpu driver that promises 0.1% performance increase, only to have it cost you 2 days while you figure out what the heck happened to your GPU passthrough.

try passing though a NON-gpu device first. the learning experience will be helpful. maybe a NIC or sound card, or any other random device you have.

1 Like

I would very much like to see or have that *.XML. ^^ Is it CPU pinned and such too?

You mean GPU driver on the host machine?
I’m thinking of actually killing the installation that I have on my computer. (ArcoLinux)

I’m thinking of a stable core system. Debian / unRaid or Proxmox, and install VM’s for the systems that I actually want to use. I could have all my gaming on a Win10 machine, since I have noticed it seems to still be too early in the stages of using Linux for gaming. I have had a lot of problems getting some of my games to run, and I have not played some of the titles that I had for years. Since I won’t have Windows on anything then as a VM.

if you do passthrough the host will no longer have any access to the GPU. The VM will ‘own’ the GPU but the kernel on the host, and the driver version on the VM can still cause issues if you get the itch to do any system updates. heck i have had windows update on the VM bork GPU passthrough on that VM so bad that i had to restore from a VM backup.

honestly as of the last about 2 years, i went back to having an actual gaming pc separate. i got into simracing and some of the gear (multiple sound cards for haptics, coms, and actual sound, VR headset, USB pedal box) is a pain to get working on real hardware, i would have strangled myself or someone else dealing with all that and then have some random GPU passthrough glitch bork the entire thing.

1 Like

I recently got myself a T300RS GT wheel. I have had my fair deals of Irritation regarding the games not working properly in Linux, So I’m thinking maybe I should create a VM and hope it doesn’t bork… Stopping the system updates on that VM shouldn’t be a problem… "/

let me give you some perspective.

i drive a 2007 Scion XB that i got for dirt cheap. it gets 30+mpg in town with my lead foot on it.

my home server is almost entirely used, repaired, free, or damaged things. and runs FOSS.

i sometimes skip meals to save money.

i built an entirely separate gaming PC because the frustration of trying to keep ANY extra equipment going on the VM was making me seriously debate my life choices.

1 Like

Sorry it took so long, it’s been a crazy week.
This is the xml for my windows 10 VM which only runs steam and No man’s Sky. I never got around to CPU pinning (probably because i never had any major performance issues).

As Zedicus pointed out, i would also re-iterate. keep the updates to a minimum, especailly graphics drivers, once you find one that works, don’t change it unless absolutely necessary. I think the graphics drive on this vm is several years old.
i have also recently went and got a program called windows aero tweaker, which allows me to control a LOT of windows features and telemetry, most especially trying to get rid of wasteful processes that aren’t needed and cannot be removed through normal means like cortana. I am working on trying to trim down windows to a bare minimun, trying to get my hands on an LTSC version of windows 10, which is a very slimmed down official enterprise version of windows.
Also, i do my best to not let windows update. Whenever possible the only thing that updates is the game.

<domain type="kvm">
  <name>NMS</name>
  <uuid>7a83a8f0-a109-482d-8688-d131f969a6af</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://microsoft.com/win/10"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit="KiB">16777216</memory>
  <currentMemory unit="KiB">16777216</currentMemory>
  <vcpu placement="static">8</vcpu>
  <os>
    <type arch="x86_64" machine="pc-q35-4.1">hvm</type>
    <loader readonly="yes" type="pflash">/usr/share/edk2/ovmf/OVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/NMS_VARS.fd</nvram>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv mode="custom">
      <relaxed state="on"/>
      <vapic state="on"/>
      <spinlocks state="on" retries="8191"/>
    </hyperv>
    <vmport state="off"/>
  </features>
  <cpu mode="host-passthrough" check="none" migratable="on">
    <topology sockets="1" dies="1" cores="4" threads="2"/>
  </cpu>
  <clock offset="localtime">
    <timer name="rtc" tickpolicy="catchup"/>
    <timer name="pit" tickpolicy="delay"/>
    <timer name="hpet" present="no"/>
    <timer name="hypervclock" present="yes"/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled="no"/>
    <suspend-to-disk enabled="no"/>
  </pm>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type="file" device="disk">
      <driver name="qemu" type="qcow2"/>
      <source file="/home/xavier01/Win7vm/NMS.qcow2"/>
      <target dev="sda" bus="sata"/>
      <boot order="2"/>
      <address type="drive" controller="0" bus="0" target="0" unit="0"/>
    </disk>
    <disk type="file" device="cdrom">
      <driver name="qemu" type="raw"/>
      <target dev="sdb" bus="sata"/>
      <readonly/>
      <boot order="1"/>
      <address type="drive" controller="0" bus="0" target="0" unit="1"/>
    </disk>
    <controller type="usb" index="0" model="qemu-xhci" ports="15">
      <address type="pci" domain="0x0000" bus="0x03" slot="0x00" function="0x0"/>
    </controller>
    <controller type="sata" index="0">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x1f" function="0x2"/>
    </controller>
    <controller type="pci" index="0" model="pcie-root"/>
    <controller type="pci" index="1" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="1" port="0x8"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x0" multifunction="on"/>
    </controller>
    <controller type="pci" index="2" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="2" port="0x9"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x1"/>
    </controller>
    <controller type="pci" index="3" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="3" port="0xa"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x2"/>
    </controller>
    <controller type="pci" index="4" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="4" port="0xb"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x3"/>
    </controller>
    <controller type="pci" index="5" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="5" port="0xc"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x4"/>
    </controller>
    <controller type="pci" index="6" model="pcie-to-pci-bridge">
      <model name="pcie-pci-bridge"/>
      <address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
    </controller>
    <controller type="pci" index="7" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="7" port="0xd"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x5"/>
    </controller>
    <controller type="pci" index="8" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="8" port="0xe"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x6"/>
    </controller>
    <interface type="direct">
      <mac address="52:54:00:1d:36:bb"/>
      <source dev="enp7s0" mode="bridge"/>
      <model type="e1000e"/>
      <address type="pci" domain="0x0000" bus="0x02" slot="0x00" function="0x0"/>
    </interface>
    <serial type="pty">
      <target type="isa-serial" port="0">
        <model name="isa-serial"/>
      </target>
    </serial>
    <console type="pty">
      <target type="serial" port="0"/>
    </console>
    <input type="tablet" bus="usb">
      <address type="usb" bus="0" port="3"/>
    </input>
    <input type="mouse" bus="ps2"/>
    <input type="keyboard" bus="ps2"/>
    <sound model="ich9">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x1b" function="0x0"/>
    </sound>
    <audio id="1" type="none"/>
    <hostdev mode="subsystem" type="usb" managed="yes">
      <source>
        <vendor id="0x04d9"/>
        <product id="0x1605"/>
      </source>
      <address type="usb" bus="0" port="1"/>
    </hostdev>
    <hostdev mode="subsystem" type="usb" managed="yes">
      <source>
        <vendor id="0x1bcf"/>
        <product id="0x08a0"/>
      </source>
      <address type="usb" bus="0" port="2"/>
    </hostdev>
    <hostdev mode="subsystem" type="pci" managed="yes">
      <source>
        <address domain="0x0000" bus="0x09" slot="0x00" function="0x0"/>
      </source>
      <address type="pci" domain="0x0000" bus="0x06" slot="0x01" function="0x0"/>
    </hostdev>
    <hostdev mode="subsystem" type="pci" managed="yes">
      <source>
        <address domain="0x0000" bus="0x0e" slot="0x00" function="0x0"/>
      </source>
      <address type="pci" domain="0x0000" bus="0x04" slot="0x00" function="0x0"/>
    </hostdev>
    <hostdev mode="subsystem" type="pci" managed="yes">
      <source>
        <address domain="0x0000" bus="0x0e" slot="0x00" function="0x1"/>
      </source>
      <address type="pci" domain="0x0000" bus="0x05" slot="0x00" function="0x0"/>
    </hostdev>
    <memballoon model="virtio">
      <address type="pci" domain="0x0000" bus="0x07" slot="0x00" function="0x0"/>
    </memballoon>
  </devices>
</domain>

Why don’t you just download the ISO from microsoft and change it? I did with a WIN11 ISO, but when I had to update to the new version a lot of the stuff came back though. "/

This is from my Win11 VM. I made an ISO following the guide above.

Chris Titus is working on a Windows Debloat application.

I have used it a couple of times.

I will look into that.

Everything coming back is a problem i have seen too, as one of my machines which i ran the aero tweaker on has started re-enabling/downloading stuff which i previously removed.
This is why i am interested in the LTSC version, because it’s a slimmed down version that never “re-bloats”.

LOL. it used to be soo much easier with Windows 7 to create a custom DVD with only the programs and services you wanted.

Some day i will find the time to play around with windows.

1 Like

I went with unraid and my win10/11 vm is stuck at 800x600 and the driver doesnt want to work.