¿Cómo averiguo qué / dev es una unidad flash USB?

160

Quiero montar una unidad USB, dos de ellas y necesito dos puntos de montaje diferentes. Desafortunadamente, el kernel de Linux experimentó un cambio de nombre y no puedo averiguar qué /devubicación es la correcta. ¿Hay alguna manera de mirar a través dmesgo /procen otro lugar para averiguar qué nodo de dispositivo es una unidad USB?

(Estoy usando ArchLinux si eso ayuda ... /dev/sdaes el primer disco duro, /dev/sr0es una unidad de DVD, etc.)

editar: la unidad USB está conectada a un concentrador USB. Miré a través dmesgy dice que el hub estaba conectado y escaneó los 3 dispositivos conectados a él. Sin embargo, todavía no puedo ver dónde está mi unidad USB.

Rudolf Olah
fuente
1
¿No puedes verlo? Quizás espere un momento. O intente con otro puerto USB. Vea qué diferencias hay en 'lsusb'
Nick Devereaux
Es posible que desee reformular un poco la pregunta: después de todo, no todos los dispositivos USB son discos.
Arafangion
3
El dfcomando te muestra dónde estaba montado
Will Sheppard

Respuestas:

83

La forma más fácil: mira la salida de dmesgdespués de conectar el dispositivo USB. Debería mostrarle qué /devnodo se le asignó.

zigdon
fuente
2
dmesgfunciona muy bien, pero tengo un caso en el dmesgque no muestra el /devnodo: [421963.864281] usb 3-6: new high-speed USB device number 32 using xhci_hcd¿Qué significa esto? ¿Cómo puedo montar este dispositivo? El dispositivo aparece en lsusb...
modulitos
1
En realidad, lo descubrí. Hubo una actualización del kernel desde mi último reinicio que estaba causando este problema. Después de reiniciar, mi usb se monta muy bien. ¡Ojalá esto ayude a alguien!
modulitos
54

Mientras esté ejecutando udev , puede hacerlo fácilmente haciendo referencia a / dev / disk / by-id / usb- manufacturername _ serialnumber . Estos aparecen como enlaces simbólicos a los que puede hacer referencia directamente dentro de su fstab, o que puede desreferenciar usando readlink -e para determinar el dispositivo de bloqueo asociado.

Aquí hay un ejemplo del mundo real. En mi máquina, tengo 3 discos duros USB conectados. Cada uno de ellos aparece en / dev / disk / by-id con números de serie únicos (aunque comparten una cadena de fabricante común). He creado enlaces simbólicos a cada una de estas tres entradas únicas, y ahora puedo determinar rápidamente qué unidad es cuál (y qué dispositivo está asociado con cada unidad) ejecutando readlink -e linkname . Por ejemplo, ejecutar readlink -e / root / disk2 en mi máquina muestra actualmente " / dev / sde ", mientras que readlink -e / root / disk3 no produce ningún tipo de salida.


fuente
15
Corto y simple:for devlink in /dev/disk/by-id/usb*; do readlink -f ${devlink}; done
Felipe Alcacibar
54

Todas estas son buenas sugerencias, pero el método más rápido y menos detallado es escribir lo siguiente en el terminal:

mount

que proporcionará una lista de todos los dispositivos montados (esto supone que la unidad USB está montada, que suele ser el caso con las distribuciones modernas de Linux).

AnotherLongUsername
fuente
55
No, mágicamente no monta tu dispositivo. Tienes que especificarlo con mount /dev/id /mount/point, para que eso no funcione.
polym
99
Mi respuesta responde a la pregunta del usuario '¿Hay alguna manera de mirar a través de dmesg o / proc o en otro lugar para averiguar qué nodo de dispositivo es una unidad USB?', Y no tiene la intención de proporcionar orientación sobre la practicidad de montar una unidad bajo Linux .
AnotherLongUsername
Esta respuesta resolvió una pregunta casi idéntica para mí.
Matthew Brown también conocido como Lord Matt
1
Creo que el comportamiento del montaje automático depende mucho del tipo de distribución.
jiggunjer
1
dftambién, supongo.
Alexey
24

Pruebe el comando udevinfo -q all -n /dev/sda, donde /dev/sdaestá la ruta a su disco. Esto le brinda una gran cantidad de información sobre el disco que está viendo: hay una entrada que le informa sobre el bus al que está conectado.

Por supuesto, esto le ahorra tener que pasar por dmesg y / o registros.

Actualizar

udevadm info --query=all -n /dev/sda 

Desde al menos julio de 2010 [ 1 ] udevinfo fue sustituido en Debian (y derivado) por udevadm infoun poco transitorio con el que pronto hubo enlaces simbólicos en desuso y eliminados (aún puede encontrarlos en una máquina antigua no actualizada). Siempre desde [ 1 ] podemos leer:

