Réinitialiser un périphérique PCI sur Debian
Dans certains cas, il peut être nécessaire de réinitialiser un périphérique PCI sans redémarrer le système. Ce guide présente une méthode de réinitialisation depuis la ligne de commande sous Debian.
Ce guide est testé sur:
- Ubuntu 15.10 Wily Werewolf
Paramètres
Renseignez la chaîne de recherche permettant d'identifier le périphérique PCI dans le résultat de la commande lspci (ici pour les contrôleurs USB):
pciSearchString="USB controller"
Réinitialisation des périphériques
Détectez le proxy de commande (command ou sudo):
cmdProxy='command'
command type -f 'sudo' &>'/dev/null' && cmdProxy='sudo'
Détection des informations
Récupérez les identifiants PCI complets des périphériques:
pciIds="$(command lspci \
| command egrep -i "${pciSearchString}" \
| command cut -c -7)"
Identifiez les pilotes des périphériques:
declare -a pciInfos=()
for pciId in ${pciIds}; do
pciInfos+=( "$(command lspci -v -s "${pciId}" \
| command grep 'Kernel driver in use' \
| command sed -e "s/^.*: /${pciId}|/")" )
done
Réinitialisation
Réinitialisez les périphériques en les déliant puis reliant à leur pilote (bind / unbind):
for pciInfo in "${pciInfos[@]}"; do pciId="${pciInfo%|*}"
longPciId="0000:${pciId}"
driver="${pciInfo#*|}" if [[ -e "/sys/bus/pci/drivers/${driver}/${longPciId}" ]]; then
echo "Unbinding ${pciId} from ${driver}"
echo " echo '${longPciId}' > '/sys/bus/pci/drivers/${driver}/unbind'"
echo "${longPciId}" | ${cmdProxy} tee "/sys/bus/pci/drivers/${driver}/unbind" > '/dev/null'
fi if [[ -n "${pciId}" && -e "/sys/bus/pci/drivers/${driver}/bind" ]]; then
echo "Binding ${pciId} to ${driver}"
echo " echo '${longPciId}' > '/sys/bus/pci/drivers/${driver}/bind'"
echo "${longPciId}" | ${cmdProxy} tee "/sys/bus/pci/drivers/${driver}/bind" > '/dev/null'
fi
done
Vérifiez la réinitialisation à l'aide de dmesg:
${cmdProxy} dmesg