Linux

如果我連接一個物理設備,我怎麼知道哪個設備文件屬於它?

  • February 26, 2015

假設我插入了幾個不會自動掛載的 USB 驅動器。如何找出哪個設備文件屬於哪個物理設備,以便我可以掛載它?

我正在執行 Mac OS X,但我更喜歡適用於所有(或至少最流行的)Unix 系統的答案。我過去在 Linux 上遇到過這個問題。

使用 udev:

您可以獲得有用的資訊查詢udev(在使用它的系統上 - 幾乎所有桌麵類型的 Linux 都是肯定的)。例如,如果您想知道哪個附加驅動器與 關聯/dev/sdb,您可以使用:

udevadm info --query=property --name=sdb

它將顯示該設備的屬性列表,包括序列號 (ID_SERIAL_SHORT)。有了這些資訊,您可以查看輸出lsusb -v並找出製造商和產品名稱等資訊。

執行此操作的更短路徑是

udevadm info --query=property --name=sdb | grep "\(MODEL_ID\|VENDOR_ID\)"

$ID_VENDOR_ID:$ID_MODEL_ID並在更短的輸出中查看匹配的行 lsusb

另一個有用的選項是udevadm monitor. 如果您想知道在附加設備時創建了哪個設備節點,請使用它。所以首先執行

udevadm monitor --udev --subsystem-match=block

然後連接設備。您將在每個輸出行的末尾看到檢測到的塊設備(磁碟/分區)的設備名稱。

一個實際的範例 shell 函式:

這是您可以放入.bashrc(or .zshrc) 的函式:

listusbdisks ()
{
[[ "x$1" == "xv" ]] && shift && local VERBOSE=-v
對於 ${@-/dev/sd?} 中的 dsk
做
/sbin/udevadm 資訊 --query=path --name="$dsk" | grep --color=auto -q usb || 繼續
echo "===== 設備 $dsk 是:"
( eval $(/sbin/udevadm info --query=property --name="$dsk" | grep "\(MODEL\|VENDOR\)_ID")
[ "$ID_VENDOR_ID:$ID_MODEL_ID" == ":" ] && echo "未知" || \
lsusb $VERBOSE -d "$ID_VENDOR_ID:$ID_MODEL_ID"
)
grep -q "$dsk" /proc/mounts && echo "----- DEVICE IS MOUNTED ----"
迴聲
完畢
}

像這樣使用它:

  • listusbdisks- 辨識所有/dev/sdx設備;
  • listusbdisks sdblistusbdisks /dev/sdblistusbdisks sdb sdc- 僅獲取有關某些設備的資訊;
  • listusbdisks -v [optional devices as above]- 顯示詳細輸出lsusb

*$$ Edit $$:*添加了一些功能,例如查詢許多設備、檢查掛載和控制lsusb.

引用自:https://unix.stackexchange.com/questions/18064