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

13

Digamos que conecte várias unidades USB que não são montadas automaticamente. Como posso descobrir qual arquivo de dispositivo pertence a qual dispositivo físico, para que eu possa 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.

destro
fonte
No Linux, a resposta tenderia a envolver o udev. Então você tenta procurar os equivalentes do udev no OSX ; isso leva, em particular, à funcionalidade Alternativa ao udev no OSX e no OSX USB Device Interface Guide .
Gilles 'SO- stop be evil'
No MacOSX, o mais simples é identificar os volumes por seus rótulos. Mas Gilles tem razão sobre a solução perfeita.
peterh - Restabelece Monica

Respostas:

14

Usando o udev:

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

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

Ele mostrará uma lista de propriedades desse dispositivo, incluindo o serial (ID_SERIAL_SHORT). Com essas informações, você pode ver a saída lsusb -ve descobrir coisas como o fabricante e o nome 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 $ID_VENDOR_ID:$ID_MODEL_IDna saída muito menor de lsusb.

Outra opção útil é udevadm monitor. Use-o se desejar saber qual nó do dispositivo é criado no momento da conexão do dispositivo . Então, primeira corrida

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

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

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

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

listusbdisks () 
{
    [["x $ 1" == "xv"]] && shift && VERBOSE local = -v
    para dsk em $ {@ - / dev / sd?}
    Faz
        / sbin / udevadm info --query = caminho --name = "$ dsk" | grep --colour = auto -q usb || continuar
        eco "===== O dispositivo $ dsk é:"
        (eval $ (/ sbin / udevadm info --query = property --name = "$ dsk" | grep "\ (MODELO \ | VENDED \) _ ID")
          ["$ ID_VENDOR_ID: $ ID_MODEL_ID" == ":"] && echo "Desconhecido" || \
            lsusb $ VERBOSE -d "$ ID_VENDOR_ID: $ ID_MODEL_ID"
        )
        grep -q "$ dsk" / proc / mounts && echo "----- O DISPOSITIVO ESTÁ MONTADO ----"
        eco
    feito
}

Use-o assim:

  • listusbdisks- reconhecer todos os /dev/sdxdispositivos;
  • listusbdisks sdbou listusbdisks /dev/sdbou listusbdisks sdb sdc- para obter informações apenas sobre determinados dispositivos;
  • listusbdisks -v [optional devices as above] - para mostrar resultados detalhados de lsusb

[Editar]: Adicionadas algumas funcionalidades, como consultar muitos dispositivos, verificar montagens e controlar a verbosidade de lsusb.

rozcietrzewiacz
fonte
É verdade o suficiente, mas nem todos os sistemas usam udev.
Caleb
@Caleb True ... Na verdade, lsusbtambém é um programa opcional. Mas ambos são extremamente comuns.
rozcietrzewiacz
@rozcietrzewiacz A questão é principalmente sobre OSX, mas o udev é intrinsecamente específico para Linux.
Gilles 'SO- stop be evil'
@ Gil Bem, é verdade. Como não tenho experiência com o OSX, atualizei minha resposta para não ser enganosa.
rozcietrzewiacz
O que geralmente faço nesse caso é conectar o dispositivo e executar imediatamente dmesg. Mas isso não será útil se o dispositivo já estiver conectado e se houver mais dispositivos conectados após o primeiro. :)
Abhishek A
3

Não há resposta universal. No Linux, a maneira mais simples é provavelmente iniciar 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 blkidou udevadm info --export-db.

psusi
fonte
3

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

x1a0
fonte
1

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

Os barramentos externos comuns hoje em dia não usam um esquema de numeração fixo para suas portas, como o IDE fez. Portanto, as únicas fontes de dados restantes para o mapeamento necessárias 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 exclusivos 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 de fora", assim como os UIDs da partição.

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

jstarek
fonte