From e0c6926ba044fdfde43793d47d6a07b564be83ff Mon Sep 17 00:00:00 2001 From: waveringana Date: Sun, 15 Jun 2025 05:57:32 -0400 Subject: [PATCH] more fixes --- hosts/focalor/scripts/end.sh | 20 --------- hosts/focalor/scripts/vm-win11-hook.sh | 57 ++++++++++++++++++++++++++ hosts/focalor/vfio.nix | 37 ++++++++++++++++- result | 1 + 4 files changed, 94 insertions(+), 21 deletions(-) delete mode 100644 hosts/focalor/scripts/end.sh create mode 100644 hosts/focalor/scripts/vm-win11-hook.sh create mode 120000 result diff --git a/hosts/focalor/scripts/end.sh b/hosts/focalor/scripts/end.sh deleted file mode 100644 index a08a269..0000000 --- a/hosts/focalor/scripts/end.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -set -x - -virsh nodedev-reattach pci_0000_0a_00_0 -virsh nodedev-reattach pci_0000_0a_00_1 -virsh nodedev-reattach pci_0000_06_00_1 -virsh nodedev-reattach pci_0000_06_00_3 -virsh nodedev-reattach pci_0000_0c_00_3 - -modprobe -r vfio-pci - -modprobe nvidia_modeset -modprobe nvidia_uvm -modprobe nvidia_drm -modprobe nvidia - -modprobe -r xhci_pci -modprobe xhci_pci - -systemctl restart display-manager diff --git a/hosts/focalor/scripts/vm-win11-hook.sh b/hosts/focalor/scripts/vm-win11-hook.sh new file mode 100644 index 0000000..59b39f5 --- /dev/null +++ b/hosts/focalor/scripts/vm-win11-hook.sh @@ -0,0 +1,57 @@ +#!/run/current-system/sw/bin/bash + +readonly GUEST_NAME="$1" +readonly HOOK_NAME="$2" +readonly STATE_NAME="$3" + +function start_hook() { + # Stops GUI + systemctl isolate multi-user.target + + # Avoids race condition + sleep 2 + + # Unloads the NVIDIA drivers + modprobe -r nvidia_drm + modprobe -r nvidia_uvm + modprobe -r nvidia_modeset + modprobe -r nvidia + + # Other code you might want to run +} + +function revert_hook() { + virsh nodedev-reattach pci_0000_0a_00_0 + virsh nodedev-reattach pci_0000_0a_00_1 + virsh nodedev-reattach pci_0000_06_00_1 + virsh nodedev-reattach pci_0000_06_00_3 + virsh nodedev-reattach pci_0000_0c_00_3 + + modprobe -r vfio-pci + + # Loads the NVIDIA drivers + modprobe nvidia_modeset + modprobe nvidia_uvm + modprobe nvidia_drm + modprobe nvidia + + modprobe -r xhci_pci + modprobe xhci_pci + + # Starts the UI again + systemctl restart display-manager + systemctl isolate graphical.target +} + +# I am not using the script from Passthrough-Post +# because hooks option saves it to /var/lib/libvirt/hooks/qemu.d. +# It's simpler to just rewrite it for NixOS. +if [[ "$GUEST_NAME" != "win11" ]]; then + exit 0 +fi + +if [[ "$HOOK_NAME" == "prepare" && "$STATE_NAME" == "begin" ]]; then + start_hook +elif [[ "$HOOK_NAME" == "release" && "$STATE_NAME" == "end" ]]; then + revert_hook +fi \ No newline at end of file diff --git a/hosts/focalor/vfio.nix b/hosts/focalor/vfio.nix index e0d73f7..ebd2e0c 100755 --- a/hosts/focalor/vfio.nix +++ b/hosts/focalor/vfio.nix @@ -18,9 +18,44 @@ }; }; hooks.qemu = { - end = "./scripts/end.sh"; + "win11" = ./scripts/vm-win11-hook.sh; }; }; + systemd.services.libvirtd = { + path = let + env = pkgs.buildEnv { + name = "qemu-hook-env"; + paths = with pkgs; [ + bash + libvirt + kmod + systemd + ripgrep + sd + ]; + }; + in + [ env ]; + + /*preStart = + '' + mkdir -p /var/lib/libvirt/hooks + mkdir -p /var/lib/libvirt/hooks/qemu.d/win10/prepare/begin + mkdir -p /var/lib/libvirt/hooks/qemu.d/win10/release/end + mkdir -p /var/lib/libvirt/vgabios + + ln -sf /home/regent/symlinks/qemu /var/lib/libvirt/hooks/qemu + ln -sf /home/regent/symlinks/kvm.conf /var/lib/libvirt/hooks/kvm.conf + ln -sf /home/regent/symlinks/start.sh /var/lib/libvirt/hooks/qemu.d/win11/prepare/begin/start.sh + ln -sf /home/regent/symlinks/stop.sh /var/lib/libvirt/hooks/qemu.d/win11/release/end/stop.sh + + chmod +x /var/lib/libvirt/hooks/qemu + chmod +x /var/lib/libvirt/hooks/kvm.conf + chmod +x /var/lib/libvirt/hooks/qemu.d/win11/prepare/begin/start.sh + chmod +x /var/lib/libvirt/hooks/qemu.d/win11/release/end/stop.sh + '';*/ + }; + users.extraUsers.regent.extraGroups = [ "libvirtd" ]; } \ No newline at end of file diff --git a/result b/result new file mode 120000 index 0000000..3785af3 --- /dev/null +++ b/result @@ -0,0 +1 @@ +/nix/store/4483jzzk7w649g57g0p1gfnk2skkz85v-nixos-system-focalor-25.05.20250525.7c43f08 \ No newline at end of file