Como saber se /dev/sdX é um USB ou HDD conectado?

Como saber se /dev/sdX é um USB ou HDD conectado?

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, udevadmajudou 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.dmmemstickscsi

Usar /dev/disk/by-pathnã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 udevadmestá no /sbinqual 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_BUSpara obter a listagem completa de informações (talvez seja necessário adicionar |less).

Se você lshwinstalou, 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 sudoambos listados)

Existem outros também, mais ou menos diretos que estes.

Responder2

Você poderia usar lsblkpara relatar TRAN (tipo de transporte de dispositivo):

lsblk -do name,tran

NAME TRAN
sda  sata
sdb  sata
sdd  usb

onde -dou --nodepssignifica não imprimir escravos e -o name,tranou --output name,transignifica 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 ( 1if true):

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

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

ou -npara 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.27e mais recentes) suportam JSONsaí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 USBbarramento.

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).

informação relacionada