
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 udevadm
para 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.2
do 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:
Responder3
Parece que /dev/disk/by-path
conté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.