udev 規則文件的寫法

配置文件

udev的配置文件位於 /etc/udev//lib/udev/ ( # 開頭的是註釋)

udev 的主配置文件是 /etc/udev/udev.conf。 它包含一套變量,允許用戶修改 udev 默認值。可以設置的變量如下:

udev_root 設備目錄,默認是 /dev

udev_log 日誌等級(表示嚴重程度),跟 syslog 一致,例如: err, info, debug。


 

規則文件

udev的規則文件一般位於 /lib/udev/rules.d/ ,也可以位於 /etc/udev/rules.d/

臨時存放規則文件的目錄是 /dev/.udev/rules.d/

規則文件是按照字母順序處理的,不管放在哪個目錄。對於相同名字的規則文件, /etc/udev/rules.d 比 /lib/udev/rules.d 優先。

規則文件必須以 .rules 作爲擴展名,否則不被當作規則文件。


 

規則文件的每一行都是 key=value 格式。 key 有兩個類型:1)匹配型 key 2)賦值型 key

當所有匹配型 key 都匹配時,該規則即被採用,賦值型 key 就會獲得相應的值。

當規則匹配時,可以重命名網絡接口, 創建到設備節點的符號鏈或運行一個指定程序來處理該事件。


 

一條規則由多個key=value 組成,以英文逗號隔開。 每個 key 有一個操作,取決於操作符,有效的操作符如下:

== 比較是否相等

!= 比較是否不相等

= 給一個key 賦值。 表示一個列表的key會被重置,並且把這個唯一的值傳給它

+= 將一個值增加到key中

:= 將一個值傳給一個key,並且不允許再修改這個key。
 


 

下面的 key 可以匹配設備屬性,部分 key 也可用於匹配 sysfs 中的父設備屬性,不僅僅是產生事件的那個設備。

如果在一個規則中,有多個key匹配了一個父設備,則這些 key 必須匹配同一個父設備:


 

ACTION 匹配事件的動作名

DEVPATH 匹配事件的設備devpath

KERNEL 匹配事件的設備名

NAME 匹配網絡接口或者設備節點的名字。NAME 只有在前面的規則賦值之後纔可以使用。

SYMLINK 匹配設備節點符號鏈的名字。SYMLINK 只有在前面的規則賦值之後纔可以使用。可以有多個 symlinks,只需要匹配一個。

SUBSYSTEM 匹配設備子系統

DRIVER 匹配設備的驅動名。只對綁定到一個驅動的設備有用。

ATTR { filename } 匹配事件設備的 sysfs 屬性。
 

KERNELS 向上搜索devpath,直到找到一個匹配的設備名
 

SUBSYSTEMS 向上搜索devpath,直到找到一個匹配的子系統名

DRIVERS 向上搜索devpath,直到找到一個匹配的驅動名
 

ATTRS{ filename } 向上搜索devpath,直到找到一個含匹配 sysfs 屬性的設備

ENV{ key }

TAG 設備的 tag

TEST{octal mode mask} 測試一個文件是否存在,可以指定一個8進制的模式掩碼。

PROGRAM 執行一個程序。如果程序成功返回, key 爲 true。設備的屬性被放在被執行進程的環境變量中,該程序

的輸出爲 stdout, 可以從 RESULT 這個 key 讀取。

RESULT 匹配最近一次 PROGRAM 調用的返回字符串。它應該在 PROGRAM 之後使用。


 

支持一些shell的通配符: * ? [ ]


 

下面的key 是賦值型 key:

NAME

SYMLINK

OWNER, GROUP, MODE

ATTR { key }

ENV { key }

TAG

RUN
 

LABEL GOTO 可以跳到的地方
 

GOTO 跳到下一個帶有匹配名字的 LABEL 處。
 

IMPORT { type }

WAIT_FOR

OPTIONS


 

NAME, SYMLINK, PROGRAM, OWNER, GROUP、MODE 和 RUN 這些 field 支持一個簡單的、類似於 printf 函數的格式字符串替換。

在所有規則被處理之後,在程序執行之前,RUN 格式字符被應用,從而能讓程序訪問前面已匹配的規則設置的屬性。

對於所有其他的 field,當單個規則被處理時,發生字符替換。可用的字符替換如下:

$kernel, %k 該設備的內核名字

$number, %n 該設備的內核號碼。例如 sda3 的內核號碼是 3。

$devpath, %p 該設備的 devpath

$id, %b 當向上搜索devpath,尋找 SUBSYSTEMS, KERNELS, DRIVERS 和 ATTRS 時,被匹配的設備名字

$driver 當向上搜索devpath,尋找 SUBSYSTEMS, KERNELS, DRIVERS 和 ATTRS 時,被匹配的驅動名字

$attr { file }, %s { file } 一個被發現的設備的 sysfs 屬性的值。如果該設備沒有該屬性,且前面的 KERNELS, SUBSYSTEMS, DRIVERS

或 ATTRS 測試選擇的是一個父設備,那麼就用父設備的屬性。如果屬性是一個符號鏈,符號鏈的最後一個元素作爲返回值。

$env { key }, %E { key } 一個設備屬性值

$major, %M 該設備的內核主號碼

$minor, %m 該設備的內核次號碼

$result, %c 由 PROGRAM 調用的外部程序返回的字符串。如果這個字符串包含空格,可以用 %c{N} 選中第N個字段。

如果這個數字N,後面有一個 + 字符, 則表示選中從這個字段開始的所有後面的字符串 %c { N + }

$parent, %p 父設備的節點名字

$name 設備節點的名字,用一個空格作爲分隔符。該值只有在前面的規則賦值之後才存在,或者是remove事件。

$links 當前符號鏈的列表,用空格隔開。該值只有在前面的規則賦值之後才存在,或者是remove事件。

$root, %r udev_root 的值

$sys, %S sysfs 掛載點

$tempnode, %N 在真正的設備節點創建之前,創建的一個臨時的設備節點的名字,這個臨時設備節點供外部程序使用。

%% '%' 字符自己

$$ '$' 字符自己
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章