我想检测驱动器是外置的还是内置的。我有一个通过 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