-20
hosts/focalor/scripts/end.sh
-20
hosts/focalor/scripts/end.sh
···
1
-
#!/usr/bin/env bash
2
-
set -x
3
-
4
-
virsh nodedev-reattach pci_0000_0a_00_0
5
-
virsh nodedev-reattach pci_0000_0a_00_1
6
-
virsh nodedev-reattach pci_0000_06_00_1
7
-
virsh nodedev-reattach pci_0000_06_00_3
8
-
virsh nodedev-reattach pci_0000_0c_00_3
9
-
10
-
modprobe -r vfio-pci
11
-
12
-
modprobe nvidia_modeset
13
-
modprobe nvidia_uvm
14
-
modprobe nvidia_drm
15
-
modprobe nvidia
16
-
17
-
modprobe -r xhci_pci
18
-
modprobe xhci_pci
19
-
20
-
systemctl restart display-manager
+57
hosts/focalor/scripts/vm-win11-hook.sh
+57
hosts/focalor/scripts/vm-win11-hook.sh
···
1
+
#!/run/current-system/sw/bin/bash
2
+
3
+
readonly GUEST_NAME="$1"
4
+
readonly HOOK_NAME="$2"
5
+
readonly STATE_NAME="$3"
6
+
7
+
function start_hook() {
8
+
# Stops GUI
9
+
systemctl isolate multi-user.target
10
+
11
+
# Avoids race condition
12
+
sleep 2
13
+
14
+
# Unloads the NVIDIA drivers
15
+
modprobe -r nvidia_drm
16
+
modprobe -r nvidia_uvm
17
+
modprobe -r nvidia_modeset
18
+
modprobe -r nvidia
19
+
20
+
# Other code you might want to run
21
+
}
22
+
23
+
function revert_hook() {
24
+
virsh nodedev-reattach pci_0000_0a_00_0
25
+
virsh nodedev-reattach pci_0000_0a_00_1
26
+
virsh nodedev-reattach pci_0000_06_00_1
27
+
virsh nodedev-reattach pci_0000_06_00_3
28
+
virsh nodedev-reattach pci_0000_0c_00_3
29
+
30
+
modprobe -r vfio-pci
31
+
32
+
# Loads the NVIDIA drivers
33
+
modprobe nvidia_modeset
34
+
modprobe nvidia_uvm
35
+
modprobe nvidia_drm
36
+
modprobe nvidia
37
+
38
+
modprobe -r xhci_pci
39
+
modprobe xhci_pci
40
+
41
+
# Starts the UI again
42
+
systemctl restart display-manager
43
+
systemctl isolate graphical.target
44
+
}
45
+
46
+
# I am not using the script from Passthrough-Post
47
+
# because hooks option saves it to /var/lib/libvirt/hooks/qemu.d.
48
+
# It's simpler to just rewrite it for NixOS.
49
+
if [[ "$GUEST_NAME" != "win11" ]]; then
50
+
exit 0
51
+
fi
52
+
53
+
if [[ "$HOOK_NAME" == "prepare" && "$STATE_NAME" == "begin" ]]; then
54
+
start_hook
55
+
elif [[ "$HOOK_NAME" == "release" && "$STATE_NAME" == "end" ]]; then
56
+
revert_hook
57
+
fi
+36
-1
hosts/focalor/vfio.nix
+36
-1
hosts/focalor/vfio.nix
···
18
18
};
19
19
};
20
20
hooks.qemu = {
21
-
end = "./scripts/end.sh";
21
+
"win11" = ./scripts/vm-win11-hook.sh;
22
22
};
23
+
};
24
+
25
+
systemd.services.libvirtd = {
26
+
path = let
27
+
env = pkgs.buildEnv {
28
+
name = "qemu-hook-env";
29
+
paths = with pkgs; [
30
+
bash
31
+
libvirt
32
+
kmod
33
+
systemd
34
+
ripgrep
35
+
sd
36
+
];
37
+
};
38
+
in
39
+
[ env ];
40
+
41
+
/*preStart =
42
+
''
43
+
mkdir -p /var/lib/libvirt/hooks
44
+
mkdir -p /var/lib/libvirt/hooks/qemu.d/win10/prepare/begin
45
+
mkdir -p /var/lib/libvirt/hooks/qemu.d/win10/release/end
46
+
mkdir -p /var/lib/libvirt/vgabios
47
+
48
+
ln -sf /home/regent/symlinks/qemu /var/lib/libvirt/hooks/qemu
49
+
ln -sf /home/regent/symlinks/kvm.conf /var/lib/libvirt/hooks/kvm.conf
50
+
ln -sf /home/regent/symlinks/start.sh /var/lib/libvirt/hooks/qemu.d/win11/prepare/begin/start.sh
51
+
ln -sf /home/regent/symlinks/stop.sh /var/lib/libvirt/hooks/qemu.d/win11/release/end/stop.sh
52
+
53
+
chmod +x /var/lib/libvirt/hooks/qemu
54
+
chmod +x /var/lib/libvirt/hooks/kvm.conf
55
+
chmod +x /var/lib/libvirt/hooks/qemu.d/win11/prepare/begin/start.sh
56
+
chmod +x /var/lib/libvirt/hooks/qemu.d/win11/release/end/stop.sh
57
+
'';*/
23
58
};
24
59
25
60
users.extraUsers.regent.extraGroups = [ "libvirtd" ];
+1
result
+1
result
···
1
+
/nix/store/4483jzzk7w649g57g0p1gfnk2skkz85v-nixos-system-focalor-25.05.20250525.7c43f08