12/04/2022

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 !