<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>maydayv7</title>
      <link>https://maydayv7.dev</link>
      <description>My Personal Website</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://maydayv7.dev/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Sat, 27 Jun 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Windows VM</title>
          <pubDate>Sat, 27 Jun 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://maydayv7.dev/blog/nixos/win11vm/</link>
          <guid>https://maydayv7.dev/blog/nixos/win11vm/</guid>
          <description xml:base="https://maydayv7.dev/blog/nixos/win11vm/">&lt;h1 id=&quot;intro&quot;&gt;Intro&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#intro&quot;
  aria-label=&quot;Anchor link for: intro&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#intro&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;This is a guide to running a Windows 11 VM with an NVIDIA dGPU passed straight through to it, displayed via &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;looking-glass.io&#x2F;&quot;&gt;Looking Glass&lt;&#x2F;a&gt; directly on the primary display (no secondary monitor required), CPU-pinned and hugepage-backed for lower latency, and defined declaratively with &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;AshleyYakeley&#x2F;NixVirt&quot;&gt;NixVirt&lt;&#x2F;a&gt; - all on NixOS.&lt;&#x2F;p&gt;
&lt;p&gt;I run this on a laptop with an AMD Ryzen CPU, an integrated Radeon iGPU, and an NVIDIA RTX 4060. Any other host with 2 GPUs, or a dGPU + iGPU, should work the same way.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#prerequisites&quot;
  aria-label=&quot;Anchor link for: prerequisites&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#prerequisites&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CPU support for &lt;strong&gt;IOMMU&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;A GPU you can dedicate to the VM that sits alone in its &lt;strong&gt;own IOMMU group&lt;&#x2F;strong&gt;. Check with:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellsession&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; for&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; d&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;sys&#x2F;kernel&#x2F;iommu_groups&#x2F;*&#x2F;devices&#x2F;*&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-output&quot;&gt;    echo &amp;quot;Group ${d%&#x2F;devices&#x2F;*}: $(lspci -nns ${d##*&#x2F;})&amp;quot;; done | sort&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Find your GPU and note its &lt;code&gt;vendor:device&lt;&#x2F;code&gt; IDs:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellsession&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ lspci -nnk -s 01:00.0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-output&quot;&gt;01:00.0 VGA compatible controller [0300]: NVIDIA ... [10de:28e0]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-output&quot;&gt;01:00.1 Audio device [0403]: NVIDIA ... [10de:22be]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Download ISOs:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Windows 11&lt;&#x2F;strong&gt; - Download from &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.microsoft.com&#x2F;software-download&#x2F;windows11&quot;&gt;Microsoft&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;virtio-win&lt;&#x2F;strong&gt; - The para-virtual Windows drivers: &lt;code&gt;nix build nixpkgs#virtio-win&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;binding-the-gpu-for-vfio&quot;&gt;Binding the GPU for VFIO&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#binding-the-gpu-for-vfio&quot;
  aria-label=&quot;Anchor link for: binding-the-gpu-for-vfio&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#binding-the-gpu-for-vfio&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;The core idea is to bind the GPU to the &lt;code&gt;vfio-pci&lt;&#x2F;code&gt; stub driver &lt;strong&gt;at boot, before its real driver&lt;&#x2F;strong&gt; kicks in. How you do that depends on your setup:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Case A - the host renders on a &lt;em&gt;different&lt;&#x2F;em&gt; GPU&lt;&#x2F;strong&gt; (Eg. your desktop runs on the iGPU). Just bind the dGPU permanently:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;boot&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;initrd&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;kernelModules&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;vfio&amp;quot; &amp;quot;vfio_pci&amp;quot; &amp;quot;vfio_iommu_type1&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;boot&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;kernelParams&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;  &amp;quot;amd_iommu=on&amp;quot; &amp;quot;iommu=pt&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;  &amp;quot;vfio-pci.ids=10de:28e0,10de:22be&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; # your GPU + its audio function&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Case B - the host renders on the &lt;em&gt;same&lt;&#x2F;em&gt; GPU you want to pass&lt;&#x2F;strong&gt; (Eg. NVIDIA PRIME Sync, where the desktop holds &lt;code&gt;nvidia_drm&lt;&#x2F;code&gt;). A NixOS &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.nixos.org&#x2F;wiki&#x2F;Specialisation&quot;&gt;specialisation&lt;&#x2F;a&gt; can be used: your default boot keeps the GPU for the desktop, and a different boot entry binds it to &lt;code&gt;vfio-pci&lt;&#x2F;code&gt; instead:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;specialisation.vfio.configuration = {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  boot = {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    blacklistedKernelModules = [   # don&amp;#39;t load host driver&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;quot;nvidia&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;quot;nvidia_drm&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;quot;nvidia_modeset&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;quot;nvidia_uvm&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   ];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ...   # rest is same as above&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You reboot, pick the &lt;code&gt;vfio&lt;&#x2F;code&gt; entry , and reboot back to normal afterwards.&lt;&#x2F;p&gt;
