Si conecto un dispositivo físico, ¿cómo puedo saber qué archivo de dispositivo pertenece?

13

Digamos que conecto varias unidades USB que no se montan automáticamente. ¿Cómo puedo averiguar qué archivo de dispositivo pertenece a qué dispositivo físico, para poder montarlo, por ejemplo?

Estoy ejecutando Mac OS X, pero prefiero una respuesta que funcione en todos los sistemas Unix (o al menos los más populares). Tuve este problema con Linux en el pasado.

pliegue derecho
fuente
En Linux, la respuesta tenderá a involucrar a udev. Así que intenta buscar equivalentes udev en OSX ; Esto conduce en particular a la alternativa a la funcionalidad udev en OSX y la Guía de interfaz de dispositivo USB OSX .
Gilles 'SO- deja de ser malvado'
En MacOSX, lo más simple es identificar los volúmenes por sus etiquetas. Pero Gilles tiene razón sobre la solución perfecta.
peterh - Restablece a Monica

Respuestas:

14

Usando udev:

Puede obtener consultas de información útiles udev(en sistemas que lo usan, casi todos los Linux de tipo escritorio). Por ejemplo, si desea saber con qué unidad conectada está asociada /dev/sdb, puede usar:

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

Le mostrará una lista de propiedades de ese dispositivo, incluida la serie (ID_SERIAL_SHORT). Con esa información, puede ver la salida lsusb -vy conocer cosas como el fabricante y el nombre del producto.

Un camino más corto para hacer esto sería

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

y vea la línea con coincidencia $ID_VENDOR_ID:$ID_MODEL_IDen la salida mucho más corta de lsusb.

Otra opción útil es udevadm monitor. Úselo si desea saber qué nodo de dispositivo se crea en el punto de conectar el dispositivo . Así que primero corre

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

Y luego conecte el dispositivo. Verá los nombres de los dispositivos de bloque detectados (discos / particiones) impresos al final de cada línea de salida.

Un ejemplo práctico de función de shell:

Aquí hay una función que puede poner en su .bashrc (o .zshrc):

listusbdisks () 
{
    [["x $ 1" == "xv"]] && shift && local VERBOSE = -v
    para dsk en $ {@ - / dev / sd?}
    hacer
        / sbin / udevadm info - consulta = ruta --nombre = "$ dsk" | grep --colour = auto -q usb || Seguir
        echo "===== dispositivo $ dsk es:"
        (eval $ (/ sbin / udevadm info --query = property --name = "$ dsk" | grep "\ (MODEL \ | VENDOR \) _ ID")
          ["$ ID_VENDOR_ID: $ ID_MODEL_ID" == ":"] && echo "Desconocido" || \
            lsusb $ VERBOSE -d "$ ID_VENDOR_ID: $ ID_MODEL_ID"
        )
        grep -q "$ dsk" / proc / mounts && echo "----- EL DISPOSITIVO SE MONTA ----"
        eco
    hecho
}

Úselo así:

  • listusbdisks- para reconocer todos los /dev/sdxdispositivos;
  • listusbdisks sdbo listusbdisks /dev/sdbo listusbdisks sdb sdc- para obtener información sobre ciertos dispositivos solamente;
  • listusbdisks -v [optional devices as above] - para mostrar salidas detalladas de lsusb

[Editar]: se agregó alguna funcionalidad como consultar muchos dispositivos, verificar los montajes y controlar la verbosidad de lsusb.

rozcietrzewiacz
fuente
Es lo suficientemente cierto en la medida de lo posible, pero no todos los sistemas lo usan udev.
Caleb
@Caleb True ... En realidad, lsusbtambién es un programa opcional. Pero ambos son extremadamente comunes.
rozcietrzewiacz
@rozcietrzewiacz La pregunta es principalmente sobre OSX, pero udev es intrínsecamente específico de Linux.
Gilles 'SO- deja de ser malvado'
@ Gil Bueno, cierto. No tengo experiencia con OSX, así que acabo de actualizar mi respuesta para no ser engañoso.
rozcietrzewiacz
Lo que generalmente hago en ese caso es que enchufo el dispositivo y lo ejecuto de inmediato dmesg. Pero esto no será útil si el dispositivo ya está enchufado y si hay más dispositivos conectados después del primero. :)
Abhishek A
3

No hay una respuesta universal. En Linux, la forma más sencilla es probablemente activar la utilidad de disco gnome y mostrará todos los discos detectados, estén montados o no. Desde la línea de comandos, puede consultar la salida de blkido udevadm info --export-db.

psusi
fuente
3

En Mac OS X puedes intentar usarlo diskutil list.

x1a0
fuente
1

Con respecto a todos los Unix, no creo que esto sea factible.

Los buses externos habituales de hoy no usan un esquema de numeración fijo para sus puertos, como lo hizo IDE. Por lo tanto, las únicas fuentes de datos restantes para la asignación que necesita son los nombres de los fabricantes de las unidades, sus números de serie o los UID de las particiones.

Los nombres de los fabricantes no son necesariamente únicos en una máquina determinada (supongamos que conecta dos unidades externas de la misma serie; se identificarán de forma idéntica). Los números de serie no son "visibles desde el exterior", como lo son los UID de partición.

Entonces, la única solución universal que se me ocurre es etiquetar las unidades físicas con el número de serie y usar el comando udevadm que figura en la respuesta de rozcietrzewiacz, si UDEV está disponible.

jstarek
fuente