my nix configs for my servers and desktop
1#!/run/current-system/sw/bin/bash
2
3echo "qemu-hook: ${1} ${2}" >> /tmp/qemu-hook.log
4
5set -x
6
7readonly GUEST_NAME="$1"
8readonly HOOK_NAME="$2"
9readonly STATE_NAME="$3"
10
11function start_hook() {
12 # Stops GUI
13 systemctl isolate multi-user.target
14
15 # Avoids race condition
16 sleep 2
17
18 # Unloads the NVIDIA drivers
19 modprobe -r nvidia_drm
20 modprobe -r nvidia_uvm
21 modprobe -r nvidia_modeset
22 modprobe -r nvidia
23
24 # Other code you might want to run
25}
26
27function revert_hook() {
28 virsh nodedev-reattach pci_0000_0a_00_0
29 virsh nodedev-reattach pci_0000_0a_00_1
30 virsh nodedev-reattach pci_0000_06_00_1
31 virsh nodedev-reattach pci_0000_06_00_3
32 virsh nodedev-reattach pci_0000_0c_00_3
33
34 modprobe -r vfio-pci
35
36 # Loads the NVIDIA drivers
37 modprobe nvidia_modeset
38 modprobe nvidia_uvm
39 modprobe nvidia_drm
40 modprobe nvidia
41
42 modprobe -r xhci_pci
43 modprobe xhci_pci
44
45 # Starts the UI again
46 systemctl restart display-manager
47 systemctl isolate graphical.target
48}
49
50# I am not using the script from Passthrough-Post
51# because hooks option saves it to /var/lib/libvirt/hooks/qemu.d.
52# It's simpler to just rewrite it for NixOS.
53if [[ "$GUEST_NAME" != "win11" ]]; then
54 exit 0
55fi
56
57if [[ "$HOOK_NAME" == "prepare" && "$STATE_NAME" == "begin" ]]; then
58 #start_hook
59 echo "do nothing"
60elif [[ "$HOOK_NAME" == "release" && "$STATE_NAME" == "end" ]]; then
61 revert_hook
62fi