Udev

通過主要/次要數字對獲取設備節點

  • January 8, 2020

下的每個設備節點/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 組合,因此每次呼叫可能會列印多個路徑。

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