如何判斷硬碟是外接USB還是內建硬碟?

如何判斷硬碟是外接USB還是內建硬碟?

我想檢測驅動器是外部驅動器還是內部驅動器。我有一個透過 SATA-USB 轉接器連接到 USB 連接埠的 SATA 磁碟機。

hdparm -I 將其報告為:

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.

它顯然是直接從驅動器獲取這些數據。 hdparm 是否可以偵測實際的傳輸層,而不是驅動器報告的傳輸層?

我也嘗試過lsusb。好像沒什麼用。它是人類可讀的,但無法將其輸出與其他設備命令交叉引用。遍歷總線似乎lsusb -D /dev/bus/usb/...也不合適,儘管也許我可以做類似的事情find /dev/bus | while read -r line; do if((lsusb -D $line | grep) CONTAINS SOME SUBSTRING MENTIONING THE DEVICE) then blah done

parted --list也無法報告外部驅動器透過 USB 運作的事實:

Model: ADATA SU 800 (scsi)

答案1

我可以這樣說:

$ 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

筆記:

  • 如果沒有,realpath那麼readlink可能會給你一個線索。
  • 查詢特定設備、其中一些設備(如上)或全部(/sys/block/*)。
  • 在我的 Kubuntu 中/sys/class/block/也包含分區條目(例如sda1)。

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

相關內容