disabilita il dispositivo PCI specifico all'avvio


14

Ho appena reinstallato Debian sul mio laptop VAIO Sony e tutte le mie dmesgconsole virtuali vengono spammate più volte con gli stessi messaggi.

[   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

Credo che questi messaggi provengano da un dispositivo USB collegato internamente, molto probabilmente dalla webcam (poiché questa è l'unica cosa che non funziona). L'unico modo in cui riesco a farlo chiudere (senza uccidere le mie porte USB effettivamente utili) è disabilitare uno dei controller host USB:

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

Questo toglie anche la mia interfaccia Bluetooth, ma sto bene.

Vorrei che questa impostazione persistesse, in modo da poter utilizzare indolore la mia console virtuale in caso di necessità. Voglio che il mio sistema operativo (Debian amd64) non lo riattivi mai, ma non so come farlo. Ho provato a inserire nella blacklist l'alias del modulo per il dispositivo PCI, ma sembra essere ignorato:

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

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

Come posso garantire che questo specifico dispositivo PCI non venga mai attivato automaticamente, senza disabilitare del tutto il suo driver?


-edit- Il modulo è stato rinominato di recente, ora i seguenti lavori da userland:

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

Tuttavia, sto cercando un modo per impedire al kernel di associare quel dispositivo in primo luogo.


1
Un approccio accettabile sarebbe disabilitare questo particolare dispositivo USB attraverso il bus USB anziché il bus PCI?
slm,

Inoltre sei sicuro di poter inserire nella blacklist una stringa del tipo pci: ...? Ho mai visto i moduli del kernel solo nella lista nera nel file /etc/modprobe.d/blacklist. Non potresti usare lspci -k per identificare quale modulo desidera il dispositivo e quindi black list che invece?
slm,

Dopo aver aggiunto la voce alla lista nera, vero update-initramfs -u -k all?
Stefan Seidel,

@StefanSeidel: buon punto. Ora ho, ma non sembra aiutare. Forse slm ha ragione nel pensare che la blacklist di una modalità come questa abbia bisogno di una sintassi o di un metodo diversi.
Rhymoid,

@slm: Non sono sicuro di poter bloccare le modalias attraverso la blacklist di modprobe (il mio sistema sembra ignorare la linea che gli ho dato), ma non posso semplicemente rimuovere il modulo ( ehci_hcd), dal momento che disabiliterebbe tutti gli host USB su il mio sistema. Voglio solo disabilitare questo specifico dispositivo, in base al suo fornitore, dev, subvendor e subdev.
Rhymoid,

Risposte:


4

Di recente ho riscontrato questo problema durante la configurazione della mia xen box con più dispositivi USB. Volevo che uno venisse utilizzato da Dom-0 e l'altro da una macchina virtuale, quindi avevo bisogno che il dispositivo fosse disponibile per xen-pciback. Tuttavia, il driver USB è stato rispettato nel mio kernel, quindi non potevo semplicemente inserire nella lista nera il driver. La mia soluzione era quella di creare uno script initramfs personalizzato che separasse la porta PCI specifica molto presto nel processo di avvio.

Questo è Ubuntu 2016.04, ma dovrebbe funzionare nelle versioni precedenti.

Ci sono tre file coinvolti. Li ho nominati per il mio caso d'uso specifico, ma ymmv:

Il primo file, chiamato /etc/unbindpcifile che è un semplice csv del numero di dispositivo PCI e del driver (configurare qui secondo necessità):

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

Secondo file /etc/initramfs-tools/hooks/xenfiles, che copia la configurazione sopra in initramfs.

#! /bin/bash

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

Il terzo file è ciò che funziona all'avvio, l'ho inserito in /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

Infine, esegui update-initramfs -k all -ue riavvia.

Potrei includere il supporto per i commenti nel file di configurazione, e qui c'è molta pulizia da fare, ma funziona per me.


È ancora una soluzione in cui separare il dispositivo PCI dopo che è stato inizializzato, ma ehi, sembra meglio che risolverlo /etc/init.d! Al momento non sto usando la macchina e potrei non avviarla mai più con Debian, quindi non posso provarla. Tuttavia, poiché probabilmente avrebbe funzionato nel mio caso, lo accetterò come risposta.
Rhymoid,

D'accordo, non ho ancora trovato una soluzione per impedire l'inizializzazione del dispositivo senza inserire nella lista nera il modulo. La linea "radeon" è un esempio di un primo tentativo in tal senso, in realtà.
Steve Czetty,

Divertente, pensavo udevche tutto il bus passasse e si caricasse durante l'avvio del kernel e tutto ciò che Grub ha fatto è initramfsstato letto e perso. quando il kernel è caricato. Avevo cercato di impostare setpciin initramfs-toolsma ha rinunciato e sto cercando una udevregola ora.
WinEunuuchs2Unix

4

Nessuna delle risposte ha risolto il mio problema simile, ma mi hanno messo sulla strada per risolverlo!

Il mio errore syslog:

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

Questa è una porta hub USB interna per un'opzione bluetooth che non ho.

svincolarsi dal dispositivo PCI ha appena portato l'hub a tornare indietro come un altro hub (5 nel mio caso) e inondare ulteriormente il syslog.

Per caso ho notato una struttura non distrutta sotto /sys/bus/usb/drivers/hub. Utilizzando gli esempi sopra ho appena aggiunto quanto segue in rc.local:

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

Il risultato è silenzio syslog! Ora per aggiungere l'esempio di script di kshurig per la gestione dell'alimentazione e dovrei essere d'oro.


4

È possibile rimuovere un dispositivo PCI aggiungendo una regola udev in /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'"

Sostituire 0000:00:03.0con l'indirizzo del dispositivo PCI che si desidera rimuovere


Questo è abbastanza utile Tuttavia, come menzionato dall'OP, ciò provocherà il crollo di tutte le porte USB. Esiste un modo per aggiungere una regola per un dispositivo specifico e un ID fornitore in modo che i dispositivi funzionino con tutte le altre porte USB ma ignorino un determinato dispositivo?
Mosty Mostacho,

2

Ho trovato questa discussione su askubuntu:

Usando lspci -vvper identificare lo slot PCI di un dispositivo che si desidera disabilitare, sembrava che si potesse usare questo comando per spegnere il dispositivo di quello slot:

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

1
So come disabilitarlo in qualsiasi altro momento, ma voglio impedire al kernel di attivarlo affatto. Inoltre, poiché si tratta di un dispositivo PCI cablato (come la maggior parte dei controller USB), non ha slot. La macchina di cui sto parlando è un laptop, e l'unico slot che ha ( /sys/bus/pci/slots/1) è lo slot ExpressCard all'esterno, che posso liberare manualmente.
Rhymoid,

2

Quando si dispone già echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbinddi /etc/rc.localper l'avvio di quello che basta per metterlo in uno script per la gestione dell'alimentazione demone pure.

Va così: Crea un file di script bash eseguibile chiamato 0_disable_webcamnella directory /etc/pm/sleep.d/:

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

Dovrebbe funzionare all'istante. L'ho provato con una chiavetta USB e ha funzionato (nel senso che è rimasto disabilitato) fintanto che l'unità è stata collegata. Il rimontaggio dovrebbe richiedere regole udev ma poiché la tua webcam non verrà scollegata dovrebbe funzionare. Se ciò non risolve il problema, ho un altro suggerimento.


Se quanto sopra non funziona, è necessario trovare la porta USB corretta. Immagino che sia "1-1.2" (altrimenti controlla tree /sys/bus/pci/devices/0000\:00\:1a.0/sotto "usbX" che significa che la porta è un numero simile). Se è "1-1.2" anziché il tuo, echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbindlo script dovrebbe avere echo "auto" > /sys/bus/usb/devices/1-1.2/power/control; echo -n "1-1.2" > /sys/bus/usb/drivers/usb/unbind.
kschurig,

0

non una risposta alla tua domanda quanto una soluzione.

Perché non semplicemente sopprimere la registrazione dei messaggi sulla console modificando syslog / (Non so se usi syslog o rsyslog o qualcos'altro, quindi non posso davvero indirizzarti più specificamente nella directory corretta, ma se tu cerca i tuoi file di configurazione di syslog per "console" e "tty", che ti darebbero un buon punto di partenza - in effetti, puoi probabilmente cambiare la console in / dev / tty1 [per esempio] e avere messaggi solo per accedere a tty1 piuttosto che a tutti console.

L'altra soluzione (per rispondere alla tua domanda, ma non mi piace), potresti inserire nella lista nera il modulo ehci_hcd (se caricato), o ricompilare il tuo kernel per usarlo solo come modulo. Dai un'occhiata a h ttp: //www.cyberciti.biz/faq/rhel-redhat-centos-kernel-usb-reset-high-speed-ehci_hcd/ che risolve esattamente la domanda che stai ponendo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.