f3
私はUSBフラッシュドライブの大規模コピーと大規模テスト(使用)用のカスタムBashスクリプトを開発しています。
ペンドライブがどのUSBポートに接続されているかを識別できるかどうかを知りたいです。
番号付きポートを備えたUSBハブがあります。何かが接続されているかどうかを識別し、知っている静的アドレスがあり、それが何であるか(デフォルトではUSBポートに対応する/ dev / sd *ファイル)、ユーザーが何であるかを理解しやすくすることができます。引き続きバッチ全体が処理されるのを待ってから、良いドライブから不良ドライブを分類するのではなく、プロセスの早い段階で不良ドライブを取り外すことができます(これは私がやっていることです)。
私は周りを探してみましたが、私が達成したい目標と一致するものが見つからなかったので、この場合は助けを求めることにしました。
これで、/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
ポート1(サウスブリッジ)を通過し、再びポート1(マザーボード)を通過し、ポート3(まだマザーボードにあります)を通過し、外部USBハブのポート2を通過するバス3に表示されます。 。このハブのポート4はSDカードリーダーに使用されます。
したがって、USBハブの接続方法に応じて同様の操作を実行し、関心のある最後のポートを抽出する必要があります。
答え2
答え3
ノードを見つけるために使用できるノードへのシンボリックリンクが/dev/disk/by-path
含まれているようです。/dev/sd*
file /dev/disk/by-path/*
コマンドを実行すると、すべての/dev/sd*
ノードとその物理アドレスが一覧表示されます。私はこれを簡単にキャッチできるはずです。