1. 程式人生 > >udev 規則檔案的寫法

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       在真正的裝置節點建立之前,建立的一個臨時的裝置節點的名字,這個臨時裝置節點供外部程式使用。

                            %%                   '%' 字元自己

                            $$                      '$' 字元自己