Se eu conectar um dispositivo físico, como posso saber qual arquivo de dispositivo pertence a ele?

13

Digamos que eu conecte vários drives USB que não são montados automaticamente. Como posso descobrir qual arquivo de dispositivo pertence a qual dispositivo físico, então posso montá-lo, por exemplo?

Estou executando o Mac OS X, mas prefiro uma resposta que funcione em todos (ou pelo menos nos mais populares) sistemas Unix. Eu tive esse problema com o Linux no passado.

    
por rightfold 04.08.2011 / 17:49

4 respostas

14

Usando o udev:

Você pode obter informações úteis consultando udev (em sistemas que o utilizam - quase todos os Linuxes do tipo desktop com certeza). Por exemplo, se você quiser saber qual unidade anexada está associada a /dev/sdb , use:

udevadm info --query=property --name=sdb

Ele mostrará uma lista de propriedades desse dispositivo, incluindo a serial (ID_SERIAL_SHORT). Com essa informação, você pode ver a saída de lsusb -v e descobrir coisas como o nome do fabricante e do produto.

Um caminho mais curto para fazer isso seria

udevadm info --query=property --name=sdb | grep "\(MODEL_ID\|VENDOR_ID\)"

e veja a linha com correspondência de $ID_VENDOR_ID:$ID_MODEL_ID na saída muito mais curta de lsusb .

Outra opção útil é udevadm monitor . Use-o se quiser saber qual nó de dispositivo é criado no ponto de conexão do dispositivo . Então, primeiro corra

 udevadm monitor --udev --subsystem-match=block

Em seguida, conecte o dispositivo. Você verá os nomes dos dispositivos de bloco detectados (discos / partições) impressos no final de cada linha de saída.

Um exemplo prático de função shell:

Aqui está uma função que você pode colocar em seu .bashrc (ou .zshrc ):

listusbdisks () 
{
    [[ "x$1" == "x-v" ]] && shift && local VERBOSE=-v
    for dsk in ${@-/dev/sd?}
    do
        /sbin/udevadm info --query=path --name="$dsk" | grep --colour=auto -q usb || continue
        echo "===== device $dsk is:"
        ( eval $(/sbin/udevadm info --query=property --name="$dsk" | grep "\(MODEL\|VENDOR\)_ID")
          [ "$ID_VENDOR_ID:$ID_MODEL_ID" == ":" ] && echo "Unknown" || \
            lsusb $VERBOSE -d "$ID_VENDOR_ID:$ID_MODEL_ID"
        )
        grep -q "$dsk" /proc/mounts && echo "----- DEVICE IS MOUNTED ----"
        echo
    done
}

Use assim:

  • listusbdisks - para reconhecer todos os /dev/sdx dispositivos;
  • listusbdisks sdb ou listusbdisks /dev/sdb ou listusbdisks sdb sdc - para obter informações apenas sobre determinados dispositivos;
  • listusbdisks -v [optional devices as above] - para mostrar saídas detalhadas de lsusb

[Editar]: Adicionada alguma funcionalidade como consultar muitos dispositivos, verificar montagens e controlar o detalhamento de lsusb .

    
por 04.08.2011 / 19:15
3

Não há resposta universal. No Linux, o caminho mais simples é provavelmente apenas acionar o utilitário de disco gnome e ele mostrará todos os discos detectados, estejam eles montados ou não. Na linha de comando, você pode consultar a saída de blkid ou udevadm info --export-db .

    
por 04.08.2011 / 19:00
3

No Mac OS X, você pode tentar usar diskutil list .

    
por 16.06.2013 / 18:41
1

Com relação a todos os Unixes, não acho que isso seja viável.

Os barramentos externos usuais atualmente não usam um esquema de numeração fixo para suas portas, como o IDE fez. Assim, as únicas fontes de dados restantes para o mapeamento que você precisa são os nomes dos fabricantes das unidades, seus números de série ou os UIDs das partições.

Os nomes dos fabricantes não são necessariamente únicos em uma determinada máquina (suponha que você conecte duas unidades externas da mesma série - elas serão identificadas de forma idêntica). Os números de série não são "visíveis do lado de fora", assim como os UIDs de partição.

Assim, a única solução universal em que consigo pensar é rotular as unidades físicas com o número de série e usar o comando udevadm fornecido na resposta da rozcietrzewiacz, se a UDEV estiver disponível.

    
por 04.08.2011 / 19:21