Reset son GPU sans reboot le PC
Je sais pas si vous avez remarqué mais quand on éteint sa VM des fois elle redémare pluuuuuus lol. En gros j’ai une VM windows qui ne desalloue pas bien le GPU quand elle s’eteint. La technique est soit de redémarer le PC, redémarrer avec des techniques merdique ou reset le composant PCI.
Récupérer l’identifiant du GPU
Pour récupérer l’identifiant du GPU faut faire exactement de la même manière que j’avais fait dans l’article du PC GAMING
Script pour reset un composant PCI
#!/bin/bash
# e.g. $ ./reset-pci 04:00.0
device=$1
if [ -z "$device" ]; then
echo "Error: no device specified (reset-pci 04:00.0)"
exit 1
fi
if [ ! -e "/sys/bus/pci/devices/$device" ]; then
device="0000:$device"
fi
if [ ! -e "/sys/bus/pci/devices/$device" ]; then
echo "Error: the device \"$device\" is not found"
exit 1
fi
port=$(basename $(dirname $(readlink "/sys/bus/pci/devices/$device")))
if [ ! -e "/sys/bus/pci/devices/$port" ]; then
echo "Error: The device $port not found"
exit 1
fi
echo -e "\nRemoving $device..."
command="echo 1 | tee /sys/bus/pci/devices/$device/remove"
printf "> $command\n"
eval $command
echo -e "\nReset port $port"
command="setpci -s $port BRIDGE_CONTROL"
printf "> $command\n"
BR_CTRL=$(eval $command)
echo "Bridge control: $BR_CTRL"
command=" setpci -s $port BRIDGE_CONTROL=$(printf "%04x" $((0x${BR_CTRL} | 0x40)))"
printf "> $command\n"
eval $command
sleep 0.01
command=" setpci -s $port BRIDGE_CONTROL=$BR_CTRL"
printf "> $command\n"
eval $command
sleep 0.5
echo -e "\nRescanning bus"
command="echo 1 | tee /sys/bus/pci/devices/$port/rescan"
printf "> $command\n"
eval $command
Exemple d’utilisation
./reset-pci 04:00.0
J’ai mis le script dans /usr/bin/reset-pci
. ça me permet de l’utiliser partout.
Hook kvm
A chaque étapes du cycle de vie de la VM, kvm lance des scripts qui peuvent être édité pour lancer vos actions personnalisés.
documentation : https://libvirt.org/hooks.html
Pour créer un hook kvm il faut créer un script /etc/libvirt/hooks/qemu
Attention le script doit obligatoirement avoir le nom qemu
#!/bin/bash
# /etc/libvirt/hooks/qemu
if [ "$2" = "release" ] && [ "$3" = "end" ]; then
reset-pci 10:00.0
fi
Maintenant il te suffit de start et shutdown ta VM !