¿Cómo saber si /dev/sdX es un USB o HDD conectado?

¿Cómo saber si /dev/sdX es un USB o HDD conectado?

¿Cómo puedo saber si es un disco duro local o una llave USB? Preferiría una forma de hacer esto sin privilegios de root./dev/sdX

Bueno, udevadmme ayudó mucho:

Para disco duro local:

udevadm info --query=all --name=sdb | grep ID_BUS
E: ID_BUS=ata

Para llave USB:

udevadm info --query=all --name=sdc | grep ID_BUS
E: ID_BUS=usb

Respuesta1

Hay algunas formas de saberlo sin privilegios de root, muchas de ellas complicadas/hacky:

Usando /dev/disk/by-id:

find /dev/disk/by-id/ -lname '*sdX'

Si esto responde con algo como /dev/disk/by-id/usb-blah-blah-blah, entonces es un disco USB. Otros prefijos incluyen ata, dm, memstick, scsietc.

El uso /dev/disk/by-pathno es significativamente diferente:

find /dev/disk/by-path/ -lname '*sdX'

Obtendrás algo como /dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0. Esto muestra la ruta del dispositivo que conduce al disco. En este caso, una ruta aproximada es PCI → USB → disco. (nota la -usb-).

Usando udev (yo ejecuto Debian. Mi udevadmestá en /sbinel que no está en mi $PATH; el tuyo puede estar en otro lugar, dentro o fuera de tu $PATH):

/sbin/udevadm info --query=all --name=sdX | grep ID_BUS

Obtendrá el tipo de bus en el que se encuentra el dispositivo. Elimine el | grep ID_BUSpara obtener una lista completa de información (es posible que deba agregar |less).

Si lo ha lshwinstalado, la respuesta de HuygenspuedeAdemás trabajo:

lshw -class disk -class storage | less

Y mire la salida de su disco. En less, pruebe /sdX y observe las bus infolíneas anteriores; la primera solo dirá scsi@…, pero la que está varias líneas antes será más esclarecedora. Sin embargo, realmentedeberíaejecute esto como superusuario, por lo que puede que no sea adecuado. (síntomas: en la computadora portátil que lo probé, aparecía el disco SATA pero no el USB; ejecutándose con sudoambos enumerados)

También hay otros, más o menos directos que estos.

Respuesta2

Podrías usar lsblkpara informar TRAN (tipo de transporte del dispositivo):

lsblk -do name,tran

NAME TRAN
sda  sata
sdb  sata
sdd  usb

donde -do --nodepssignifica no imprimir esclavos y -o name,tran/o --output name,transignifica enumerar solo el nombre del dispositivo y el tipo de transporte del dispositivo. Agregue rma la lista de columnas de salida para ver qué dispositivos son extraíbles ( 1si true):

lsblk --nodeps --output NAME,TRAN,RM

NAME TRAN   RM
sda  sata    0
sdb  sata    0
sdd  usb     1

o -npara eliminar encabezados, por ejemplo, para imprimir solo el tipo de transporte para una determinada unidad:

lsblk -ndo tran /dev/sdb

sata

Tenga en cuenta que las versiones modernas lsblk( 2.27y más recientes) admiten JSONresultados, por lo que también podría hacer algo como:

lsblk -Jdo name,tran | jq -r '.blockdevices[] | select(.tran=="usb") | .name'

para enumerar solo los dispositivos de bloque conectados en el USBbus.

Respuesta3

Conozco una solución, pero lamentablemente requiere privilegios de root. De todos modos, puede que aún te resulte útil:

sudo lshw -class disk -class storage

Para cada dispositivo imprimirá el nombre lógico (por ejemplo, /dev/sda) y la información del bus, que en el caso de un dispositivo USB sería algo así como 'usb@1:2'.

Salida de muestra:

[...]
  *-storage
       description: SATA controller
       physical id: d
       bus info: pci@0000:00:0d.0
       configuration: driver=ahci latency=64
[...]
     *-disk:0
          description: ATA Disk
          physical id: 0
          bus info: scsi@2:0.0.0
          logical name: /dev/sda
[...]
  *-scsi
       physical id: 3
       bus info: usb@1:2
       configuration: driver=usb-storage
     *-disk
          description: SCSI Disk
          physical id: 0.0.0
          bus info: scsi@6:0.0.0
          logical name: /dev/sdc
[...]

Respuesta4

Simplemente lea el valor de /sys/block/sdX/removable.

Por ejemplo:

$ cat /sys/block/sda/removable
0
$ cat /sys/block/sdc/removable
1

/dev/sdces una llave USB (podría ser una tarjeta SD o cualquier otro medio extraíble).

información relacionada