Identificar en qué puerto USB está conectado un dispositivo

Identificar en qué puerto USB está conectado un dispositivo

Estoy trabajando en scripts Bash personalizados para la duplicación masiva de memorias flash USB y pruebas masivas (usando f3).

Me pregunto si es posible identificar en qué puerto USB está conectado un pendrive.

Tengo concentradores USB con puertos numerados. Si tienen algunas direcciones estáticas que pueda identificar y saber si hay algo conectado a ellas o no, y qué es eso (esencialmente: qué archivo /dev/sd* corresponde a ese puerto USB), podría hacerlo mucho más fácil para los usuarios. para saber qué está pasando y permitirles eliminar las unidades defectuosas al principio del proceso, sin esperar hasta que se procese todo el lote y luego intentar separar las unidades defectuosas de las buenas (así es como lo hago ahora).

Intenté buscar, pero nada de lo que encontré parecía encajar con lo que quiero lograr, así que decidí pedir ayuda directamente en este contexto.

Ahora mismo identifico las unidades por los nombres de los nodos /dev/sd* y los usuarios no tienen idea de qué es eso. Si pudiera asignarlos a puertos USB en un concentrador, podría presentar la información basada en los puertos USB y los usuarios podrían saber que el puerto 5 tiene una unidad defectuosa conectada y podrían eliminarla sin interferir con el resto del proceso. .

Entonces podría incluso dejar de hacer esto en lotes y hacer que todos los puertos funcionen simultáneamente en bucle, el usuario podría conectar y desconectar las unidades todo el tiempo, manteniendo un registro de qué es qué según los números de puerto del HUB, podría acelerar enormemente el flujo de trabajo. .

Entonces la pregunta básica: ¿cómo puedo identificar los puertos USB y la memoria flash USB conectada a estos puertos?

Respuesta1

Puedes usar udevadmpara obtener elruta del dispositivode algún dispositivo. Esto se hace examinando los enlaces simbólicos en /sys/, por lo que también puedes hacerlo manualmente (pero es más fácil de usar udevadm).

Por ejemplo, una memoria USB conectada a un concentrador USB externo de mi sistema produce

$ udevadm info -q path -n /dev/sdh
/devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1.1/3-1.1.3/3-1.1.3.2/3-1.1.3.2:1.0/host7/target7:0:0/7:0:0:0/block/sdh

Como se puede ver al comparar con el árbol USB,

$ lsusb -t
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
        |__ Port 1: Dev 26, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 3: Dev 29, If 0, Class=Hub, Driver=hub/4p, 480M
                |__ Port 2: Dev 31, If 0, Class=Mass Storage, Driver=usb-storage, 480M
                |__ Port 4: Dev 30, If 0, Class=Mass Storage, Driver=usb-storage, 480M
...

la parte 3-1.1.3.2de la ruta dice que en el bus 3, pasa por el puerto 1 (en el puente sur), nuevamente el puerto 1 (en la placa base), el puerto 3 (aún en la placa base) y luego por el puerto 2 del concentrador USB externo. El puerto 4 de este concentrador se utiliza para un lector de tarjetas SD.

Entonces, dependiendo de cómo esté conectado su concentrador USB, deberá hacer algo similar y extraer el último puerto que le interesa.

Respuesta2

Esta es una alternativa a la solución aceptada en la que no conoce el nombre del dispositivo para proporcionarlo a un comando (para informarle sobre el dispositivo).

ANTESinsertando la unidad flash USB, ejecute:

udevadm monitor

Una vez que se inserta la memoria USB, vomitará detalladamente mensajes de Kernel y Udev y en la última línea nos dirá cómo ve el host la memoria USB:

18.04 retroalimentación del comando del monitor udevadm

Respuesta3

Parece que /dev/disk/by-pathcontiene enlaces simbólicos a /dev/sd*nodos y puede usarse para descubrir exactamente eso.

Al emitir un file /dev/disk/by-path/*comando, se enumeran todos /dev/sd*los nodos y sus direcciones físicas. Debería poder superarlo con bastante facilidad.

información relacionada