Identifique qual porta USB é um dispositivo conectado

1

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

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

Eu tenho hubs USB com portas numeradas. Se tiver alguns endereços estáticos que eu possa identificar e saber se algo está plugado neles ou não, e o que é isso (essencialmente: qual arquivo / dev / sd * corresponde a essa porta USB) eu poderia tornar muito mais fácil para os usuários para saber o que está acontecendo e permitir que eles removam discos defeituosos no início do processo, sem esperar até que todo o lote seja processado e, em seguida, tente separar os discos ruins dos bons (é assim que eu faço agora). / p>

Eu tentei pesquisar, mas nada que eu encontrei pareceu combinar com o que eu quero alcançar, então decidi pedir ajuda diretamente neste contexto.

Agora eu identifico unidades por nomes de 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, eu 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 remover isso sem interferir no restante do processo. .

Eu poderia até mesmo parar de fazer isso em lotes e fazer todas as portas funcionarem simultaneamente em loop, o usuário poderia ligar e desligar as unidades o tempo todo, mantendo o controle sobre o que é o número de portas do HUB. o fluxo de trabalho.

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

    
por unfa 21.11.2017 / 13:41

2 respostas

4

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

Por exemplo, um pen drive USB 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), porta 3 (ainda na placa-mãe) e depois na porta 2 do hub USB externo. A porta 4 deste hub é usada para um leitor de cartão SD.

Então, dependendo de como seu hub USB está conectado, você precisa fazer algo semelhante e extrair a última porta em que está interessado.

    
por 21.11.2017 / 18:58
0

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 comando file /dev/disk/by-path/* lista todos os /dev/sd* nós e seus endereços físicos. Eu deveria ser capaz de entender isso facilmente.

    
por 21.11.2017 / 13:44

Tags