{ config, lib, pkgs, username, ... }: with lib; let cfg = config.usecases.windows-vm; in { options.usecases.windows-vm = { enable = mkEnableOption "Enable Windows VM things"; }; config = mkIf cfg.enable { programs.dconf.enable = true; users.users.${username}.extraGroups = [ "libvirtd" ]; boot = { kernelParams = [ "amd_iommu=on" "iommu=pt" ]; }; # WARN: sometimes the VM will place hard-coded/hashed paths in the config, # which breaks after NixOS updates because hashes change. # The error might look something like # "Unable to find efi firmware that is compatible with the current configuration". # To fix this, manually edit the VM config in the VM manager in the XML tab of the Boot Options. # Replace # /nix/store/yd1rlziy0cnjjp78zc7wr9dcv5hah16w-qemu-10.1.0/share/qemu/edk2-x86_64-secure-code.fd # /var/lib/libvirt/qemu/nvram/win11_VARS.fd # with # /run/libvirt/nix-ovmf/edk2-x86_64-secure-code.fd # /var/lib/libvirt/qemu/nvram/win11_VARS.fd environment.systemPackages = with pkgs; [ virt-manager virt-viewer spice spice-gtk spice-protocol virtio-win win-spice adwaita-icon-theme qemu ]; virtualisation = { libvirtd = { enable = true; qemu.swtpm.enable = true; }; spiceUSBRedirection.enable = true; }; networking.firewall.trustedInterfaces = [ "virbr0" ]; services = { spice-vdagentd.enable = true; spice-webdavd.enable = true; }; }; }