前面知道了 udev 裝置命名規則 https://benjr.tw/10607 ,現在我們要自己撰寫規則,先來看一下這些 rule 的格式.
root@ubuntu:~# cat /lib/udev/rules.d/50-udev-default.rules | grep -i tty SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666" SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666" SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620" SUBSYSTEM=="tty", KERNEL=="sclp_line[0-9]*", GROUP="tty", MODE="0620" SUBSYSTEM=="tty", KERNEL=="ttysclp[0-9]*", GROUP="tty", MODE="0620" SUBSYSTEM=="tty", KERNEL=="3270/tty[0-9]*", GROUP="tty", MODE="0620" SUBSYSTEM=="vc", KERNEL=="vcs*|vcsa*", GROUP="tty" KERNEL=="tty[A-Z]*[0-9]|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout"
root@ubuntu:~# cat /lib/udev/rules.d/60-persistent-storage.rules |grep -i path # persistent storage links: /dev/disk/{by-id,by-uuid,by-label,by-path} # by-path ENV{DEVTYPE}=="disk", DEVPATH!="*/virtual/*", IMPORT{builtin}="path_id" ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}" ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-part%n"
基本規則
udev 提供了幾個不同的匹配鍵,下面介紹一些最常見的鍵.都可以用來寫入匹配設備的規則內.
- KERNELS – 匹配設備的核心 (kernel) 名稱,或任何父設備的核心名稱.
- SUBSYSTEMS – 與設備的子系統 (subsystem) 或任何父設備的子系統匹配.
- DRIVERS – 與支持設備的驅動 (driver) 程序的名稱匹配,或者支持任何父設備的驅動程序名稱.
- ATTRS – 匹配設備的 sysfs 屬性 (attribute) 或任何父設備的 sysfs 屬性.
- ENV – Environment 環境變數 udev 一樣可以使用於匹配和分配的值.
- GROUP – GROUP 分配允許您定義哪個 Unix 群組擁有這個設備節點.
udev 要在命名裝置時有兩種方式 NAME 和 SYMLINK.
- NAME – 用於實際設備節點的名稱
- SYMLINK – 作為設備節點替代名稱的連結 (symbolic links)
在撰寫規則時可以先透過指令 #udevadm (舊指令為 #udevinfo -ap) 參考裝置的訊息.
雖然 udev 會產生很多符合 rules 的裝置名稱出來但裡面只有一個是真的裝置 (使用 NAME) 其他的都是連結 (symbolic link),而且 SYMLINK 沒有個數的限制.
常見的基本 rules 範例如下:
KERNEL=="sdb", NAME="my_spare_disk"
系統會找到符合 KERNEL 為 sdb 裝置,並產生這個裝置為 /dev/my_spare_disk.之後你就可以使用 /dev/my_spare_disk 取代原本的 /dev/hdb.
KERNEL=="hdb", DRIVER=="ide-disk", SYMLINK+="sparedisk"
系統會找到符合KERNEL 為 hdb 裝置而且 driver(module) 是 ide-disk 的.當沒有指定 NAME 時系統會自動產生一個預設的裝置還會多出一個指定連結 /dev/sparedisk 出來.
KERNEL=="hdc", SYMLINK+="cdrom cdrom0"
當然 SYMLINK 可以同時指定多個名稱出來,SYMLINK+=”cdrom cdrom0″ 就會產生連結到 /dev/hdc(系統預設的) 的 /dev/cdrom 和 /dev/cdrom0.
字串替換(String substitutions)
在設定 rules 如果不同裝置都符合時,那裝置名稱要如何命名呢!!udev 提供幾個參數來使用讓裝置名稱可以依據不同的狀況有多個裝置的產生.最常使用的是 %k 和 %n.
%k 代表是用 kernel 名稱來命名裝置.
KERNEL=="hd[a-z]", BUS=="ide", SYSFS{removable}=="1", SYSFS{device/media}=="cdrom", SYMLINK+="cdrom cdrom-%k"
cdrom-%k 如果 kernel 的裝置名稱為 hdc ,udev 名稱就會被命名為 /dev/cdrom-hdc
%n 代表是用 number 來命名裝置.
KERNEL=="sr[0-9]*", BUS=="scsi", NAME+="scd%n" NAME+="scd%n"
就會依據當時實際的裝置順序來指定.第一個符合的裝置就會是 /dev/scd0 ..
參數很有很多請自行參考 udev 的 man page.其中 % 和 $ 都被當作特殊字元所以要真的使用這兩個字元時,用 %% 和 $$ 來取代.
字串匹配(String matching)
為了讓比對能夠精簡你可以用下面 3 個符號來指定.這3個就是一般我們使用 Linux Shell 常見的符號
* 符合所以的字元可以是 0 個也可以是多個.
如下就代表只要是 ttyUSB 開頭的都可以
KERNEL=="ttyUSB*"
? 符合這一個字元的
如下就代表只要是 ttyUSB 開頭然後多一個字元的皆可.
KERNEL==KERNEL=="ttyUSB?"
[] 符合[]內指定的任何一個字元.
如下就代表 hda,hdb…一直到 hdz
KERNEL=="hd[a-z]"
One thought on “udev 基本規則 (Rules) 與 配對 (match)”