識別裝置插入哪個 USB 連接埠

識別裝置插入哪個 USB 連接埠

我正在開發自訂 Bash 腳本,用於 USB 快閃記憶體的大規模複製和大規模測試(使用f3)。

我想知道是否可以識別隨身碟插入哪個 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

一旦插入 USB 隨身碟,它將詳細地發出 Kernel & Udev 訊息,並在最後一行告訴我們主機如何看到 USB 隨身碟:

18.04 udevadm 監控指令回饋

答案3

看起來/dev/disk/by-path包含/dev/sd*節點的符號鏈接,可以用來準確地找出它。

發出file /dev/disk/by-path/*指令會列出所有/dev/sd*節點及其實體位址。我應該能夠很輕鬆地透過 grep 解決這個問題。

相關內容