デバイスが接続されているUSBポートを識別する

デバイスが接続されているUSBポートを識別する

私は、USB フラッシュ メモリの大量複製と大量テスト ( を使用f3) 用のカスタム Bash スクリプトを作成中です。

ペンドライブがどの USB ポートに接続されているかを識別することは可能でしょうか。

番号付きポートを備えた USB ハブがあります。これらのハブに静的アドレスがいくつかあり、それを識別して、何かが差し込まれているかどうか、またそれが何であるか (基本的に、どの /dev/sd* ファイルがその USB ポートに対応しているか) がわかれば、ユーザーが状況を把握し、プロセスの初期段階で不良ドライブを削除できるようになります。バッチ全体が処理されるまで待ってから不良ドライブを正常なドライブから選別する必要はありません (これが私が現在行っている方法です)。

いろいろ検索してみましたが、私が達成したいことと一致するものが何も見つからなかったので、この件に関して直接助けを求めることにしました。

現在、私は /dev/sd* ノード名でドライブを識別していますが、ユーザーにはそれが何なのかわかりません。これらをハブの USB ポートにマップできれば、USB ポートに基づいて情報を表示でき、ユーザーはポート 5 に不良ドライブが接続されていることを知ることができ、残りのプロセスを妨げることなくそのドライブを取り外すことができます。

その後、バッチでの実行をやめて、すべてのポートをループで同時に動作させることもできます。ユーザーは、HUB ポート番号によって何が何であるかを追跡しながら、ドライブを常に抜き差しできるため、ワークフローを大幅に改善できます。

それで、基本的な質問です。USB ポートと、これらのポートに接続されている USB フラッシュ メモリをどのように識別できるのでしょうか?

答え1

使用しudevadmて取得できますデバイスパス何らかのデバイスの。これは のシンボリックリンクを調べることによって行われるため/sys/、手動で行うこともできます (ただし を使用する方が簡単ですudevadm)。

たとえば、私のシステムの外付けUSBハブに差し込んだUSBスティックは、

$ udevadm info -q path -n /dev/sdh
/devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1.1/3-1.1.3/3-1.1.3.2/3-1.1.3.2:1.0/host7/target7:0:0/7:0:0:0/block/sdh

USBツリーと比較するとわかるように、

$ lsusb -t
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
        |__ Port 1: Dev 26, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 3: Dev 29, If 0, Class=Hub, Driver=hub/4p, 480M
                |__ Port 2: Dev 31, If 0, Class=Mass Storage, Driver=usb-storage, 480M
                |__ Port 4: Dev 30, If 0, Class=Mass Storage, Driver=usb-storage, 480M
...

パスの一部に3-1.1.3.2は、バス 3 ではポート 1 (サウスブリッジ上)、再びポート 1 (マザーボード上)、ポート 3 (やはりマザーボード上) を経由して、外部 USB ハブのポート 2 を通過すると書かれています。このハブのポート 4 は SD カード リーダーに使用されます。

したがって、USB ハブの接続方法に応じて、同様の操作を実行し、関心のある最後のポートを抽出する必要があります。

答え2

これは、デバイスの名前がわからないためにコマンドにデバイス名を渡せない場合に、受け入れられている解決策の代替手段です (デバイスに関する情報をコマンドに渡すため)。

前にUSBフラッシュドライブを挿入し、次を実行します。

udevadm monitor

スティックが挿入されると、カーネルと Udev のメッセージが詳細に出力され、最後の行にホストが USB スティックをどのように認識しているかが表示されます。

18.04 udevadm モニター コマンド フィードバック

答え3

/dev/disk/by-pathノードへのシンボリックリンクが含まれているようで/dev/sd*、正確にそれを見つけるために使用できます。

コマンドを発行すると、file /dev/disk/by-path/*すべての/dev/sd*ノードとその物理アドレスが一覧表示されます。grep で簡単に検索できるはずです。

関連情報