nixcfg/hosts/focalor/scripts/vm-win11-hook.sh
2025-06-16 04:17:13 -04:00

62 lines
1.3 KiB
Bash
Executable file

#!/run/current-system/sw/bin/bash
echo "qemu-hook: ${1} ${2}" >> /tmp/qemu-hook.log
set -x
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
echo "do nothing"
elif [[ "$HOOK_NAME" == "release" && "$STATE_NAME" == "end" ]]; then
revert_hook
fi