En udev 117, udevadmse introdujo udevinfoy otros programas se convirtieron en enlaces simbólicos de compatibilidad. Los enlaces simbólicos quedaron en desuso en udev 128 y se eliminaron definitivamente en udev 147 .

Eltariel
fuente
8
En Debian, udevinfose renombra udevadm.
Steve Pomeroy
8
En Ubuntu, el comando parece ser "udevadm info --query = all -n / dev / sda"
machineghost
Supongo que cambiaron el nombre del comando en algún momento: cuando escribí la respuesta (hace años), el comando funcionó en el sistema ubuntu desde el que lo
publiqué
El comando aún funciona en ubuntu,udevadm info --query=all -n /dev/ttyUSB1
Siddharth
1
udevadm info --query=all -n /dev/ttyUSBen Fedora también.
slm
22

El método más simple para ver lo que está sucediendo es simplemente escribir (como raíz, por supuesto):

blkid -c /dev/null

Esto le ofrece una visión general completa de todos los dispositivos de bloque, incluso si no está montado

toh
fuente
No toda la distribución tiene esto. ¿Qué estabas usando?
Nueva Alejandría
Esto no genera nada en mi distribución Raspbian.
IgorGanapolsky
Comando no encontrado: blkid
IgorGanapolsky
No hay salida de este comando en Ubuntu 14.04 de 64 bits.
gbmhunter
11

/dev/disk/by-* es la forma más fácil en este caso, si por alguna razón quieres hacer la vida más interesante puedes usar HAL.

Para enumerar todos los dispositivos que usa:

hal-device

Para obtener una propiedad específica que use (esto regresará /dev/sd*en un dispositivo de almacenamiento USB):

hal-get-property --udi $UDI --key block.device

También hay:

hal-find-by-capability
hal-find-by-property

Si desea que sea aún más complicado, puede escribirse relativamente fácilmente un montador automático basado en HAL , que puede ser bastante útil si desea automatizar las cosas por completo.

Y solo para completar, también hay:

lsusb -v
lshw

Que proporciona información general sobre USB y su hardware en general.

Grumbel
fuente
2
/ dev / disk / by-id / * usb * es muy útil.
Rob
/ dev / disk / by-label ftw. Gracias :)
Tríptico
10
sudo fdisk -l

Y solo analiza el resultado.

Felipe
fuente
1
página de manual de fdisk "Si no se proporcionan dispositivos, se utilizan los mencionados en / proc / particiones (si existe)". Es posible que ejecutar fdisk no sea una opción ... Basado en un sistema Debian que sé que no lo tiene instalado, supongo que algunos sistemas GPT podrían no instalar el software innecesario. Aún así, verificar / proc / particiones debería ser una opción.
TOOGAM
Esta fue la única opción que funcionó bien para mí. Lo siento si no te funcionó!
Felipe
8

Utilizar

ls -l /dev/disk/by-id/usb*

Según las reglas predeterminadas de udev, eso le mostrará la mayoría de los dispositivos usb y le mostrará el enlace simbólico a su nombre de dispositivo de bloque en el sistema.

Si eso no funciona, mira /dev/disk/by-id/directamente.

DJ Capelis
fuente
6

Para dispositivos USB simplemente puedes hacer

REMOVABLE_DRIVES=""
for _device in /sys/block/*/device; do
    if echo $(readlink -f "$_device")|egrep -q "usb"; then
        _disk=$(echo "$_device" | cut -f4 -d/)
        REMOVABLE_DRIVES="$REMOVABLE_DRIVES $_disk"
    fi
done
echo Removable drives found: "$REMOVABLE_DRIVES"
lemsx1
fuente
1
+1. Script simple y conciso para hacer la tarea automáticamente.
leesei
2

Echa un vistazo al árbol debajo /dev/disk. Enumera los discos y sus particiones (sistemas de archivos) por varios esquemas.

Ted Percival
fuente
2

/ var / log / message si dmesg ya no tiene la información.


fuente
0

Si desconecta la unidad USB y la vuelve a conectar, debería ver que se inicializa desde el núcleo (dmesg)

Planchazo
fuente
0

Basado en la excelente respuesta de stormlash y con una dependencia de udev para llenar el árbol de dispositivos "/ dev / disk / by-id / usb", puede definir un predicado (Bash) de la siguiente manera:

is_usb_device() {
    local device_path=$1        # such as /dev/sdc
    for devlink in /dev/disk/by-id/usb*; do
        if [ "$(readlink -f "$devlink")" = "$device_path" ]; then
            return 0
        fi
    done
    return 1
}

Y luego úsalo:

if is_usb_device "/dev/sdg"; then
    echo "/dev/sdg is a usb device"
else
    echo "/dev/sdg is not a usb device"
fi
usuario30747
fuente