udev源码开源下载地址分享

udev源码在学习中可能会被用到。这里分享一下我找到的udev的下载地址。

https://git.kernel.org/pub/scm/linux/hotplug/udev.git/

旧式的发布地址是http地址下的../pub/linux/utils/kernel/hotplug

该地址中的udev版本不是连续的,所以没有贸然下载,但其中的udev选项中包含了udev的开发者手册。

贴在下方(google翻译的结果)


udev — 动态设备管理

说明

udev 为系统软件提供设备事件,管理设备节点的权限,并可能在/dev/ 目录中创建额外的符号链接,或重命名网络接口。内核通常只是根据发现的顺序分配不可预测的设备名称。有意义的符号链接或网络设备名称提供了一种根据设备的属性或当前配置可靠地识别设备的方法。

udev 守护进程systemd-udevd.service (8)会直接从内核接收设备uevents,无论何时在系统中添加或删除设备,或者更改其状态。当 udev 收到设备事件时,它会将其配置的规则集与各种设备属性进行匹配以识别设备。匹配的规则可能会提供要存储在 udev 数据库中或用于创建有意义的符号链接名称的附加设备信息。

udev 处理的所有设备信息都存储在 udev 数据库中并发送给可能的事件订阅者。库 libudev 提供对所有存储数据和事件源的访问。

规则文件

udev的规则是从位于系统的规则目录中的文件读取 /usr/lib/udev/rules.d和/usr/local/lib/udev/rules.d,挥发性运行时目录/run/udev/rules.d和本地管理目录/etc/udev/rules.d。所有规则文件都按照词法顺序进行集体排序和处理,而不管它们所在的目录如何。但是,具有相同文件名的文件会相互替换。中的文件/etc/具有最高优先级, 中的文件/run/优先于/usr/.下的同名文件 。如果需要,这可用于用本地文件覆盖系统提供的规则文件;/etc/与中的规则文件同名 的符号链接/usr/lib/,指向/dev/null, 完全禁用规则文件。规则文件必须有扩展名.rules;其他扩展被忽略。

规则文件中的每一行至少包含一个键值对。除了空行或以“ #”开头的行,它们被忽略。有两种键:匹配和分配。如果所有匹配键与其值匹配,则应用规则并且分配键获得分配的指定值。

匹配规则可以重命名网络接口,添加指向设备节点的符号链接,或作为事件处理的一部分运行指定的程序。

规则由一个或多个键-运算符-值表达式的逗号分隔列表组成。每个表达式都有不同的效果,具体取决于使用的键和运算符。

运算符

" ==" 

比较是否相等。(指定的键具有指定的值。)

" !=" 

比较不平等。(指定的键没有指定的值,或者指定的键根本不存在。)

" =" 

为键分配一个值。表示列表的键被重置,并且只分配这个单个值。

" +=" 

将该值添加到包含条目列表的键。

" -=" 

从包含条目列表的键中删除值。

" :=" 

最后给一个键赋值;不允许以后进行任何更改。

