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

14

Je viens de réinstaller Debian sur mon ordinateur portable Sony VAIO, et mes dmesgconsoles virtuelles et sont toujours 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 pense que ces messages proviennent d'un périphérique USB connecté en interne, très probablement la webcam (car c'est la seule chose qui ne fonctionne pas). La seule façon dont je peux avoir l'air de la fermer (sans tuer mes ports USB réellement utiles) est de désactiver l'un des contrôleurs hôtes USB:

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

Cela supprime également mon interface Bluetooth, mais cela me convient.

Je voudrais que ce paramètre persiste, afin que je puisse à nouveau utiliser sans problème ma console virtuelle 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 sur 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 œuvres suivantes de userland:

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

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

Rhymoid
la source
1
Une approche acceptable consisterait-elle à désactiver ce périphérique USB particulier via le bus USB plutôt que le bus PCI?
slm
Êtes-vous également sûr de pouvoir blacklister en utilisant une chaîne pci: ... comme ça? Je n'ai vu que des modules du noyau mis sur liste noire dans le fichier /etc/modprobe.d/blacklist. Ne pourriez-vous pas utiliser lspci -k pour identifier le module que le périphérique souhaite, puis la liste noire à la place?
slm
Après avoir ajouté l'entrée à la liste noire, l'avez-vous fait update-initramfs -u -k all?
Stefan Seidel
@StefanSeidel: Bon point. Je l'ai maintenant, mais cela ne semble pas aider. Peut-être que slm a raison de penser que la mise sur liste noire d'un modal comme celui-ci nécessite une syntaxe ou une méthode différente.
Rhymoid
@slm: Je ne sais pas si je peux bloquer les modalias via la liste noire de modprobe (mon système semble ignorer la ligne que je lui ai donnée), mais je ne peux pas simplement supprimer le module ( ehci_hcd), car cela désactiverait tous les hôtes USB sur mon système. Je veux juste désactiver cet appareil spécifique, en fonction de son fournisseur, dev, subvendor et subdev.
Rhymoid

Réponses:

4

J'ai récemment rencontré ce problème lors de la configuration de ma boîte xen avec plusieurs périphériques USB. Je voulais que l'un soit utilisé par Dom-0 et que l'autre soit utilisé par une machine virtuelle, j'avais donc besoin que l'appareil soit disponible pour xen-pciback. Cependant, le pilote USB a été respecté dans mon noyau, donc je ne pouvais pas simplement mettre le pilote 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.

Il s'agit d'Ubuntu 2016.04, mais cela devrait fonctionner dans les versions antérieures.

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/unbindpcifichier qui est un simple csv du numéro de périphérique pci et du pilote (configurez-le si nécessaire 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 les initramfs.

#! /bin/bash

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

Le troisième fichier est ce qui 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 -uet redémarrez.

Je pourrais inclure la prise en charge des commentaires dans le fichier de configuration, et il y a beaucoup de nettoyage à faire ici, mais cela fonctionne pour moi.

Steve Czetty
la source
C'est toujours une solution où vous dissociez le périphérique PCI après son initialisation, mais bon, ça a l'air mieux que de le résoudre /etc/init.d! Je n'utilise pas la machine en ce moment, et je ne pourrais jamais la redémarrer avec Debian, donc je ne peux pas la tester. Cependant, parce que cela aurait probablement fonctionné dans mon cas, je l'accepterai comme réponse.
Rhymoid
D'accord, je n'ai toujours pas trouvé de solution pour empêcher l'initialisation de l'appareil sans mettre le module sur liste noire. La ligne "radeon" est un exemple d'une première tentative en ce sens.
Steve Czetty
C'est marrant, je pensais udevque tout le bus traversait et chargeait pendant le démarrage du noyau et que tout ce que faisait grub initramfsétait en lecture seule et perdu. lorsque le noyau est chargé. J'avais essayé d'installer setpcien initramfs-toolsmais a renoncé et je tente une udevrègle maintenant.
WinEunuuchs2Unix
4

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

Mon erreur syslog:

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

Il s'agit d'un port de concentrateur USB interne pour une option Bluetooth que je n'ai pas.

la dissociation du périphérique pci vient d'entraîner la réapparition du concentrateur en tant que autre concentrateur (5 dans mon cas) et d'inonder le syslog davantage.

Par hasard, 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 un silence syslog! Maintenant, pour ajouter l'exemple de script de kshurig pour la gestion de l'alimentation et je devrais être en or.

Kujo770
la source
4

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.0par l'adresse de périphérique PCI que vous souhaitez supprimer

lunastorm
la source
C'est assez utile. Cependant, comme l'OP l'a mentionné, cela entraînera la panne de tous les ports USB. Existe-t-il de toute façon une règle pour un périphérique spécifique et un identifiant de fournisseur afin que les périphériques fonctionnent avec tous les autres ports USB mais ne tiennent pas compte d'un périphérique donné?
Mosty Mostacho
2

Trouvé ce fil sur askubuntu:

Utilisant lspci -vvpour identifier le slot PCI d'un périphérique que vous souhaitez désactiver, il semblait que vous pouviez utiliser cette commande pour désactiver le périphérique de ce slot:

% echo 0 > /sys/bus/pci/slot/$N/power
slm
la source
1
Je sais comment je peux le désactiver à tout autre moment, mais je veux empêcher le noyau de l'activer. De plus, comme il s'agit d'un périphérique PCI câblé (comme la plupart des contrôleurs USB), il n'a pas de slot. La machine dont je parle est un ordinateur portable, et le seul emplacement qu'il possède ( /sys/bus/pci/slots/1) est l'emplacement ExpressCard à l'extérieur, que je peux quitter manuellement.
Rhymoid
2

Si vous avez déjà echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbinddans /etc/rc.localpour le démarrage que vous avez juste besoin de le mettre dans un script pour la gestion de l' alimentation deamon aswell.

Va comme ceci: Créez un fichier de script bash exécutable nommé 0_disable_webcamdans 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 était branché. Le rebranchement aurait besoin de règles udev mais comme votre webcam ne sera pas débranchée, elle devrait fonctionner. Si cela ne fait pas l'affaire, j'ai une autre suggestion.

kschurig
la source
Si ce qui précède ne fonctionne pas, vous devez trouver le bon port USB. Je suppose que c'est "1-1.2" (sinon vérifiez avec tree /sys/bus/pci/devices/0000\:00\:1a.0/sous "usbX" ce qui signifie que le port est un numéro similaire). Si c'est "1-1.2" au lieu de votre, echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbindle script devrait avoir echo "auto" > /sys/bus/usb/devices/1-1.2/power/control; echo -n "1-1.2" > /sys/bus/usb/drivers/usb/unbind.
kschurig
0

pas une réponse à votre question autant qu'une solution 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, donc je ne peux pas vraiment vous pointer plus précisément dans le bon répertoire, mais si vous 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 la console en / dev / tty1 [par exemple] et avoir des messages uniquement enregistrés sur tty1 plutôt que tous consoles.

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

davidgo
la source