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/
臨時存放規則檔案的目錄是 /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 在真正的裝置節點建立之前,建立的一個臨時的裝置節點的名字,這個臨時裝置節點供外部程式使用。
%% '%' 字元自己
$$ '$' 字元自己