
¿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, udevadm
me 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
, scsi
etc.
El uso /dev/disk/by-path
no 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 udevadm
está en /sbin
el 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_BUS
para obtener una lista completa de información (es posible que deba agregar |less
).
Si lo ha lshw
instalado, 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 info
lí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 sudo
ambos enumerados)
También hay otros, más o menos directos que estos.
Respuesta2
Podrías usar lsblk
para informar TRAN
(tipo de transporte del dispositivo):
lsblk -do name,tran
NAME TRAN
sda sata
sdb sata
sdd usb
donde -d
o --nodeps
significa no imprimir esclavos y -o name,tran
/o --output name,tran
significa enumerar solo el nombre del dispositivo y el tipo de transporte del dispositivo. Agregue rm
a la lista de columnas de salida para ver qué dispositivos son extraíbles ( 1
si true
):
lsblk --nodeps --output NAME,TRAN,RM
NAME TRAN RM
sda sata 0
sdb sata 0
sdd usb 1
o -n
para 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.27
y más recientes) admiten JSON
resultados, 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 USB
bus.
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/sdc
es una llave USB (podría ser una tarjeta SD o cualquier otro medio extraíble).