Udev
通過主要/次要數字對獲取設備節點
下的每個設備節點
/dev
都有自己的主要/次要編號對。我知道我們可以通過 來從設備節點中檢索這對數字stat
,如下所示:stat -c 'major: %t minor: %T' <file>
或者,
ls -l
也顯示這些數字。但是我們如何通過給定的主要和次要編號來獲取設備節點?我知道的唯一方法是某種
ls -l
+awk
技巧,但我真的希望有更好的解決方案。
我發現了一種使用sys偽文件系統的更簡單的方法,在*/sys/dev中,設備按類型排序,然後按主要/次要排序,文件uevent*包含設備名稱和一堆其他資訊。
例如,
for file in $(find /sys/dev/ -name 7:0); do source ${file}/uevent; echo $DEVNAME; done;
迴聲,
loop0 vcs
注意:這是在 Debian Wheezy 中測試的
顯然它可以更簡單地完成
udevadm
,我剛剛發現瞭如何。
DEVNAME
要從您那裡獲取資訊,udevadm
您只需執行以下操作:udevadm info -rq name $PATH
例如,如果你想知道你的
/dev
名字,/sys/dev/char/5:1
你會這樣做:udevadm info -rq name /sys/dev/char/5:1
輸出
/dev/console
-r
選項是指定一個ed 路徑 - 如果沒有它,上面的--root
結果將是只讀的console
。該-q
選項指定了一個數據庫--query
,它在name
這裡接受操作數 - 因為我們想要DEVNAME
.僅給定主要:次要數字的查找字元和/或塊設備路徑的非常簡單的方法可能如下所示:
mmdev() for d in /sys/dev/[cb]*/$1:$2 do [ -e "$d" ] || return printf %c:%s: "${d#/*/*/}" "${d##*/}" udevadm info -rq name "$d" done
所以執行:
mmdev 8 0
印刷…
b:8:0:/dev/sda
這是我寫的第一個。
majminpath() { set -- ${1##*[!0-9]*} ${2##*[!0-9]*} udevadm info --export-db | sed 's|^[^=]*DEVNAME=|| \|^[^/]|!h;/MAJOR=/N \|='"$1\n.*=${2?}"'$|!d;g' }
這只是掃描
udevadm info --export-db
匹配數字的輸出。輸出如下所示:P: /devices/virtual/vc/vcsa4 N: vcsa4 E: DEVNAME=/dev/vcsa4 E: DEVPATH=/devices/virtual/vc/vcsa4 E: MAJOR=7 E: MINOR=132 E: SUBSYSTEM=vc P: /devices/virtual/vc/vcsa5 N: vcsa5 E: DEVNAME=/dev/vcsa5 E: DEVPATH=/devices/virtual/vc/vcsa5 E: MAJOR=7 E: MINOR=133 E: SUBSYSTEM=vc #...and so on
工作流程如下:
- 嘗試
[^=]*DEVNAME=
從每行的開頭剝離字元串- 如果一行沒有第一個字元或其第一個字元是
/
將該行複製到h
舊空間- 如果一行匹配,則將ext 輸入行
MAJOR=
附加到模式空間N
- 如果模式空間中有 2 行匹配,
=$1\n.*=$2$
則將舊空間複製h
到模式空間並自動列印;否則刪除模式空間所以如果我這樣做:
majminpath 7 133 ; majminpath 8 0 ; majminpath 8 1
輸出
/dev/vcsa5 /dev/sda /dev/sda1
但是,正如@xae 指出的那樣,塊/字元類型的設備可以共享 maj:min 組合,因此每次呼叫可能會列印多個路徑。