ドライブが外付けか内蔵かを検出したいです。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