值写为双引号字符串,例如 ("string")。要在值中包含引号 ("),请在其前面加上反斜杠 (\")。任何其他出现的反斜杠后跟一个字符都不会被转义。即,"\t\n" 被视为四个字符:反斜杠、小写 t、反斜杠、小写 n。

字符串可以以小写 e (e"string\n") 为前缀,以将字符串标记为 C 风格的 escaped。例如,e"string\n" 被解析为 7 个字符:6 个小写字母和一个换行符。当内核驱动程序需要它们时,这对于编写特殊字符很有用。

请注意,这NUL在任一字符串变体中都是不允许的。

以下键名可用于匹配设备属性。一些键还与 sysfs 中父设备的属性匹配,而不仅仅是生成事件的设备。如果在单个规则中指定了与父设备匹配的多个密钥,则所有这些密钥必须在同一父设备上匹配。

ACTION

匹配事件操作的名称。

DEVPATH

匹配事件设备的 devpath。

KERNEL

匹配事件设备的名称。

KERNELS

向上搜索 devpath 以查找匹配的设备名称。

NAME

匹配网络接口的名称。一旦在上述规则之一中设置了 NAME 键,就可以使用它。

SYMLINK

匹配以节点为目标的符号链接的名称。一旦在上述规则之一中设置了 SYMLINK 密钥,就可以使用它。可能有多个符号链接;只有一个需要匹配。

SUBSYSTEM

匹配事件设备的子系统。

SUBSYSTEMS

向上搜索 devpath 以查找匹配的设备子系统名称。

DRIVER

匹配事件设备的驱动程序名称。仅为在生成事件时绑定到驱动程序的设备设置此键。

DRIVERS

向上搜索 devpath 以查找匹配的设备驱动程序名称。

ATTR{filename}

匹配事件设备的 sysfs 属性值。

除非指定的匹配值本身包含尾随空格,否则将忽略属性值中的尾随空格。

ATTRS{filename}

向上搜索 devpath 以查找具有匹配 sysfs 属性值的设备。如果ATTRS指定了多个匹配项,则所有匹配项都必须在同一设备上匹配。

除非指定的匹配值本身包含尾随空格,否则将忽略属性值中的尾随空格。

SYSCTL{kernel parameter}

匹配内核参数值。

ENV{key}

匹配设备属性值。

CONST{key}

匹配系统范围的常量。支持的键有:

" arch" 

系统的架构。看到ConditionArchitecture=在 systemd.unit(5) 为可能的值。

" virt" 

系统的虚拟化环境。有关 可能的值,请参阅 systemd-detect-virt (1)

未知的键永远不会匹配。

TAG

与设备标签匹配。

TAGS

向上搜索 devpath 以查找具有匹配标签的设备。

TEST{octal mode mask}

测试文件是否存在。如果需要,可以指定八进制模式掩码。

PROGRAM

执行程序判断是否匹配;如果程序成功返回,key 为 true。设备属性可用于环境中的执行程序。程序的标准输出在RESULT 密钥中可用。

这只能用于运行时间非常短的前台任务。有关详细信息,请参阅 RUN。

请注意,PROGRAM一个规则中可以指定多个键,“ =”、“ :=”和“ +=”与“ ”具有相同的效果==。

RESULT

匹配上次PROGRAM调用的返回字符串。此键可以在PROGRAM调用后的相同或任何后续规则中使用 。

大多数字段支持 shell glob 模式匹配和替代模式。支持以下特殊字符:

" *" 

匹配零个或多个字符。

" ?" 

匹配任何单个字符。

" []" 

匹配括号内指定的任何单个字符。例如,模式字符串 " tty[SR]" 将匹配 " ttyS" 或 " ttyR"。通过“ -”字符也支持范围。例如,要匹配所有数字的范围,[0-9]可以使用模式“ ”。如果“ [”后面的第一个字符是“ !”,则匹配任何未包含的字符。

" |" 

分离替代模式。例如,模式字符串 " abc|x*" 将匹配 " abc" 或 " x*"。

以下键可以获得分配的值:

NAME

用于网络接口的名称。有关 设置接口名称的更高级别机制,请参阅 systemd.link (5)。udev 不能更改设备节点的名称,只能创建额外的符号链接。

SYMLINK

以节点为目标的符号链接的名称。每个匹配规则都会将此值添加到要创建的符号链接列表中。

命名符号链接的字符集是有限的。允许的字符是“ 0-9A-Za-z#+-.:=@_/”、有效的 UTF-8 字符序列和“ \x00”十六进制编码。所有其他字符都替换为“ _”字符。

可以通过用空格字符分隔名称来指定多个符号链接。如果多个设备声明相同的名称,则链接始终指向具有最高 link_priority 的设备。如果当前设备消失,则重新评估链接,并且具有下一个最高 link_priority 的设备成为链接的所有者。如果未指定 link_priority,则设备的顺序(以及其中一个拥有链接)未定义。

符号链接名称绝不能与内核的默认设备节点名称冲突,因为这会导致不可预测的行为。

OWNER, GROUP, MODE

设备节点的权限。每个指定的值都会覆盖编译的默认值。

SECLABEL{module}

将指定的 Linux 安全模块标签应用于设备节点。

ATTR{key}

应写入事件设备的 sysfs 属性的值。

SYSCTL{kernel parameter}

应该写入内核参数的值。

ENV{key}

设置设备属性值。以“ .”开头的属性名称既不会存储在数据库中,也不会导出到事件或外部工具(例如,由PROGRAM 匹配键运行)。

TAG

将标签附加到设备。这用于为 libudev 的监视器功能的用户过滤事件,或枚举一组标记的设备。只有在设备上只附加几个标签时,该实现才能有效地工作。它仅用于具有特定设备过滤器要求的上下文,而不是用作通用标志。过度使用可能会导致事件处理效率低下。

RUN{type}

指定在处理完事件的所有规则后要执行的程序。使用“ +=”,这个调用被添加到列表中,使用“ =”或“ :=”,它替换列表中的任何先前内容。请注意,下面描述的“ program”和“ builtin”类型共享一个公共列表,因此使用“ :=”和“ =”清除列表会影响这两种类型。

type 或许:

" program" 

执行指定为赋值的外部程序。如果没有给出绝对路径,则程序应该存在于/usr/lib/udev; 否则,必须指定绝对路径。

如果没有type 指定,这是默认值。

" builtin" 

As program,但使用内置程序之一而不是外部程序。

程序名称和后面的参数用空格分隔。单引号可用于指定带空格的参数。

这只能用于运行时间非常短的前台任务。长时间运行事件进程可能会阻止此设备或从属设备的所有进一步事件。

请注意,在 udev 规则中不允许运行访问网络或挂载/卸载文件系统的程序,因为 systemd-udevd.service.

不允许启动守护进程或其他长时间运行的进程;在事件处理完成后,分叉的进程,无论是否分离,都将被无条件地杀死。为了从 udev 规则激活长时间运行的进程,提供一个服务单元并使用SYSTEMD_WANTS设备属性从 udev 设备中拉入它。有关 详细信息,请参阅 systemd.device (5)

LABEL

aGOTO可以跳转到的命名标签。

GOTO

跳转到LABEL具有匹配名称的下一个。

IMPORT{type}

导入一组变量作为设备属性,取决于 type

" program" 

执行指定为指定值的外部程序,如果成功返回,则导入其输出,该输出必须为环境密钥格式。路径规范、命令/参数分离和引用工作类似于RUN.

" builtin" 

类似于“ program”,但使用内置程序之一而不是外部程序。

" file" 

导入指定为指定值的文本文件,其内容必须为环境密钥格式。

" db" 

从当前设备数据库导入指定为指定值的单个属性。这仅在数据库已由较早的事件填充时才有效。

" cmdline" 

从内核命令行导入单个属性。对于简单标志,属性值设置为“ 1”。

" parent" 

通过读取父设备的数据库条目,从父设备导入存储的密钥。分配给的值 IMPORT{parent}用作要导入的键名的过滤器(具有用于比较的相同 shell glob 模式匹配)。

这只能用于运行时间非常短的前台任务。有关详细信息,请参阅 RUN。

请注意,IMPORT{}一个规则中可以指定多个键,“ =”、“ :=”和“ +=”与“ ”具有相同的效果==。如果导入成功,则密钥为真,除非使用“ !=”作为运算符,如果导入失败,则导致密钥为真。

OPTIONS

规则和设备选项:

link_priority=value

指定创建的符号链接的优先级。具有更高优先级的设备会覆盖其他设备的现有符号链接。默认值为 0。

string_escape=none|replace

通常,用于设备命名的字符串中会替换控制字符和其他可能不安全的字符。可以使用此选项指定替换模式。

static_node=

将此规则中指定的权限应用于具有指定名称的静态设备节点。此外,对于此规则中指定的每个标签,在 指向具有指定名称的静态设备节点的目录中创建符号链接 。静态设备节点创建在 systemd-udevd 启动之前由 systemd-tmpfiles 执行。静态节点可能没有相应的内核设备;它们用于在访问时触发自动内核模块加载。/run/udev/static_node-tags/tag

watch

用inotify观察设备节点;当节点打开写入后关闭时,会合成一个change uevent。

nowatch

使用 inotify 禁用设备节点的监视。

db_persist

在事件设备的 udev 数据库条目上设置标志(粘滞位)。即使在调用udevadm info --cleanup-db时,设备属性也会保留在数据库中 。在某些情况下(例如设备映射器设备),此选项对于在从 initramfs 转换时保持设备状态很有用。

log_level=level

采用日志级别名称,如“ debug”或“ info”,或特殊值“ reset”。指定日志级别名称后,最大日志级别将更改为该级别。如果reset设置了“ ”,则先前指定的日志级别将被撤销。默认为systemd-udevd主进程的日志级别 。

这在调试某些设备的事件时可能很有用。请注意,在处理包含此规则的行时会应用日志级别。因此,为了调试,建议在较早的位置指定此项,例如00-debug.rules.

调试网络接口 uevent 处理的示例。

# /etc/udev/rules.d/00-debug-net.rules

SUBSYSTEM=="net", OPTIONS="log_level=debug"

的NAME,SYMLINK, PROGRAM,OWNER, GROUP,MODE,SECLABEL,和RUN域支持简单的字符串替换。在RUN后所有规则都已经被处理,在执行程序之前权利,允许使用由以前的匹配规则设定设备属性的执行置换。对于所有其他字段,在处理单个规则时执行替换。可用的替换是:

$kernel, %k

此设备的内核名称。

$number, %n

此设备的内核编号。例如,“ sda3”的内核编号为 3。

$devpath, %p

设备的开发路径。

$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}”。如果数字后跟“ +”字符,则此部分加上结果字符串的所有剩余部分将被替换:“ %c{N+}”。

$parent, %P

父设备的节点名称。

$name

设备的当前名称。如果没有被规则改变,它就是内核设备的名称。

$links

当前符号链接的空格分隔列表。该值仅在删除事件期间或在较早的规则分配了值时设置。

$root, %r

udev_root 值。

$sys, %S

sysfs 挂载点。

$devnode, %N

设备节点的名称。

%%

" %" 字符本身。

$$

" $" 字符本身。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值