&lt;p&gt;Either way, confirm after booting:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellsession&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ lspci -nnk -s 01:00.0 &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;|&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;in use&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-output&quot;&gt;        Kernel driver in use: vfio-pci&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;em&gt;Dynamic GPU passthrough (w&#x2F;o reboot) is possible, but is cumbersome and comes with its own set of drawbacks&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;building-the-vm&quot;&gt;Building the VM&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#building-the-vm&quot;
  aria-label=&quot;Anchor link for: building-the-vm&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#building-the-vm&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;First, enable libvirt&#x2F;QEMU on the host. The essentials are &lt;code&gt;libvirtd&lt;&#x2F;code&gt; itself, &lt;code&gt;swtpm&lt;&#x2F;code&gt; (the software TPM that Windows 11 requires), SPICE USB redirection, and &lt;code&gt;virt-manager&lt;&#x2F;code&gt; to drive it all - plus adding your user to the &lt;code&gt;libvirtd&lt;&#x2F;code&gt; and &lt;code&gt;kvm&lt;&#x2F;code&gt; groups so you can manage VMs and open &lt;code&gt;&#x2F;dev&#x2F;kvm&lt;&#x2F;code&gt; without &lt;code&gt;sudo&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{ pkgs, ... }: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  virtualisation.libvirtd = {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    enable = true;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    qemu = {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      package = pkgs.qemu_kvm;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      runAsRoot = false;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      swtpm.enable = true;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  virtualisation.spiceUSBRedirection.enable = true;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  programs.virt-manager.enable = true;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  users.users.&amp;lt;you&amp;gt;.extraGroups = [ &amp;quot;libvirtd&amp;quot; &amp;quot;kvm&amp;quot; ];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The guest disk should be a raw block device or image (rather than an emulated SATA disk) for performance. I back it with a sparse ZFS zvol (a &lt;code&gt;qcow2&lt;&#x2F;code&gt; file works just as well):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellsession&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;$ sudo zfs create -s -V 120G -o volblocksize&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;16k&lt;&#x2F;span&gt;&lt;span&gt; &amp;lt;pool&amp;gt;&#x2F;vm&#x2F;windows&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# appears as &#x2F;dev&#x2F;zvol&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;pool&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;vm&#x2F;windows&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now create a standard Windows 11 guest (&lt;code&gt;virt-manager&lt;&#x2F;code&gt; makes this easy, you may refer to &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;sysguides.com&#x2F;install-a-windows-11-virtual-machine-on-kvm&quot;&gt;&lt;strong&gt;this guide&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;). The settings that matter:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Q35&lt;&#x2F;strong&gt; chipset + &lt;strong&gt;UEFI&#x2F;OVMF&lt;&#x2F;strong&gt; with &lt;strong&gt;Secure Boot&lt;&#x2F;strong&gt;, and &lt;strong&gt;TPM 2.0&lt;&#x2F;strong&gt; (&lt;code&gt;swtpm&lt;&#x2F;code&gt;) - Windows 11 requires the latter two.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;host-passthrough&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; CPU.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;virtio everywhere&lt;&#x2F;strong&gt; - disk (on the zvol above) with &lt;code&gt;cache=none&lt;&#x2F;code&gt;, &lt;code&gt;io=native&lt;&#x2F;code&gt;, &lt;code&gt;discard=unmap&lt;&#x2F;code&gt;; virtio NIC (for performance).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Hyper-V enlightenments&lt;&#x2F;strong&gt; so Windows uses its kernel fast paths.&lt;&#x2F;li&gt;
&lt;li&gt;A &lt;strong&gt;QEMU guest agent&lt;&#x2F;strong&gt; channel.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;On AMD, in the Hyper-V block, omit &lt;code&gt;&amp;lt;evmcs&#x2F;&amp;gt;&lt;&#x2F;code&gt; - that enlightenment is Intel-only and the VM won&#x27;t start with it. A good set:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;hyperv&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; mode&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;custom&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;relaxed&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; state&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;on&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;vapic&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; state&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;on&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;spinlocks&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; state&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;on&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; retries&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;8191&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;vpindex&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; state&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;on&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;runtime&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; state&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;on&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;synic&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; state&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;on&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;stimer&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; state&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;on&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;frequencies&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; state&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;on&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;tlbflush&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; state&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;on&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ipi&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; state&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;on&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;avic&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; state&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;on&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;hyperv&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Since the disk is virtio, the Windows installer won&#x27;t see it until you &lt;strong&gt;Load driver&lt;&#x2F;strong&gt; from the mounted &lt;code&gt;virtio-win.iso&lt;&#x2F;code&gt; (&lt;code&gt;viostor\w11\amd64&lt;&#x2F;code&gt;, then &lt;code&gt;NetKVM&lt;&#x2F;code&gt; for network). After install, run &lt;code&gt;virtio-win-guest-tools&lt;&#x2F;code&gt; for the rest. Finally, add the GPU (and its audio function) as PCI host devices.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;looking-glass&quot;&gt;Looking Glass&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#looking-glass&quot;
  aria-label=&quot;Anchor link for: looking-glass&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#looking-glass&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;A passed-through GPU usually has no monitor attached, so &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;looking-glass.io&#x2F;&quot;&gt;Looking Glass&lt;&#x2F;a&gt; captures the guest framebuffer and passes it through a shared-memory device into a client window on the NixOS host, with very low latency.&lt;&#x2F;p&gt;
&lt;p&gt;The transport is the &lt;code&gt;kvmfr&lt;&#x2F;code&gt; kernel module, which exposes &lt;code&gt;&#x2F;dev&#x2F;kvmfr0&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;boot&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;  extraModulePackages&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; config&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;boot&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;kernelPackages&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;kvmfr&lt;&#x2F;span&gt;&lt;span&gt; ];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;  kernelModules&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;kvmfr&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;  extraModprobeConfig&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;options kvmfr static_size_mb=64&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;# Add your user to the &amp;#39;kvm&amp;#39; group to open the device&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;services&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;udev&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;extraRules&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;  SUBSYSTEM==&amp;quot;kvmfr&amp;quot;, KERNEL==&amp;quot;kvmfr0&amp;quot;, MODE=&amp;quot;0660&amp;quot;, GROUP=&amp;quot;kvm&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;environment&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;systemPackages&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;looking-glass-client&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Give the VM the matching &lt;code&gt;ivshmem&lt;&#x2F;code&gt; device via a &lt;code&gt;&amp;lt;qemu:commandline&amp;gt;&lt;&#x2F;code&gt; block that points &lt;code&gt;mem-path&lt;&#x2F;code&gt; at &lt;code&gt;&#x2F;dev&#x2F;kvmfr0&lt;&#x2F;code&gt; (this needs &lt;code&gt;xmlns:qemu=&#x27;http:&#x2F;&#x2F;libvirt.org&#x2F;schemas&#x2F;domain&#x2F;qemu&#x2F;1.0&#x27;&lt;&#x2F;code&gt; on the root &lt;code&gt;&amp;lt;domain&amp;gt;&lt;&#x2F;code&gt; tag):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;qemu:commandline&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;qemu:arg&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; value&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;-device&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;qemu:arg&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; value&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;ivshmem-plain,id=shmem0,memdev=looking-glass,bus=pcie.0,addr=0x0a&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;qemu:arg&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; value&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;-object&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;qemu:arg&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; value&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;memory-backend-file,id=looking-glass,mem-path=&#x2F;dev&#x2F;kvmfr0,size=67108864,share=yes&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;qemu:commandline&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Inside Windows, install the following:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NVIDIA driver&lt;&#x2F;strong&gt; - Automatic via Windows Update.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A virtual display driver&lt;&#x2F;strong&gt; (&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;VirtualDrivers&#x2F;Virtual-Display-Driver&quot;&gt;MikeTheTech&#x27;s VDD&lt;&#x2F;a&gt;) - gives the desktop a head to render on. Its config (&lt;code&gt;C:\VirtualDisplayDriver\vdd_settings.xml&lt;&#x2F;code&gt;) can pin the virtual display to a specific GPU and define exact modes, so bind it to the passed-through GPU at your native resolution:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;vdd_settings&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;monitors&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;count&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;1&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;count&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;monitors&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;gpu&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;friendlyname&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;NVIDIA GeForce RTX 4060 Laptop GPU&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;friendlyname&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;gpu&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;resolutions&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;resolution&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;width&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;2560&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;width&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;height&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;1600&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;height&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;refresh_rate&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;165&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;refresh_rate&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;resolution&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;resolutions&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;vdd_settings&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Looking Glass (host)&lt;&#x2F;strong&gt; - its build &lt;strong&gt;must match the client build exactly&lt;&#x2F;strong&gt;. Its installer also provides the IVSHMEM driver for the &quot;PCI standard RAM Controller&quot; device in Device Manager. Install it as a &lt;strong&gt;service&lt;&#x2F;strong&gt; (&lt;code&gt;looking-glass-host.exe InstallService&lt;&#x2F;code&gt;) rather than launching it interactively - the service can capture the secure desktop, so UAC prompts don&#x27;t black out the stream, and it starts at boot on its own.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Then run &lt;code&gt;looking-glass-client&lt;&#x2F;code&gt; on the host, and a full-resolution Windows desktop appears in a window, GPU-accelerated, captured off the GPU framebuffer over DirectX 12. Keyboard, mouse and clipboard ride back over SPICE.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;performance-tuning&quot;&gt;Performance tuning&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#performance-tuning&quot;
  aria-label=&quot;Anchor link for: performance-tuning&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#performance-tuning&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;The values below (which cores, how many hugepages) are &lt;strong&gt;machine-specific&lt;&#x2F;strong&gt; - compute them from your own topology.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;cpu-pinning&quot;&gt;CPU pinning&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#cpu-pinning&quot;
  aria-label=&quot;Anchor link for: cpu-pinning&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#cpu-pinning&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;By default the scheduler shuffles vCPUs across host threads and runs QEMU&#x27;s emulator&#x2F;IO threads on top of them, which shows up as frame-time spikes.
Pin each guest vCPU to a fixed host thread, matching SMT siblings, and push the emulator&#x2F;IO threads onto separate housekeeping cores.
Find your sibling pairs first:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellsession&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ cat &#x2F;sys&#x2F;devices&#x2F;system&#x2F;cpu&#x2F;cpu&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;topology&#x2F;thread_siblings_list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For a 6-vCPU guest whose host has siblings &lt;code&gt;N&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;N+8&lt;&#x2F;code&gt;, mapping three physical cores (2, 3, 4) and keeping cores 0–1 for the host:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;vcpu&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; placement&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;static&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;6&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;vcpu&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;iothreads&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;1&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;iothreads&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;cputune&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;vcpupin&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; vcpu&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;0&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; cpuset&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;2&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;vcpupin&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; vcpu&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;1&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; cpuset&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;10&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &amp;lt;!-- core 2 --&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;vcpupin&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; vcpu&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;2&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; cpuset&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;3&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;vcpupin&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; vcpu&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;3&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; cpuset&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;11&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &amp;lt;!-- core 3 --&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;vcpupin&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; vcpu&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;4&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; cpuset&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;4&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;vcpupin&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; vcpu&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;5&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; cpuset&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;12&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;  &amp;lt;!-- core 4 --&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;emulatorpin&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; cpuset&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;0-1,8-9&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;iothreadpin&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; iothread&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;1&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; cpuset&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;0-1,8-9&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;cputune&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Assign that iothread to the virtio disk so storage interrupts stay off the cores:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;driver&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; name&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;qemu&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; type&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;raw&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; cache&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;none&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; io&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;native&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; discard&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;unmap&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; iothread&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;1&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;core-isolation&quot;&gt;Core isolation&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#core-isolation&quot;
  aria-label=&quot;Anchor link for: core-isolation&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#core-isolation&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Pinning chooses which host threads the guest uses - isolating those cores stops the host from scheduling its own work there.
If your passthrough lives in a dedicated boot entry, scope the isolation to it so it costs nothing during normal use:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;boot&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;kernelParams&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;  &amp;quot;isolcpus=2-4,10-12&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;  &amp;quot;nohz_full=2-4,10-12&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;  &amp;quot;rcu_nocbs=2-4,10-12&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;hugepages&quot;&gt;Hugepages&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#hugepages&quot;
  aria-label=&quot;Anchor link for: hugepages&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#hugepages&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Backing the guest RAM with 1 GiB hugepages reduces TLB misses and the cost of memory virtualisation (more about latency consistency than throughput).
Reserve them at boot - and since they&#x27;re held exclusively, this is another good thing to scope to the boot entry:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;boot&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;kernelParams&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;default_hugepagesz=1G&amp;quot; &amp;quot;hugepagesz=1G&amp;quot; &amp;quot;hugepages=16&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; # 16 GiB&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Request them in the domain, and drop the memory balloon (it fights fixed hugepage-backed RAM):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;memoryBacking&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;hugepages&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;page&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; size&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;1048576&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; unit&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;KiB&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;hugepages&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;memoryBacking&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;memballoon&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; model&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;none&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
&lt;p&gt;Keep these in sync: the &lt;code&gt;&amp;lt;cputune&amp;gt;&lt;&#x2F;code&gt; cpuset must match &lt;code&gt;isolcpus&lt;&#x2F;code&gt;, and the hugepage count must match the guest&#x27;s RAM.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;other-tweaks&quot;&gt;Other tweaks&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#other-tweaks&quot;
  aria-label=&quot;Anchor link for: other-tweaks&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#other-tweaks&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Run the host CPU governor at &lt;code&gt;performance&lt;&#x2F;code&gt; (&lt;code&gt;powerManagement.cpuFreqGovernor = &quot;performance&quot;&lt;&#x2F;code&gt;). Inside Windows, a few standard tweaks help:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bcdedit &#x2F;set useplatformclock No&lt;&#x2F;code&gt; - with Hyper-V enlightenments on, leaving it enabled hurts performance.&lt;&#x2F;li&gt;
&lt;li&gt;Disable &lt;strong&gt;SysMain &#x2F; SuperFetch&lt;&#x2F;strong&gt;, set &lt;strong&gt;Visual Effects → best performance&lt;&#x2F;strong&gt;, and disable &lt;strong&gt;ScheduledDefrag&lt;&#x2F;strong&gt; (never defrag a virtio disk).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;declarative-domain-configuration&quot;&gt;Declarative Domain configuration&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#declarative-domain-configuration&quot;
  aria-label=&quot;Anchor link for: declarative-domain-configuration&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#declarative-domain-configuration&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;AshleyYakeley&#x2F;NixVirt&quot;&gt;NixVirt&lt;&#x2F;a&gt; manages libvirt domains from Nix and accepts an XML file directly:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt;{ inputs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt; pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;, ...&lt;&#x2F;span&gt;&lt;span&gt; }: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;  imports&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; inputs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;nixvirt&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;nixosModules&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;default&lt;&#x2F;span&gt;&lt;span&gt; ];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;  virtualisation&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;libvirt&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;    enable&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;    package&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;libvirt&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;    connections&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;qemu:&#x2F;&#x2F;&#x2F;system&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;domains&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;        definition&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; .&#x2F;windows.xml&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;        active&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; null&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;active = null&lt;&#x2F;code&gt; is important: NixVirt redefines the domain on every rebuild but never starts, stops or destroys a running guest.&lt;&#x2F;p&gt;
&lt;p&gt;If you use &lt;strong&gt;impermanence&lt;&#x2F;strong&gt; (an erase-on-boot root), the domain definition is now regenerated from Nix, so you only need to persist the actual state. Two directories matter:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;environment&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;persist&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;directories&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;  &amp;quot;&#x2F;var&#x2F;lib&#x2F;libvirt&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; # NVRAM, swtpm state, networks&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;  &amp;quot;&#x2F;var&#x2F;lib&#x2F;systemd&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; # Host key that decrypts libvirt&amp;#39;s secrets&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Also ensure the disk image itself is persisted.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;networking&quot;&gt;Networking&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#networking&quot;
  aria-label=&quot;Anchor link for: networking&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#networking&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;The virtio NIC on libvirt&#x27;s default network gives the guest internet through NAT out of the box. Just run the following command once:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellsession&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ virsh -c qemu:&#x2F;&#x2F;&#x2F;system net-autostart default&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h1 id=&quot;file-sharing&quot;&gt;File sharing&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#file-sharing&quot;
  aria-label=&quot;Anchor link for: file-sharing&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#file-sharing&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;virtio-fs.gitlab.io&#x2F;&quot;&gt;virtiofs&lt;&#x2F;a&gt; shares a host directory straight into the guest over a shared-memory transport - much faster than SMB.
Point a &lt;code&gt;&amp;lt;filesystem&amp;gt;&lt;&#x2F;code&gt; device at the host path and give it a tag:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;filesystem&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; type&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;mount&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; accessmode&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;passthrough&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;driver&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; type&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;virtiofs&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; queue&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;1024&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;source&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; dir&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;&#x2F;data&#x2F;files&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;target&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; dir&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;Files&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;filesystem&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The device needs access to guest RAM, so the memory backing must be &lt;strong&gt;shared&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;memoryBacking&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;hugepages&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;page&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; size&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;1048576&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; unit&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;KiB&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;hugepages&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;access&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; mode&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;shared&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;memoryBacking&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Host-side, libvirt spawns the &lt;code&gt;virtiofsd&lt;&#x2F;code&gt; daemon - just hand it the package:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;virtualisation&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;libvirtd&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;qemu&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;vhostUserPackages&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;virtiofsd&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Inside Windows, the &lt;code&gt;virtio-win-guest-tools&lt;&#x2F;code&gt; installer ships the &lt;strong&gt;VirtIO-FS&lt;&#x2F;strong&gt; driver and the &lt;code&gt;VirtioFsSvc&lt;&#x2F;code&gt; service. You must additionally install &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;winfsp.dev&#x2F;&quot;&gt;WinFSP&lt;&#x2F;a&gt; - the user-mode filesystem layer it depends on, then start the service so it mounts (set it to Automatic so it survives reboots):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellsession&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; sc start VirtioFsSvc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h1 id=&quot;usb-passthrough&quot;&gt;USB passthrough&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#usb-passthrough&quot;
  aria-label=&quot;Anchor link for: usb-passthrough&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#usb-passthrough&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;For an &lt;strong&gt;ad-hoc&lt;&#x2F;strong&gt; device, &lt;code&gt;virt-manager&lt;&#x2F;code&gt; is the easiest route: open the running guest, &lt;em&gt;Add Hardware → USB Host Device&lt;&#x2F;em&gt;, pick it from the list, and it&#x27;s hot-plugged into Windows. SPICE USB redirection is also enabled, so the &lt;em&gt;Redirect USB Device&lt;&#x2F;em&gt; menu option can be used as well.&lt;&#x2F;p&gt;
&lt;p&gt;For something you want &lt;strong&gt;always&lt;&#x2F;strong&gt; attached - say a webcam - bind it by USB ID in the domain instead. Find it with &lt;code&gt;lsusb&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellsession&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ lsusb&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-meta z-output&quot;&gt;Bus 003 Device 002: ID 3277:0018 Sonix Technology Co., Ltd. USB2.0 FHD UVC WebCam&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then add a USB &lt;code&gt;&amp;lt;hostdev&amp;gt;&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;hostdev&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; mode&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;subsystem&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; type&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;usb&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; managed&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;yes&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;source&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;vendor&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; id&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;0x3277&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;product&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; id&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;#39;0x0018&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;source&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;hostdev&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h1 id=&quot;useful-commands&quot;&gt;Useful commands&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#useful-commands&quot;
  aria-label=&quot;Anchor link for: useful-commands&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#useful-commands&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;Run as your user (in the &lt;code&gt;libvirtd&lt;&#x2F;code&gt; + &lt;code&gt;kvm&lt;&#x2F;code&gt; groups, no &lt;code&gt;sudo&lt;&#x2F;code&gt; needed):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellsession&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ virsh -c qemu:&#x2F;&#x2F;&#x2F;system list --all&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ virsh -c qemu:&#x2F;&#x2F;&#x2F;system start    windows&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;$ virsh -c qemu:&#x2F;&#x2F;&#x2F;system shutdown windows --mode&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;agent&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;   # Clean shutdown&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ virsh -c qemu:&#x2F;&#x2F;&#x2F;system destroy  windows&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;                # Force off&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ virsh -c qemu:&#x2F;&#x2F;&#x2F;system net-dhcp-leases default&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;         # Guest IP&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# Peek at the guest headlessly&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ virsh -c qemu:&#x2F;&#x2F;&#x2F;system screenshot windows --file &#x2F;tmp&#x2F;vm.ppm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ nix shell nixpkgs#imagemagick -c magick &#x2F;tmp&#x2F;vm.ppm &#x2F;tmp&#x2F;vm.png&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h1 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#wrapping-up&quot;
  aria-label=&quot;Anchor link for: wrapping-up&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#wrapping-up&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;You may refer to my own &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;maydayv7&#x2F;dotfiles&quot;&gt;configuration&lt;&#x2F;a&gt;, which sets up all of the above (on the host &lt;code&gt;valkyrie&lt;&#x2F;code&gt;), if you&#x27;d like a reference.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Prelude</title>
          <pubDate>Wed, 17 Dec 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://maydayv7.dev/blog/nixos/prelude/</link>
          <guid>https://maydayv7.dev/blog/nixos/prelude/</guid>
          <description xml:base="https://maydayv7.dev/blog/nixos/prelude/">&lt;h1 id=&quot;i-don-t-know-linux&quot;&gt;I don&#x27;t know Linux&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#i-don-t-know-linux&quot;
  aria-label=&quot;Anchor link for: i-don-t-know-linux&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#i-don-t-know-linux&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;Go away.&lt;br &#x2F;&gt;
If you’re looking for a beginner’s guide, this is not it. This is a postmortem of a bad idea that worked.&lt;&#x2F;p&gt;
&lt;p&gt;I sadly do not possess much time, and quite frankly, most of the rest of this page&#x2F;series will go over your head.&lt;br &#x2F;&gt;
However, if your tastes are sufficiently messed up - or if you enjoy watching someone over-engineer their computer to the point of absurdity - this might hopefully be a fun read.&lt;&#x2F;p&gt;
&lt;p&gt;My entire life has been a contradiction of sorts, notwithstanding the OS I currently use.
I chose arguably the most difficult distro to learn to use specifically so I would never have to learn how to fix it again.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;what-is-this-nixos-thing&quot;&gt;What is this &quot;NixOS&quot; thing?&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#what-is-this-nixos-thing&quot;
  aria-label=&quot;Anchor link for: what-is-this-nixos-thing&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#what-is-this-nixos-thing&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;If you&#x27;ve ever used Linux before (like Ubuntu or Arch), you know the drill: you install the OS, you run a bunch of terminal commands to install software, you edit a text file here and there, and eventually, you have a system that feels like home.&lt;&#x2F;p&gt;
&lt;p&gt;But you also know the &lt;strong&gt;fear&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The fear that if you delete the wrong file, mess with the wrong package, or even upgrade to a new release, your computer might implode, and you&#x27;ll have no idea how to get back to the way things were.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;That&#x27;s it I&#x27;m &lt;em&gt;&amp;lt;redacted&amp;gt;&lt;&#x2F;em&gt; switching back to Windows forever&lt;br &#x2F;&gt;
--&amp;gt; &lt;strong&gt;Me&lt;&#x2F;strong&gt; &lt;del&gt;(right after the 69420th distro-hop that caused my system to crash and burn)&lt;&#x2F;del&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NixOS is different.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Basically, you define a &lt;strong&gt;blueprint&lt;&#x2F;strong&gt; - a single configuration file that describes exactly how you want your computer to function.
You want Firefox? You write &lt;code&gt;firefox&lt;&#x2F;code&gt; in the file. You wanna set your wallpaper? Just chuck it into the file.&lt;&#x2F;p&gt;
&lt;p&gt;After you&#x27;re done, &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;NixOS&#x2F;nix&quot;&gt;Nix&lt;&#x2F;a&gt; reads it, and builds your entire operating system to match exactly what you wrote.
If you mess up, you just undo the text in the file, and your computer goes back to being perfect.
And oh, lest I forget to mention, you’d never have to deal with the godforsaken dependency hell &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;And now for the theatrics...&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-descent-into-madness&quot;&gt;The Descent into Madness&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#the-descent-into-madness&quot;
  aria-label=&quot;Anchor link for: the-descent-into-madness&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#the-descent-into-madness&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;It started innocently enough. I just wanted a system that was &lt;strong&gt;reproducible&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I began with &lt;strong&gt;Nix Flakes&lt;&#x2F;strong&gt;, the &quot;Gateway Drug&quot; &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; of the ecosystem.
Instead of vaguely gesturing at a repository and hoping for the best, &lt;code&gt;flake.nix&lt;&#x2F;code&gt; declares every input my system depends on, and &lt;code&gt;flake.lock&lt;&#x2F;code&gt; pins each one to an exact revision.
It is the ultimate insurance policy: if I build this system today, or in about 10 years in the midst of an imminent meteor strike, I will get the exact same system &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#4&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;But having a reproducible system wasn&#x27;t enough. It had to be &lt;strong&gt;obedient&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I pulled in &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nix-community&#x2F;home-manager&quot;&gt;&lt;strong&gt;Home Manager&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt; because configuring the OS wasn&#x27;t enough; I needed to micromanage my user config files too.
Then came &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nix-community&#x2F;stylix&quot;&gt;&lt;strong&gt;Stylix&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;. I declare a single image and a color scheme, and Stylix enforces this theme across everything. It generates CSS for &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Alexays&#x2F;Waybar&quot;&gt;Waybar&lt;&#x2F;a&gt;, restyles all my apps, and even bullies my terminal into submission.
But why stop there? I grabbed &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Gerg-L&#x2F;spicetify-nix&quot;&gt;&lt;strong&gt;Spicetify&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt; to force Spotify to match my aesthetic, and &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FlameFlag&#x2F;nixcord&quot;&gt;&lt;strong&gt;Nixcord&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt; for Discord cuz why the heck not.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&quot;Okay, it&#x27;s pretty,&quot; you say. &quot;But is it useful?&quot;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;You have no idea &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#4&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I don&#x27;t &quot;install&quot; development tools. I have a &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;maydayv7&#x2F;dotfiles&#x2F;tree&#x2F;stable&#x2F;shells&quot;&gt;directory&lt;&#x2F;a&gt; that defines isolated environments for C++, Python, JavaScript and so on.
When I &lt;code&gt;cd&lt;&#x2F;code&gt; into a project, &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;direnv.net&#x2F;&quot;&gt;Direnv&lt;&#x2F;a&gt; and &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nix-community&#x2F;lorri&quot;&gt;&lt;strong&gt;Lorri&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt; kick in, and the compiler, linter, LSP and whatnot along with all of their configuration just &lt;em&gt;appear&lt;&#x2F;em&gt; in my shell. When I leave, they vanish.&lt;&#x2F;p&gt;
&lt;p&gt;Every little thing is specified in code, from backups to network settings and even complex editor workflows (thanks for your concern, but I very likey my trusty &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.visualstudio.com&#x2F;&quot;&gt;VS Code&lt;&#x2F;a&gt;).
Heck, even my &lt;strong&gt;&lt;em&gt;Printer&lt;&#x2F;em&gt;&lt;&#x2F;strong&gt; configuration is defined in a Nix file.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Well what else do ya need?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I still wanted to play games and run Android apps. A normal person would dual-boot or use an emulator.&lt;&#x2F;p&gt;
&lt;p&gt;I run &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;waydroid&#x2F;waydroid&quot;&gt;Waydroid&lt;&#x2F;a&gt; to run Android in a container.
Then, for the &lt;em&gt;pièce de résistance&lt;&#x2F;em&gt;, I set up &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;docs.kernel.org&#x2F;driver-api&#x2F;vfio.html&quot;&gt;VFIO&lt;&#x2F;a&gt; GPU Passthrough &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#3&quot;&gt;4&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;. I pass that GPU directly into a Windows VM and use &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;looking-glass.io&#x2F;&quot;&gt;Looking Glass&lt;&#x2F;a&gt; to stream the video output back to my PC screen with negligible latency.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve also declaratively configured &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Infinidoge&#x2F;nix-minecraft&quot;&gt;&lt;strong&gt;Minecraft Servers&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt; &lt;em&gt;(cuz that 2 week period happens every other month for me, don&#x27;t judge)&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;At this point most people would stop&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Well I didn&#x27;t.&lt;&#x2F;p&gt;
&lt;p&gt;I needed to know that my system was &lt;em&gt;spiritually&lt;&#x2F;em&gt; pure. So I formatted my drive with &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;openzfs&#x2F;zfs&quot;&gt;ZFS&lt;&#x2F;a&gt; (its own &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;itsfoss.com&#x2F;what-is-zfs&#x2F;&quot;&gt;merits&lt;&#x2F;a&gt; aside) and implemented &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nix-community&#x2F;impermanence&quot;&gt;&lt;strong&gt;Impermanence&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;.
Every time I reboot, my root dataset rolls back to an empty snapshot. Wiped. Gone. My OS comes back from a blank slate every boot, preserving only what I explicitly whitelist on a separate dataset.
To manage secrets without em dying in the purge, I use &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Mic92&#x2F;sops-nix&quot;&gt;&lt;strong&gt;sops-nix&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt; to encrypt passwords and API keys using GPG, directly into my publicly hosted &lt;code&gt;git&lt;&#x2F;code&gt; repo, without leaking any sensitive data.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;The result of all this?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If I buy a new computer today, I don&#x27;t spend a week installing drivers and recovering my workflow.&lt;&#x2F;p&gt;
&lt;p&gt;I clone my repository. I run one single command.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;del&gt;And I doomscroll&lt;&#x2F;del&gt;. Soon as I return &lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#4&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;, I spin up an AAA Windows game, displayed on a tiling Linux WM (heck, even choose between &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;hypr.land&#x2F;&quot;&gt;Hyprland&lt;&#x2F;a&gt; and &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;YaLTeR&#x2F;niri&quot;&gt;Niri&lt;&#x2F;a&gt;), on a system that deletes and rebuilds itself on every boot.&lt;&#x2F;p&gt;
&lt;p&gt;God, I love NixOS, and I hate it cuz now I can&#x27;t go back to anything else.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;a-fair-warning&quot;&gt;A Fair Warning&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#a-fair-warning&quot;
  aria-label=&quot;Anchor link for: a-fair-warning&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#a-fair-warning&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;Before you rush off to install this magical operating system, we need to have a serious chat.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;NixOS is hard.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;And I don&#x27;t mean &quot;Linux is hard&quot; kind of hard. Its more &quot;I have to relearn how everything works&quot; kind of hard.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It is not standard Linux&lt;&#x2F;strong&gt;: Most tutorials you find on the internet simply will not work here. You can&#x27;t just &lt;code&gt;apt install&lt;&#x2F;code&gt; your problems away.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;The Documentation is... sparse&lt;&#x2F;strong&gt;: Sometimes you will be reading a manual, and sometimes you will be reading 10-year-old Reddit threads praying for an answer.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Patience is key&lt;&#x2F;strong&gt; (&lt;em&gt;or severe OCD tbh&lt;&#x2F;em&gt;): If you are not acquainted with the command line, programming languages, random crash logs, or want a computer that &quot;just works&quot; to play games or browse the web, consider yourself warned. Cuz this setup costs time, sanity, and a concerning amount of self-restraint.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;still-reading&quot;&gt;Still Reading?&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#still-reading&quot;
  aria-label=&quot;Anchor link for: still-reading&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#still-reading&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;If you really want to get dirty with Nix and decide to invest oodles of your time into building your own configuration, my &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;maydayv7&#x2F;dotfiles&quot;&gt;repository&lt;&#x2F;a&gt; can be used as inspiration.
You can check out the list of links below to resourceful Nix documentation&#x2F;tutorials&#x2F;projects that may be helpful in your endeavour, as they were in mine.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;links&quot;&gt;Links&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#links&quot;
  aria-label=&quot;Anchor link for: links&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#links&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;See:&lt;&#x2F;strong&gt; A &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nix-community&#x2F;awesome-nix&quot;&gt;Curated List&lt;&#x2F;a&gt; of the best resources in the Nix Community&lt;br &#x2F;&gt;
&lt;strong&gt;Also:&lt;&#x2F;strong&gt; &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;nixos-and-flakes.thiscute.world&#x2F;&quot;&gt;This&lt;&#x2F;a&gt; website for beginners starting out with NixOS and Flakes&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Official &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;nixos.org&#x2F;learn.html&quot;&gt;Documentation&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;NixOS &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;nixos.org&#x2F;manual&#x2F;nixpkgs&#x2F;stable&quot;&gt;Manual&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Nix &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;nixos.org&#x2F;guides&#x2F;nix-pills&#x2F;&quot;&gt;Pills&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;NixOS &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;discourse.nixos.org&#x2F;&quot;&gt;Discourse&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;NixOS &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;search.nixos.org&#x2F;&quot;&gt;Package Search&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;NixOS&#x2F;nixpkgs&quot;&gt;&lt;code&gt;nixpkgs&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; Package Repository&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nix-community&#x2F;NUR&quot;&gt;NUR&lt;&#x2F;a&gt; Nix User Repository&lt;&#x2F;li&gt;
&lt;li&gt;NixOS &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nixos&#x2F;nixos-hardware&quot;&gt;Hardware Modules&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Home Manager &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;nix-community.github.io&#x2F;home-manager&#x2F;options.html&quot;&gt;Options&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;other-sources&quot;&gt;Other Sources&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#other-sources&quot;
  aria-label=&quot;Anchor link for: other-sources&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#other-sources&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Tweag &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.tweag.io&#x2F;blog&#x2F;2020-05-25-flakes&#x2F;&quot;&gt;Article&lt;&#x2F;a&gt; introducing Flakes&lt;&#x2F;li&gt;
&lt;li&gt;Serokell&#x27;s &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;serokell.io&#x2F;blog&#x2F;practical-nix-flakes&quot;&gt;Blog&lt;&#x2F;a&gt; on Flakes&lt;&#x2F;li&gt;
&lt;li&gt;Jordan Isaac&#x27;s &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;jdisaacs.com&#x2F;series&#x2F;nixos-desktop&#x2F;&quot;&gt;Blog&lt;&#x2F;a&gt; for porting configuration to Flakes&lt;&#x2F;li&gt;
&lt;li&gt;Jon Ringer&#x27;s &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;channel&#x2F;UC-cY3DcYladGdFQWIKL90SQ&quot;&gt;Videos&lt;&#x2F;a&gt; on general NixOS Tooling and Hackery&lt;&#x2F;li&gt;
&lt;li&gt;Justin&#x27;s &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;justinwoo&#x2F;nix-shorts&quot;&gt;Notes&lt;&#x2F;a&gt; on using Nix&lt;&#x2F;li&gt;
&lt;li&gt;Lan Tian&#x27;s Series of &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;lantian.pub&#x2F;en&#x2F;article&#x2F;modify-website&#x2F;nixos-initial-config-flake-deploy.lantian&#x2F;&quot;&gt;Blog Posts&lt;&#x2F;a&gt; on NixOS&lt;&#x2F;li&gt;
&lt;li&gt;Christine&#x27;s &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;christine.website&#x2F;blog&#x2F;series&#x2F;nixos&quot;&gt;Blog Posts&lt;&#x2F;a&gt; addressing NixOS Security&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;grahamc.com&#x2F;blog&#x2F;erase-your-darlings&quot;&gt;Graham&#x27;s&lt;&#x2F;a&gt; and &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;elis.nu&#x2F;blog&#x2F;2020&#x2F;05&#x2F;nixos-tmpfs-as-root&#x2F;&quot;&gt;Elis&#x27;&lt;&#x2F;a&gt; Blog Posts on Ephemeral Partition Schemes&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;other-configurations&quot;&gt;Other Configurations&lt;a
  class=&quot;zola-anchor&quot;
  href=&quot;#other-configurations&quot;
  aria-label=&quot;Anchor link for: other-configurations&quot;
  onclick=&quot;navigator.clipboard.writeText(window.location.origin + window.location.pathname + &#x27;#other-configurations&#x27;); this.style.color=&#x27;var(--accent-secondary)&#x27;; setTimeout(() =&gt; this.style.color=&#x27;&#x27;, 1000); return false;&quot;
  &gt;§&lt;&#x2F;a
&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Here are some repositories that I may have shamelessly rummaged through for building my &lt;code&gt;dotfiles&lt;&#x2F;code&gt;:&lt;br &#x2F;&gt;
&lt;em&gt;Thanks a lot! ;)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;4JX&#x2F;nixos-config&quot;&gt;4JX&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;code.balsoft.ru&#x2F;balsoft&#x2F;nixos-config&quot;&gt;balsoft&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bbigras&#x2F;nix-config&quot;&gt;bbigras&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cole-h&#x2F;nixos-config&#x2F;&quot;&gt;cole-h&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cole-mickens&#x2F;nixcfg&quot;&gt;colemickens&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;davidtwco&#x2F;veritas&quot;&gt;davidtwco&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;fufexan&#x2F;dotfiles&quot;&gt;fufexan&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gvolpe&#x2F;nix-config&quot;&gt;gvolpe&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hlissner&#x2F;dotfiles&quot;&gt;hlissner&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jordanisaacs&#x2F;dotfiles&quot;&gt;jordanisaacs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;kclejeune&#x2F;system&quot;&gt;kclejeune&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lovesegfault&#x2F;nix-config&quot;&gt;lovesegfault&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lucasew&#x2F;nixcfg&quot;&gt;lucasew&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;NobbZ&#x2F;nixos-config&quot;&gt;nobbz&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rasendubi&#x2F;dotfiles&quot;&gt;rasendubi&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sioodmy&#x2F;dotfiles&quot;&gt;sioodmy&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tejing1&#x2F;nixos-config&quot;&gt;tejing1&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vlaci&#x2F;nixos-config&quot;&gt;vlaci&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;wiltaylor&#x2F;dotfiles&quot;&gt;wiltaylor&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;wimpysworld&#x2F;nix-config&quot;&gt;wimpysworld&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Dependency_hell&quot;&gt;Wiki&lt;&#x2F;a&gt; for life&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;2&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;2&lt;&#x2F;sup&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;gateway-drug.urbanup.com&#x2F;2175521&quot;&gt;Meaning&lt;&#x2F;a&gt; ig&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;3&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;4&lt;&#x2F;sup&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;PCI_passthrough_via_OVMF&quot;&gt;Arch Wiki&lt;&#x2F;a&gt; &lt;em&gt;my love&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;4&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;3&lt;&#x2F;sup&gt;
&lt;p&gt;T&amp;amp;C Apply ;)&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</description>
      </item>
      <item>
          <title>Hello World!</title>
          <pubDate>Tue, 15 Feb 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://maydayv7.dev/blog/hello/</link>
          <guid>https://maydayv7.dev/blog/hello/</guid>
          <description xml:base="https://maydayv7.dev/blog/hello/">&lt;p&gt;&lt;strong&gt;Hello World!&lt;&#x2F;strong&gt;
Just following tradition ;)&lt;&#x2F;p&gt;
&lt;p&gt;This website is generated by &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt; using a modified version of the &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ejmg&#x2F;zerm&quot;&gt;&lt;code&gt;zerm&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; Theme, with support for custom color schemes, and math typesetting using &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;katex.org&#x2F;&quot;&gt;$\KaTeX$&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https:&amp;#x2F;&amp;#x2F;maydayv7.dev&amp;#x2F;test&quot;&gt;Test Page&lt;&#x2F;a&gt;
 to view the capabilities of this website&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
