Como detectar se um disco rígido é USB externo ou interno?

Como detectar se um disco rígido é USB externo ou interno?

Quero detectar se uma unidade é externa ou interna. Eu tenho uma unidade SATA conectada a uma porta USB através de um adaptador SATA-USB.

hdparm -I relata como:

ATA device, with non-removable media
...
Transport: Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6, SATA Rev 3.0.

Aparentemente, ele obtém esses dados diretamente da unidade. É possível que o hdparm detecte a camada de transporte real, em vez daquela que a unidade reporta?

Eu também tentei lsusb. Não parece ser útil. É legível por humanos, mas não há como fazer referência cruzada de sua saída com outros comandos do dispositivo. Iterar através de ônibus lsusb -D /dev/bus/usb/...também não parece apropriado, embora talvez eu pudesse fazer algo comofind /dev/bus | while read -r line; do if((lsusb -D $line | grep) CONTAINS SOME SUBSTRING MENTIONING THE DEVICE) then blah done

parted --listtambém não informa o fato de que a unidade externa está sendo executada em USB:

Model: ADATA SU 800 (scsi)

Responder1

Eu posso dizer assim:

$ realpath /sys/block/sd*
/sys/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda
/sys/devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0/block/sdb
/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/host6/target6:0:0/6:0:0:0/block/sdc

Notas:

  • Se não, realpathentão readlinkpode lhe dar uma pista.
  • Consulta sobre um dispositivo específico, alguns deles (como acima) ou todos eles ( /sys/block/*).
  • No meu Kubuntu /sys/class/block/também contém entradas para partições (por exemplo sda1).

Solução POSIX:

$ for p in /sys/block/sd*; do (cd "$p" && pwd -P); done
/sys/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda
/sys/devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0/block/sdb
/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/host6/target6:0:0/6:0:0:0/block/sdc

informação relacionada