deshabilitar un dispositivo PCI específico en el arranque


14

Acabo de reinstalar Debian en mi computadora portátil Sony VAIO, y todas mis dmesgconsolas virtuales reciben correo no deseado con los mismos mensajes una y otra vez.

[   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

Creo que estos mensajes provienen de un dispositivo USB conectado internamente, probablemente la cámara web (ya que eso es lo único que no funciona). Parece que la única forma en que puedo cerrarlo (sin matar mis puertos USB realmente útiles) es deshabilitar uno de los controladores de host USB:

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

Esto también elimina mi interfaz Bluetooth, pero estoy de acuerdo con eso.

Me gustaría que esta configuración persista, de modo que pueda volver a usar mi consola virtual sin problemas en caso de que la necesite. Quiero que mi sistema operativo (Debian amd64) nunca lo active, pero no sé cómo hacerlo. Intenté poner en la lista negra el alias del módulo para el dispositivo PCI, pero parece ignorarse:

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

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

¿Cómo me aseguro de que este dispositivo PCI específico nunca se active automáticamente, sin desactivar por completo su controlador?


-editar- El nombre del módulo fue renombrado recientemente, ahora los siguientes trabajos de userland:

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

Aún así, estoy buscando una manera de evitar que el núcleo se vincule con ese dispositivo en primer lugar.


1
¿Sería un enfoque aceptable deshabilitar este dispositivo USB en particular a través del bus USB en lugar del bus PCI?
slm

Además, ¿estás seguro de que puedes incluir en la lista negra usando un pci: ... cadena así? Solo he visto módulos de kernel que se pueden incluir en la lista negra en el archivo /etc/modprobe.d/blacklist. ¿No podría usar lspci -k para identificar qué módulo desea el dispositivo y luego enlistarlo en negro?
slm

Después de agregar la entrada a la lista negra, ¿verdad update-initramfs -u -k all?
Stefan Seidel

@StefanSeidel: Buen punto. Tengo ahora, pero no parece ayudar. Quizás slm tiene razón al pensar que la inclusión en una lista negra de modalidades como esta necesita una sintaxis o método diferente.
Rhymoid

@slm: no estoy seguro de si puedo bloquear las modalidades a través de la lista negra de modprobe (mi sistema parece ignorar la línea que le di), pero no puedo simplemente eliminar el módulo ( ehci_hcd), ya que eso deshabilitaría todos los hosts USB en mi sistema Solo quiero deshabilitar este dispositivo específico, en función de su proveedor, desarrollador, subvendor y subdev.
Rhymoid

Respuestas:


4

Recientemente me encontré con este problema al configurar mi caja xen con múltiples dispositivos usb. Quería que Dom-0 usara uno y el otro una máquina virtual, así que necesitaba que el dispositivo estuviera disponible para xen-pciback. Sin embargo, el controlador USB se incorporó a mi kernel, por lo que no pude simplemente ponerlo en la lista negra. Mi solución fue crear un script initramfs personalizado que desenlaza el puerto pci específico muy temprano en el proceso de arranque.

Esto es Ubuntu 2016.04, pero debería funcionar en versiones anteriores.

Hay tres archivos involucrados. Los nombré para mi caso de uso específico, pero ymmv:

El primer archivo, llamado /etc/unbindpciarchivo, que es un simple csv del número de dispositivo pci y el controlador (configure según sea necesario aquí):

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

Segundo archivo /etc/initramfs-tools/hooks/xenfiles, que copia la configuración anterior en initramfs.

#! /bin/bash

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

El tercer archivo es lo que funciona en el momento del arranque, lo coloqué en /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

Finalmente, ejecuta update-initramfs -k all -uy reinicia.

Podría incluir soporte para comentarios en el archivo de configuración, y hay mucha limpieza que hacer aquí, pero funciona para mí.


Sigue siendo una solución en la que desenlaza el dispositivo PCI después de que se inicializó, pero bueno, ¡se ve mejor que resolverlo /etc/init.d! No estoy usando la máquina en este momento, y es posible que nunca vuelva a arrancarla con Debian, por lo que no puedo probarla. Sin embargo, debido a que probablemente hubiera funcionado en mi caso, lo aceptaré como respuesta.
Rhymoid

De acuerdo, todavía no he encontrado una solución para evitar la inicialización del dispositivo sin incluir en la lista negra el módulo. La línea "radeon" es un ejemplo de un intento temprano de eso, en realidad.
Steve Czetty

Curioso, pensé udevque todo el autobús caminaba y cargaba durante el arranque del kernel y todo lo que hizo Grub initramfsfue de solo lectura y se perdió. cuando se carga el kernel. Había tratado de configuración setpcien initramfs-toolspero renunció y estoy tratando una udevregla ahora.
WinEunuuchs2Unix

4

Ninguna de las respuestas resolvió mi problema similar, ¡pero me pusieron en el camino para resolverlo!

Mi error de syslog:

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

Este es un puerto hub USB interno para una opción de bluetooth que no tengo.

desvincularse del dispositivo pci solo resultó en que el concentrador volviera a aparecer como otro concentrador (5 en mi caso) e inundó aún más el syslog.

Por casualidad, noté una estructura de desatar debajo /sys/bus/usb/drivers/hub. Usando los ejemplos anteriores, acabo de agregar lo siguiente en rc.local:

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

El resultado es el silencio syslog! Ahora para agregar el ejemplo de script de kshurig para la administración de energía y debería ser dorado.


4

Puede eliminar un dispositivo PCI agregando una regla udev en /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'"

Reemplace 0000:00:03.0con la dirección del dispositivo pci que desea eliminar


Esto es bastante útil. Sin embargo, como mencionó el OP, esto provocará que todos los puertos USB se caigan. ¿Hay alguna forma de agregar una regla para un dispositivo específico y la identificación del proveedor para que los dispositivos funcionen con todos los demás puertos USB pero ignoren un dispositivo determinado?
Mosty Mostacho

2

Encontré este hilo en askubuntu:

Utilizando lspci -vvpara identificar la ranura PCI de un dispositivo que desea deshabilitar, sonó como si pudiera usar este comando para apagar el dispositivo de esa ranura:

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

1
Sé cómo puedo deshabilitarlo en cualquier otro momento, pero quiero evitar que el núcleo lo active. Además, dado que este es un dispositivo PCI cableado (como la mayoría de los controladores USB), no tiene ranura. La máquina de la que estoy hablando es una computadora portátil, y la única ranura que tiene ( /sys/bus/pci/slots/1) es la ranura ExpressCard en el exterior, que puedo desocupar manualmente.
Rhymoid

2

Cuando ya se tiene echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbinden /etc/rc.localpara el inicio de lo que sólo hay que ponerla en una secuencia de comandos para la administración de energía demonio también.

Va así: Cree un archivo ejecutable de script bash llamado 0_disable_webcamen el directorio /etc/pm/sleep.d/:

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

Debería funcionar al instante. Lo probé con una memoria USB y funcionó (lo que significa que permaneció deshabilitado) siempre que la unidad estuviera conectada. Reenchufar necesitaría reglas de udev, pero como su cámara web no se desconectará, debería funcionar. Si eso no funciona, tengo otra sugerencia.


Si lo anterior no funciona, entonces debe encontrar el puerto usb correcto. Supongo que es "1-1.2" (de lo contrario, verifique con tree /sys/bus/pci/devices/0000\:00\:1a.0/"usbX", lo que significa que el puerto es un número similar). Si es "1-1.2" en lugar de su, echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbindel script debería tener echo "auto" > /sys/bus/usb/devices/1-1.2/power/control; echo -n "1-1.2" > /sys/bus/usb/drivers/usb/unbind.
kschurig

0

no es una respuesta a su pregunta tanto como una solución

¿Por qué no simplemente suprimir el registro de los mensajes en la consola modificando syslog / (no sé si usa syslog o rsyslog u otra cosa, por lo que realmente no puedo señalarlo más específicamente en el directorio correcto, pero si usted busque en sus archivos de configuración de syslog "consola" y "tty", eso le daría un buen punto de partida; de hecho, es probable que pueda cambiar la consola a / dev / tty1 [por ejemplo] y que los mensajes solo se registren en tty1 en lugar de todos consolas

La otra solución (para responder a su pregunta, pero no me gusta), podría incluir en la lista negra el módulo ehci_hcd (si está cargado), o recompilar su kernel para usarlo solo como módulo. Eche un vistazo a h ttp: //www.cyberciti.biz/faq/rhel-redhat-centos-kernel-usb-reset-high-speed-ehci_hcd/ que resuelve exactamente la pregunta que está haciendo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.