
我正在開發自訂 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
答案3
看起來/dev/disk/by-path
包含/dev/sd*
節點的符號鏈接,可以用來準確地找出它。
發出file /dev/disk/by-path/*
指令會列出所有/dev/sd*
節點及其實體位址。我應該能夠很輕鬆地透過 grep 解決這個問題。