
Como posso saber se é um HDD local ou uma chave USB? Eu preferiria uma maneira de fazer isso sem privilégios de root./dev/sdX
OK, udevadm
ajudou muito:
Para HDD local:
udevadm info --query=all --name=sdb | grep ID_BUS
E: ID_BUS=ata
Para chave USB:
udevadm info --query=all --name=sdc | grep ID_BUS
E: ID_BUS=usb
Responder1
Existem algumas maneiras de saber sem privilégios de root, muitas delas complicadas/hackeadas:
Usando /dev/disk/by-id
:
find /dev/disk/by-id/ -lname '*sdX'
Se responder com algo como /dev/disk/by-id/usb-blah-blah-blah
, então é um disco USB. Outros prefixos incluem ata
,,,,, etc.dm
memstick
scsi
Usar /dev/disk/by-path
não é significativamente diferente:
find /dev/disk/by-path/ -lname '*sdX'
Você obterá algo como /dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0
. Isso mostra o caminho do dispositivo que leva ao disco. Nesse caso, um caminho aproximado é PCI → USB → disco. (Note o -usb-
).
Usando o udev (eu executo o Debian. Meu udevadm
está no /sbin
qual não está no meu $PATH
- o seu pode estar em outro lugar, dentro ou fora do seu $PATH
):
/sbin/udevadm info --query=all --name=sdX | grep ID_BUS
Você obterá o tipo de barramento em que o dispositivo está. Remova o | grep ID_BUS
para obter a listagem completa de informações (talvez seja necessário adicionar |less
).
Se você lshw
instalou, a resposta da Huygenspoderiatambém funciona:
lshw -class disk -class storage | less
E observe a saída do seu disco. Em less
, tente /sdX e observe as linhas anteriores bus info
- a primeira dirá apenas scsi@…
, mas a que está várias linhas antes será mais esclarecedora. No entanto, você realmentedeveexecute-o como superusuário, portanto, pode não ser adequado. (sintomas: no laptop que tentei, ele listou o disco SATA, mas não o USB - rodando com sudo
ambos listados)
Existem outros também, mais ou menos diretos que estes.
Responder2
Você poderia usar lsblk
para relatar TRAN
(tipo de transporte de dispositivo):
lsblk -do name,tran
NAME TRAN
sda sata
sdb sata
sdd usb
onde -d
ou --nodeps
significa não imprimir escravos e -o name,tran
ou --output name,tran
significa listar apenas o nome do dispositivo e o tipo de transporte do dispositivo. Adicione rm
à lista de colunas de saída para ver quais dispositivos são removíveis ( 1
if true
):
lsblk --nodeps --output NAME,TRAN,RM
NAME TRAN RM
sda sata 0
sdb sata 0
sdd usb 1
ou -n
para remover cabeçalhos, por exemplo, para imprimir apenas o tipo de transporte para uma determinada unidade:
lsblk -ndo tran /dev/sdb
sata
Observe que as versões modernas lsblk
( 2.27
e mais recentes) suportam JSON
saída, então você também pode fazer algo como:
lsblk -Jdo name,tran | jq -r '.blockdevices[] | select(.tran=="usb") | .name'
para listar apenas os dispositivos de bloco conectados no USB
barramento.
Responder3
Conheço uma solução, mas, infelizmente, requer privilégios de root. De qualquer forma, você ainda pode achar útil:
sudo lshw -class disk -class storage
Para cada dispositivo ele imprimirá o nome lógico (por exemplo, /dev/sda
) e as informações do barramento, que no caso de um dispositivo USB seria algo como 'usb@1:2'.
Exemplo de saída:
[...]
*-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
[...]
Responder4
Basta ler o valor de /sys/block/sdX/removable
.
Por exemplo:
$ cat /sys/block/sda/removable
0
$ cat /sys/block/sdc/removable
1
/dev/sdc
é uma chave USB (pode ser um cartão SD ou qualquer outra mídia removível).