我想檢測驅動器是外部驅動器還是內部驅動器。我有一個透過 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