如何检测硬盘是外部 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

相关内容