Skip to content

Instantly share code, notes, and snippets.

@seiferteric
Last active February 13, 2018 08:28
Show Gist options
  • Save seiferteric/6da713564f1e65236229efdd7c9ad22f to your computer and use it in GitHub Desktop.
Save seiferteric/6da713564f1e65236229efdd7c9ad22f to your computer and use it in GitHub Desktop.
Script to start/stop my windows libvirt vm with Nvidia IOMMU GPU Passthrough
#!/bin/bash
DEV1=01:00.0
DEV2=01:00.1
VM=Windows10
NV_VER=384
NV_MIN_VER=111
ACTION=$1
function pcidriver () {
#This was taken from a script I found online:
VENDOR=$(cat /sys/bus/pci/devices/0000\:$1/vendor)
DEVICE=$(cat /sys/bus/pci/devices/0000\:$1/device)
if [ -e /sys/bus/pci/devices/0000\:$1/driver ]; then
echo 0000:$1 > /sys/bus/pci/devices/0000\:$1/driver/unbind
fi
echo $VENDOR $DEVICE > /sys/bus/pci/drivers/$2/new_id
echo 0000:$1 > /sys/bus/pci/drivers/$2/bind
echo $VENDOR $DEVICE > /sys/bus/pci/drivers/$2/remove_id
}
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
if [ "$ACTION" != "start" ] && [ "$ACTION" != "stop" ]; then
echo "usage: $0 [start|stop]"
exit 0
fi
# gnome-session-quit --no-prompt
# sleep 1
echo stopping gdm
systemctl stop gdm.service
while pgrep gdm3 || pgrep Xorg || pgrep gnome-shell || pgrep Xwayland; do
sleep 1
done
if [ $ACTION == "start" ]; then
echo "STARTING VM"
#Set Nvidia card to use vfio-pci driver
while lspci -nnk | grep 'Kernel driver in use: nvidia'; do
echo rebind to vfio
pcidriver $DEV1 vfio-pci
pcidriver $DEV2 vfio-pci
sleep 1
done
echo update alternatives
#Taken from the nvidia deb prerm script
update-alternatives --remove x86_64-linux-gnu_gl_conf /usr/lib/nvidia-$NV_VER/ld.so.conf
update-alternatives --remove x86_64-linux-gnu_egl_conf /usr/lib/nvidia-$NV_VER/ld.so.conf
update-alternatives --remove i386-linux-gnu_gl_conf /usr/lib/nvidia-$NV_VER/alt_ld.so.conf
update-alternatives --remove i386-linux-gnu_egl_conf /usr/lib/nvidia-$NV_VER/alt_ld.so.conf
update-alternatives --remove x86_64-linux-gnu_gl_conf /usr/lib/nvidia-$NV_VER-prime/ld.so.conf
update-alternatives --remove x86_64-linux-gnu_egl_conf /usr/lib/nvidia-$NV_VER-prime/ld.so.conf
update-alternatives --remove i386-linux-gnu_gl_conf /usr/lib/nvidia-$NV_VER-prime/alt_ld.so.conf
update-alternatives --remove i386-linux-gnu_egl_conf /usr/lib/nvidia-$NV_VER-prime/alt_ld.so.conf
update-alternatives --remove glamor_conf /usr/share/nvidia-$NV_VER/glamor.conf
echo starting windows
virsh start $VM
else
echo "STOPPING VM"
echo force stop windows
virsh destroy $VM || true
#Re-set Nvidia card to use Nvidia driver
while ! lspci -nnk | grep 'Kernel driver in use: nvidia'; do
echo rebinding to nvidia
pcidriver $DEV1 nvidia
pcidriver $DEV2 nvidia
sleep 1
done
echo update alternatives
#Taken from the nvidia deb postinst script
update-alternatives --force \
--install /etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf x86_64-linux-gnu_gl_conf /usr/lib/nvidia-$NV_VER/ld.so.conf 8604 \
--slave /usr/share/man/man1/nvidia-xconfig.1.gz x86_64-linux-gnu_man_nvidiaxconfig.gz /usr/share/man/man1/alt-nvidia-$NV_VER-xconfig.1.gz \
--slave /usr/share/man/man1/nvidia-smi.1.gz x86_64-linux-gnu_nvidia-smi.1.gz /usr/share/man/man1/alt-nvidia-$NV_VER-smi.1.gz \
--slave /usr/share/man/man1/nvidia-cuda-mps-control.1.gz x86_64-linux-gnu_nvidia-cuda-mps-control.1.gz /usr/share/man/man1/alt-nvidia-$NV_VER-cuda-mps-control.1.gz \
--slave /usr/share/man/man1/nvidia-persistenced.1.gz x86_64-linux-gnu_man_persistenced.gz /usr/share/man/man1/alt-nvidia-$NV_VER-persistenced.1.gz \
--slave /usr/bin/nvidia-smi x86_64-linux-gnu_nvidia_smi /usr/lib/nvidia-$NV_VER/bin/nvidia-smi \
--slave /usr/bin/nvidia-xconfig x86_64-linux-gnu_nvidia_xconfig /usr/lib/nvidia-$NV_VER/bin/nvidia-xconfig \
--slave /usr/bin/nvidia-bug-report.sh x86_64-linux-gnu_nvidia_bug_report /usr/lib/nvidia-$NV_VER/bin/nvidia-bug-report.sh \
--slave /usr/bin/nvidia-debugdump x86_64-linux-gnu_nvidia-debugdump /usr/lib/nvidia-$NV_VER/bin/nvidia-debugdump \
--slave /usr/bin/nvidia-cuda-mps-control x86_64-linux-gnu_nvidia-cuda-mps-control /usr/lib/nvidia-$NV_VER/bin/nvidia-cuda-mps-control \
--slave /usr/bin/nvidia-cuda-mps-server x86_64-linux-gnu_nvidia-cuda-mps-server /usr/lib/nvidia-$NV_VER/bin/nvidia-cuda-mps-server \
--slave /usr/bin/nvidia-persistenced x86_64-linux-gnu_nvidia_persistenced /usr/lib/nvidia-$NV_VER/bin/nvidia-persistenced \
--slave /usr/share/nvidia/nvidia-application-profiles-$NV_VER.$NV_MIN_VER-rc x86_64-linux-gnu_nvidia_app_profile /usr/share/nvidia-$NV_VER/nvidia-application-profiles-$NV_VER.$NV_MIN_VER-rc \
--slave /usr/share/nvidia/nvidia-application-profiles-$NV_VER.$NV_MIN_VER-key-documentation x86_64-linux-gnu_nvidia_app_profile_keys /usr/share/nvidia-$NV_VER/nvidia-application-profiles-$NV_VER.$NV_MIN_VER-key-documentation \
--slave /usr/lib/xorg/modules/drivers/nvidia_drv.so x86_64-linux-gnu_nvidia_drv /usr/lib/nvidia-$NV_VER/xorg/nvidia_drv.so \
--slave /etc/modprobe.d/nvidia-graphics-drivers.conf x86_64-linux-gnu_nvidia_modconf /lib/nvidia-$NV_VER/modprobe.conf \
--slave /usr/lib/x86_64-linux-gnu/xorg/extra-modules x86_64-linux-gnu_xorg_extra_modules /usr/lib/nvidia-$NV_VER/xorg \
--slave /usr/lib/vdpau/libvdpau_nvidia.so.1 x86_64-linux-gnu_libvdpau_nvidia.so.1 /usr/lib/nvidia-$NV_VER/vdpau/libvdpau_nvidia.so.1 \
--slave /usr/lib/libvdpau_nvidia.so x86_64-linux-gnu_libvdpau_nvidia.so /usr/lib/nvidia-$NV_VER/vdpau/libvdpau_nvidia.so \
--slave /usr/lib32/vdpau/libvdpau_nvidia.so.1 x86_64-linux-gnu_libvdpau_nvidia.so.1_lib32 /usr/lib32/nvidia-$NV_VER/vdpau/libvdpau_nvidia.so.1 \
--slave /usr/lib32/libvdpau_nvidia.so x86_64-linux-gnu_libvdpau_nvidia.so_lib32 /usr/lib32/nvidia-$NV_VER/vdpau/libvdpau_nvidia.so
update-alternatives --force \
--install /etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf x86_64-linux-gnu_egl_conf /usr/lib/nvidia-$NV_VER/ld.so.conf 8604
update-alternatives --force \
--install /etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf x86_64-linux-gnu_gl_conf /usr/lib/nvidia-$NV_VER-prime/ld.so.conf 8603 \
--slave /usr/share/man/man1/nvidia-xconfig.1.gz x86_64-linux-gnu_man_nvidiaxconfig.gz /usr/share/man/man1/alt-nvidia-$NV_VER-xconfig.1.gz \
--slave /usr/share/man/man1/nvidia-smi.1.gz x86_64-linux-gnu_nvidia-smi.1.gz /usr/share/man/man1/alt-nvidia-$NV_VER-smi.1.gz \
--slave /usr/bin/nvidia-smi x86_64-linux-gnu_nvidia_smi /usr/lib/nvidia-$NV_VER/bin/nvidia-smi \
--slave /usr/bin/nvidia-xconfig x86_64-linux-gnu_nvidia_xconfig /usr/lib/nvidia-$NV_VER/bin/nvidia-xconfig \
--slave /usr/bin/nvidia-bug-report.sh x86_64-linux-gnu_nvidia_bug_report /usr/lib/nvidia-$NV_VER/bin/nvidia-bug-report.sh \
--slave /usr/bin/nvidia-debugdump x86_64-linux-gnu_nvidia-debugdump /usr/lib/nvidia-$NV_VER/bin/nvidia-debugdump \
--slave /usr/share/nvidia/nvidia-application-profiles-$NV_VER.$NV_MIN_VER-rc x86_64-linux-gnu_nvidia_app_profile /usr/share/nvidia-$NV_VER/nvidia-application-profiles-$NV_VER.$NV_MIN_VER-rc \
--slave /usr/share/nvidia/nvidia-application-profiles-$NV_VER.$NV_MIN_VER-key-documentation x86_64-linux-gnu_nvidia_app_profile_keys /usr/share/nvidia-$NV_VER/nvidia-application-profiles-$NV_VER.$NV_MIN_VER-key-documentation \
--slave /etc/modprobe.d/nvidia-graphics-drivers.conf x86_64-linux-gnu_nvidia_modconf /lib/nvidia-$NV_VER/modprobe.conf
update-alternatives --force \
--install /etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf x86_64-linux-gnu_egl_conf /usr/lib/nvidia-$NV_VER-prime/ld.so.conf 8603
update-alternatives --force \
--install /etc/ld.so.conf.d/i386-linux-gnu_GL.conf i386-linux-gnu_gl_conf /usr/lib/nvidia-$NV_VER/alt_ld.so.conf 8604
update-alternatives --force \
--install /etc/ld.so.conf.d/i386-linux-gnu_EGL.conf i386-linux-gnu_egl_conf /usr/lib/nvidia-$NV_VER/alt_ld.so.conf 8604
update-alternatives --force \
--install /etc/ld.so.conf.d/i386-linux-gnu_GL.conf i386-linux-gnu_gl_conf /usr/lib/nvidia-$NV_VER-prime/alt_ld.so.conf 8603
update-alternatives --force \
--install /etc/ld.so.conf.d/i386-linux-gnu_EGL.conf i386-linux-gnu_egl_conf /usr/lib/nvidia-$NV_VER-prime/alt_ld.so.conf 8603
update-alternatives --force \
--install /usr/share/X11/xorg.conf.d/glamoregl.conf glamor_conf \
/usr/share/nvidia-$NV_VER/glamor.conf 600
fi
# echo ldconfig
ldconfig
echo starting gdm
systemctl start graphical.target
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment