web-dev-qa-db-fra.com

désactiver un périphérique PCI spécifique au démarrage

Je viens de réinstaller Debian sur mon ordinateur portable Sony VAIO, et ma dmesg et mes consoles virtuelles sont toutes spammées avec les mêmes messages, encore et encore.

[   59.662381] hub 1-1:1.0: unable to enumerate USB device on port 2
[   59.901732] usb 1-1.2: new high-speed USB device number 91 using ehci_hcd
[   59.917940] hub 1-1:1.0: unable to enumerate USB device on port 2
[   60.157256] usb 1-1.2: new high-speed USB device number 92 using ehci_hcd

Je crois que ces messages proviennent d'un périphérique USB connecté en interne, probablement la webcam (car c'est la seule chose qui ne fonctionne pas). La seule façon pour moi de le faire taire (sans tuer mes ports USB réellement utiles) est de désactiver l'un des contrôleurs d'hôte USB:

# echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbind

Cela enlève aussi mon interface Bluetooth, mais ça me convient.

Je souhaite que ce paramètre persiste afin de pouvoir utiliser à nouveau ma console virtuelle sans problème au cas où j'en aurais besoin. Je veux que mon système d'exploitation (Debian AMD64) ne le réveille jamais, mais je ne sais pas comment faire. J'ai essayé de mettre en liste noire l'alias de module pour le périphérique PCI, mais il semble être ignoré:

$ cat /sys/bus/pci/devices/0000\:00\:1a.0/modalias 
pci:v00008086d00003B3Csv0000104Dsd00009071bc0Csc03i20

$ cat /etc/modprobe.d/blacklist
blacklist pci:v00008086d00003B3Csv0000104Dsd00009071bc0Csc03i20

Comment puis-je m'assurer que ce périphérique PCI spécifique n'est jamais activé automatiquement, sans désactiver complètement son pilote?


- edit - Le module a été renommé récemment, maintenant les travaux suivants de userland:

echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci-pci/unbind

Néanmoins, je cherche un moyen d'empêcher le noyau de lier ce périphérique en premier lieu.

13
Rhymoid

J'ai récemment rencontré ce problème lors de la configuration de ma boîte xen avec plusieurs périphériques USB. Je souhaitais que l'un soit utilisé par Dom-0 et l'autre par une machine virtuelle. J'avais donc besoin que le périphérique soit disponible pour xen-pciback. Cependant, le pilote USB a été intégré à mon noyau, je ne pouvais donc pas simplement le mettre sur liste noire. Ma solution a été de créer un script initramfs personnalisé qui délie le port pci spécifique très tôt dans le processus de démarrage.

Ceci est Ubuntu 2016.04, mais cela devrait fonctionner dans les versions précédentes.

Il y a trois fichiers impliqués. Je les ai nommés pour mon cas d'utilisation spécifique, mais ymmv:

Le premier fichier, nommé /etc/unbindpci, qui est un simple fichier .csv du numéro de périphérique pci et du pilote (à configurer selon les besoins ici):

0000:08:00.0,xhci_hcd
0000:03:00.0,radeon

Deuxième fichier /etc/initramfs-tools/hooks/xenfiles, qui copie la configuration ci-dessus dans initramfs.

#! /bin/bash

if [ -f /etc/unbindpci ]; then
  cp -pP /etc/unbindpci $DESTDIR/etc/unbindpci
fi

Le troisième fichier est ce que fait le travail au démarrage, je l'ai placé dans /etc/initramfs-tools/scripts/init-top/unbind-early-pci:

#!/bin/sh

PREREQ=""
prereqs()
{
        echo "$PREREQ"
}
case $1 in
# get pre-requisites
prereqs)
        prereqs
        exit 0
        ;;
esac

# This only executes if in a xen Dom-0.
# Edit if that's not your use case!          
if [ -f /sys/hypervisor/uuid -a -f /etc/unbindpci ]; then
        if [ $(cat /sys/hypervisor/uuid) = "00000000-0000-0000-0000-000000000000" ]; then
                echo "Unbinding pci ports..."
                IFS=,
                while read addr driver; do
                        if [ -f /sys/bus/pci/drivers/$driver/unbind ]; then
                                echo "Unbinding $addr, device $driver"
                                echo $addr > /sys/bus/pci/drivers/$driver/unbind
                        fi
                done < /etc/unbindpci
        fi
fi

Enfin, exécutez update-initramfs -k all -u et redémarrez.

Je pourrais inclure un support pour les commentaires dans le fichier de configuration, et il y a beaucoup de nettoyage à faire ici, mais cela fonctionne pour moi.

4
Steve Czetty

Vous pouvez supprimer un périphérique PCI en ajoutant une règle udev sous /etc/udev/rules.d:

ACTION=="add", KERNEL=="0000:00:03.0", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:00:03.0/remove'"

Remplacez 0000:00:03.0 par l'adresse de périphérique PCI que vous souhaitez supprimer.

4
lunastorm

Aucune des réponses n'a résolu mon problème similaire, mais ils m'ont mis sur le chemin de le résoudre!

Mon erreur syslog:

[  334.940158] hub 1-0:1.0: unable to enumerate USB device on port 7

C'est un port USB interne pour une option Bluetooth que je n'ai pas.

la suppression de la liaison avec le périphérique pci a simplement entraîné la réapparition du concentrateur sous forme d'un autre concentrateur (5 dans mon cas) et l'inondation de syslog.

Par chance, j'ai remarqué une structure non liée sous /sys/bus/usb/drivers/hub. En utilisant les exemples ci-dessus, je viens d’ajouter ce qui suit dans rc.local:

echo "1-0:1.0" > /sys/bus/usb/drivers/hub/unbind

Le résultat est syslog silence! Maintenant, ajoutons l'exemple de script de kshurig pour la gestion de l'alimentation et je devrais être en or.

4
Kujo770

Trouvé ce fil sur askubuntu:

À l'aide de lspci -vv pour identifier le logement PCI d'un périphérique que vous souhaitez désactiver, vous pouvez utiliser cette commande pour désactiver le périphérique de ce logement:

% echo 0 > /sys/bus/pci/slot/$N/power
2
slm

Lorsque vous avez déjà echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbind dans /etc/rc.local pour le démarrage, il vous suffit de le consigner dans un script pour le désamon de gestion de l'alimentation.

Cela ressemble à ceci: Créez un fichier de script bash exécutable nommé 0_disable_webcam dans le répertoire /etc/pm/sleep.d/:

#!/bin/sh
case "$1" in
        resume|thaw)
                echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbind
                ;;
esac

Cela devrait fonctionner instantanément. Je l'ai essayé avec une clé USB et cela a fonctionné (ce qui signifie qu'il est resté désactivé) tant que le lecteur a été branché. Le rechargement nécessiterait des règles udev, mais comme votre webcam ne sera pas débranchée, il devrait fonctionner. Si cela ne fait pas l'affaire, j'ai une autre suggestion.

2
kschurig

pas une réponse à votre question autant qu'un travail de contournement.

Pourquoi ne pas simplement supprimer la journalisation des messages sur la console en modifiant syslog/(je ne sais pas si vous utilisez syslog ou rsyslog ou autre chose, je ne peux donc pas vous orienter plus précisément dans le bon répertoire, mais si vous le souhaitez. recherchez dans vos fichiers de configuration syslog "console" et "tty", ce qui vous donnerait un bon point de départ - en fait, vous pouvez probablement changer de console en/dev/tty1 [par exemple] et avoir uniquement les messages se connecter à tty1 consoles.

L'autre solution (pour répondre à votre question, mais je n'aime pas), vous pouvez mettre le module ehci_hcd en liste noire (s'il est chargé), ou recompiler votre noyau pour ne l'utiliser que comme module. Regardez h ttp: //www.cyberciti.biz/faq/rhel-redhat-centos-kernel-usb-reset-high-speed-ehci_hcd/ qui résout exactement la question que vous vous posez

0
davidgo