Identifique em qual porta USB um dispositivo está conectado

Identifique em qual porta USB um dispositivo está conectado

Estou trabalhando em scripts Bash personalizados para duplicação em massa de memória flash USB e testes em massa (usando f3).

Gostaria de saber se é possível identificar em qual porta USB um pendrive está conectado.

Tenho hubs USB com portas numeradas. Se eles tiverem alguns endereços estáticos que eu possa identificar e saber se algo está conectado a eles ou não, e o que é isso (essencialmente: qual arquivo /dev/sd* corresponde a essa porta USB), eu poderia tornar isso muito mais fácil para os usuários para saber o que está acontecendo e permitir que eles removam unidades defeituosas no início do processo, sem esperar até que todo o lote seja processado e, em seguida, tente separar as unidades defeituosas das boas (é assim que faço agora).

Tentei pesquisar, mas nada que encontrei parecia combinar com o que desejo alcançar, então decidi pedir ajuda diretamente neste contexto.

Agora eu identifico as unidades pelos nomes dos nós /dev/sd* e os usuários não têm ideia do que é isso. Se eu pudesse mapeá-los para portas USB em um hub, poderia apresentar as informações com base nas portas USB e os usuários poderiam saber que a porta 5 tem uma unidade defeituosa conectada e eles podem removê-la sem interferir no resto do processo. .

Eu poderia até parar de fazer isso em lotes e fazer com que todas as portas funcionassem simultaneamente em loop, o usuário poderia conectar e desconectar as unidades o tempo todo, acompanhando o que é o quê pelos números das portas do HUB, isso poderia aumentar bastante o fluxo de trabalho .

Portanto, a questão básica: como posso identificar as portas USB e a memória flash USB conectadas a essas portas?

Responder1

Você pode usar udevadmpara obter ocaminho do dispositivode algum dispositivo. Isso é feito examinando os links simbólicos em /sys/, então você também pode fazer isso manualmente (mas é mais fácil de usar udevadm).

Por exemplo, um pendrive conectado a um hub USB externo no meu sistema produz

$ 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 pode ver comparando com a árvore 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
...

a parte 3-1.1.3.2do caminho diz que no barramento 3 ele passa pela porta 1 (na ponte sul), novamente pela porta 1 (na placa-mãe), pela porta 3 (ainda na placa-mãe) e depois pela porta 2 do hub USB externo. A porta 4 deste hub é usada para um leitor de cartão SD.

Portanto, dependendo de como o seu hub USB está conectado, você precisa fazer algo semelhante e extrair a última porta de seu interesse.

Responder2

Esta é uma alternativa à solução aceita onde você não sabe o nome do dispositivo para fornecê-lo a um comando (para falar sobre o dispositivo).

ANTESinserindo a unidade flash USB, execute:

udevadm monitor

Assim que o stick for inserido, ele vomitará detalhadamente mensagens do Kernel e Udev e na última linha nos dirá como o host vê o stick USB:

18.04 feedback do comando do monitor udevadm

Responder3

Parece que /dev/disk/by-pathcontém links simbólicos para /dev/sd*nós e pode ser usado para descobrir exatamente isso.

A emissão de um file /dev/disk/by-path/*comando lista todos /dev/sd*os nós e seus endereços físicos. Eu deveria ser capaz de passar por isso com bastante facilidade.

informação relacionada