-
Notifications
You must be signed in to change notification settings - Fork 15
/
92.1、udev - systemd 的设备管理与规则文件
365 lines (262 loc) · 11.2 KB
/
92.1、udev - systemd 的设备管理与规则文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
名称
udev 动态设备管理
描述
udev 为系统软件提供了设备事件、设备节点权限控制、在 /dev 目录下创建额外的软链接、或者重命名网络界面的功能
内核一般仅通过发现顺序提供一系列不可读的设备名
有意义的软链接或网络设备名提供了一种可靠地通过设备属性和当前配置甄别设备的能力
当硬件发生 增加/移除/改变状态 时,udev 的守护进程—— systemd-udevd.service(8),可以直接从内核中获取设备的 uevent
当 udev 获取一个设备事件,它会将设备属性和已经配置好的规则集进行匹配,来分辨出设备
被匹配上的规则会提供设备附加的信息,而这些信息将存放在 udev 的数据库中,或被用于创建有意义的软链接名
所有 udev 处理的设备的信息都存放在 udev 的数据库中,并会被发给可能的事件订阅者
可以通过 libudev 库,获取全部的存储数据库和事件源
规则文件
udev 规则将从以下几个目录中读取
系统级别规则目录 /usr/lib/udev/rules.d
动态的运行时目录 /run/udev/rules.d
本地管理员目录 /etc/udev/rules.d
所有规则文件都集中排序,并按照字符顺序处理,而无视它们存放的目录
但是具有相同文件名的文件将替换其他文件:
/etc 下的文件具有最高的优先级,其次是 /run 下的,最后是 /usr/lib 下的
这可用于覆盖系统提供的规则
一个 /etc 下的规则文件,若与 /usr/lib 下的规则文件同名,但指向 /dev/null 的话,会屏蔽 /usr/lib 下同名的规则文件
一个规则文件必须以 .rules 结尾,其他的扩展名将会被忽略
规则文件的每行至少含所有一对 键-值 对
除了空行和以 # 开头的行,它们将被省略
有两种键:匹配键和赋值键
如果有的内容都通过匹配键匹配上了值,则规则将被启用,且赋值键将赋予特殊的值
一个匹配规则可以用来重命名一个网络界面,添加指向设备节点的软链接,或者运行一个特殊的程序来作为事件处理的一部分
一个规则可以包含一系列 逗号分隔 的 键-值 对
每个键都有一个明确的操作,它受到被使用的操作符的控制
合法的操作符包括:
==
等于比较
!=
不等于比较
=
将指定值赋予键,具有列表的键将会被重置,并仅含有这个被赋予的值
+=
将指定值追加至键的值列表后
-=
从键的值列表中删去指定值
:=
确定键的最终值,并禁用后续的任何更改
下列键名可以用于匹配设备的属性
部分键不仅可用于匹配产生事件的设备,也可用于匹配在 sysfs 中出现其的父级设备的属性
如果在同一个规则中,出现了多条匹配父级设备的键,则所有的键必须被用于匹配唯一且相同的父级设备
ACTION
匹配事件的名称
DEVPATH
匹配设备事件的 devpath
KERNEL
匹配事件设备的名称
NAME
匹配网络界面的名称
一旦前面的规则中出现了对 NAME 的赋值,则 NANE 匹配就可以被使用
SYMLINK
匹配软链接名称指向的节点
一旦前面的规则中出现了对 SYMLINK 的赋值,则 SYMLINK 匹配就可以被使用
可能会有多个软链接,仅需一个呗匹配上
DRIVER
匹配事件设备的驱动名
若要为设备设置该键,则仅在设备被绑定驱动,产生事件时设置
ATTR{文件名}
匹配事件设备的 sysfs 属性值
属性值末尾的空白字符会被省略,除非匹配规则的值本身具有尾端空白字符
KERNELS
向上搜索 devpath 来匹配 设备名
SUBSYSTEMS
向上搜索 devpath 来匹配设备的 subsystem 名
DRIVERS
向上搜索 devpath 来匹配设备的 驱动名
ATTRS{文件名}
向上搜索 devpath 中匹配 sysfs 的属性值的设备
若有多个 ATTRS 匹配条件,则所有的匹配条件必须被同一个设备满足
属性值末尾的空白字符会被省略,除非匹配规则的值本身具有尾端空白字符
TAGS
向上搜索 devpath 中匹配上 tag 的设备
ENV{值}
匹配设备的属性值
TAG
匹配设备的 tag
TEST{八进制模式掩码}
测试文件存在与否
八进制权限掩码可以被指定
PROGRAM
执行一个程序来确定是否匹配
若程序成功返回,则键的值为 true
设备属性通过环境变量的方式传入待执行的程序
程序的 StdOut 可以用于 RESULT 键中
仅可用于短暂运行的前景任务
细节参见 RUN
RESULT
匹配最后一次 PROGRAM 调用返回的字符串
这个键可以用于与 PROGRAM 同一条或其后任何一条规则之中
大部分字段支持 shell 的 glob 样式匹配和可选样式(“或”样式)
下列特殊字符同样被支持:
"*"
匹配 0 个或多个字符
"?"
匹配单一字符
"[]"
匹配出现在方括号内的单一字符
允许使用连字符 - 来指定连续的字符
左方括号后紧随感叹号 ! 表示取反
"|"
分离可选样式
下列键可以被赋值:
NAME
给网络界面命名
参看 systemd.link(5) 来了解设置界面名的高阶机理
设备的节点名不可被 udev 修改,仅有附加的软链接可以被创建
SYMLINK
指向节点的软链接名
每个匹配上的规则都向待创建的软链接的表中添加值
用于设置软链接的字符是受限的
仅包含
“0-9A-Za-z#+-.:=@_/”
合法的 UTF-8 字符串
\x00 十六进制编码
其他字符都被 “_” 替代
多个软链接可以用空格隔开来指定
若多个设备声明了同一个名称,则名称指向具有最高 link_priority 的设备
若当前设备消失,则链接呗从新计算,并分配给当前具有最高 link_priority 的设备
若没有指定 link_priority,则设备的顺序和谁将获得链接,则不可知
软链接名永远不可与内核默认的设备节点名冲突
若有冲突则可能产生不可预估的行为
OWNER, GROUP, MODE
设备节点的权限
每个特定的值都会覆盖硬编码的默认值
SECLABEL{模块}
将特定的 Linux 安全模块 标签赋予设备节点
ATTR{键名}
应该被写入事件设备的 sysfs 属性值
ENV{键名}
设置设备属性值
由点号 . 作为前缀的属性名,既不会存入数据库,也不会导出到事件或者外部工具中
TAG
给设备附加一个标签
用于为 libudev 的监控功能的用户过滤事件,或枚举被标记的设备
仅当少量的标签赋予一个设备的时候,这种方法才能高效起作用
仅用于特殊设备的过滤要求,并非通用意义上的 flag
过度使用可能会来带低效的事件处理
RUN{类型}
将一个程序加入一个待执行列表中
该列表中的程序会在处理特定程序所有的规则都执行完成之后在执行,具体依据 类型 选项:
"program"
执行一个被该值指定的外部程序
若给出的不是绝对路径,则从 /usr/lib/udev 开始寻找
"builtin"
使用内部程序而非外部程序来执行
程序名和参数由空格分开
单引号用于带空格的参数
该键仅可用于短暂执行的前景任务
运行长期任务会阻塞 该设备 或 依赖他的设备的 全部将要发生的事件
启动守护进程或者其他长期运行的进程都不适用于 udev
即便是 fork 出的进程,无论是否解绑,都会在事件处理结束之后被无条件的关闭
LABEL
一个命名过的标签,而 GOTO 将会跳转至此
GOTO
跳转至下一个匹配上的标签
IMPORT{类型}
导入一组变量,作为设备的属性,具体依据 类型 选项:
"program"
执行一个外部程序,并导入它的输出至要被赋予的值,输出必须是环境变量键格式
路径指定、命令/参数间隔、引号使用 同 RUN
"builtin"
与 "program" 类似,但使用内置程序而非外部程序
"file"
导入一个文本文件至指定的值
内容必须是 环境键格式
"db"
从当前设备的数据库中导入一个单一的值赋予一个键
仅当前序事件已经将数据库导出才起效
"cmdline"
从内核命令行中导入一个单一属性
对于简单的 flag,它的属性值被设为 1
"parent"
通过读取父级设备的已存储的数据库条目来导入键
赋予 IMPORT{parent} 的值表示将要被导入的键的名称
同样适用 shell 的 glob 样式匹配
仅可用于短暂运行的前景任务,详情请参看 RUN
WAIT_FOR
等待一个文件可用,或者超时 10s
路径为相对 sysfs 设备的路径
若没有路径被指定,则等待下一个属性的出现
OPTIONS
规则和设备的选项:
link_priority=value
指定创建软链接的优先级
具有更高优先级的设备复写当前具有该链接的设备的软链接
默认值是 0
string_escape=none|replace
通常情况下,控制符 和 其他不安全的符号 用作设备命名时会被替换
该替换模式可以通过这个选项来切换
static_node=
将该规则规定的权限赋予指定名称的静态设备节点
同时,对于每个在该规则中定义的标签,创建一个软链接至目录
/run/udev/static_node-tags/tag
指向指定名称的静态设备节点
静态设备节点由先于 systemd-udev 启动的 systemd-tmpfiles 创建
静态节点不一定对应一个内核设备
它们用于在获取它们的时候,触发 自动内核模组载入
watch
使用 inotify 监控设备节点
当一个节点在作为写入之用被打开,之后被关闭后
一个 change uevent 会被创建
nowatch
关闭一个设备节点的 inotify 监控
NAME、SYMLINK、PROGRAM、OWNER、GROUP、MODE、RUN 字段支持简单的字符串替换
RUN 替换在所有规则执行完成之后、程序即将执行之前执行,允许使用前面匹配规则中设置的所有设备属性
对于其他的字段,替换在独立的规则运行时被执行
可用的替换包括:
$kernel, %k
设备的内核名称
$number, %n
设备的内核序号
例如 sda3 的内核序号是 3
$devpath, %p
设备的 devpath
$id, %b
在为 SUBSYSTEMS、KERNELS、DRIVERS、ATTRS 向上搜索 devpath 时
找到的设备的名称
$driver
在为 SUBSYSTEMS、KERNELS、DRIVERS、ATTRS 向上搜索 devpath 时
找到的驱动的名称
$attr{文件}, %s{文件}
规则的键全匹配的设备的 sysfs 属性
若匹配上的设备没有改属性,
而前序的 KERNELS、SUBSYSTEMS、DRIVERS、ATTRS 匹配上父级设备具有该属性
则从父级设备取得该属性
若属性是软链接,则软链接目标的最后一个元素作为返回值返回
$env{键名}, %E{键名}
设备的属性值
$major, %M
设备的内核主序号
$minor, %m
设备的内核次序号
$result, %c
PROGRAM 定义的外部程序的返回字符串
返回字符串若含有空格,则可以用 %c{N} 来拾取对应片段编号的片段
若数字编码后跟随加号 +,则拾取该编号对应的片段和其后所有的片段
$parent, %P
父级设备的节点名
$name
设备的当前名称
若没有被某规则修改,则为内核设备名
$links
当前软链接的空格分隔列表
该值仅在 移除事件发生时,或前序规则赋予时被设置值
$root, %r
udev_root 值
$sys, %S
sysfs 的挂载点
$devnode, %N
设备节点的名称
%%
输出一个 % 符号
$$
输出一个 $ 符号
参见
systemd-udevd.service(8)
udevadm(8)
systemd.link(5)