udev

udev

udev 是一个用户空间系统,它使操作系统管理员能够为事件注册用户空间处理程序。udev 守护程序接收的事件主要由 (Linux) 内核生成,以响应与外围设备相关的物理事件。因此,udev的主要目的是对外设检测和热插拔采取行动,包括将控制权返回给内核的操作,udev 可提供所需的基础结构来动态维护 /dev 目录中的设备节点文件和符号链接。udev 规则提供了将外部工具插入内核设备事件处理的方式。

udevadm 命令介绍

主命令

1
2
3
4
5
6
7
info			#查询sysfs或者udev的数据库
trigger #从内核请求events
settle #查看udev事件队列,如果所有的events已处理则退出
control #修改udev后台的内部状态信息
monitor #监控内核的uevents
hwdb #处理硬件数据库索引
test #调试

应用

查看设备信息:
1
2
3
4
5
6
7
8
9
udevadm info --query=all --name=sda #查询sda的所有信息
udevadm info --query=path --name=sda #查看sda的path
udevadm info --attribute-walk --name=/dev/nvme0n1 #查看nvme0n1的所有父设备一直到sysfs的根节点
--query=type #从数据库中查询指定类型的设备。需要--path和--name来指定设备。合法的查询文件是:设备名,链接,路径,属性
--path=devpath #设备的路径
--name=file #设备节点或者链接
--attribute-walk #打印指定设备的所有sysfs记录的属性,以用来udev规则匹配特殊的设备。该选项打印链上的所有设备信息,最大可能到sys目录。
--device-id-of-file=file #打印主/从设备号
--export-db #输出udev数据库中的内容
监控设备事件:

udevadm monitor [options] 监听内核事件和udev发送的events事件。打印事件发出的设备。可以通过比较内核或者udev事件的时间戳来分析事件时序。

1
2
3
4
5
6
7
udevadm monitor --property	#输出事件的属性
udevadm monitor --kernel --property --subsystem-match=usb #过滤监听符合条件的时间
--kernel #输出内核事件
--udev #输出udev规则执行时的udev事件
--property #输出事件的属性
--subsystem-match=string #通过子系统或者设备类型过滤事件。只有匹配了子系统值的udev设备事件通过。
--tag-match=string #通过属性过滤事件,只有匹配了标签的udev事件通过。
模拟一个udev事件
1
udevadm test [options] devpath		#模拟一个udev事件,打印出debug信息
接收内核发送来的设备事件
1
2
3
4
5
6
7
8
9
10
11
12
13
udevadm trigger [options]			#接收内核发送来的设备事件。主要用于重放coldplug事件信息
#(内核在启动时已经检测到了系统的硬件设备,并把硬件设备信息通过sysfs内核虚拟文件系统导出。udev扫描sysfs文件系统,根据硬件设备信息生成热插拔(hotplug)事件,udev再读取这些事件,生成对应的硬件设备文件。由于没有实际的硬件插拔动作,所以这一过程被称为coldplug。)
--verbose #输出将要被触发的设备列表。
--dry-run #不真的触发事件
--type=type #触发一个特殊的设备。合法的类型:devices,subsystem,failed.默认是devices
--action=action #被触发的事件,默认是change
--subsystem-match=subsystem #触发匹配子系统的设备事件。这个选项可以被多次指定,并且支持shell模式匹配。
--attr-match=attribute=value #触发匹配sysfs属性的设备事件。如果属性值和属性一起指定,属性的值可以使用shell模式匹配。如果没有指定值,会重新确认现有属性。这个选项可以被多次指定。
--attr-nomatch=attribute=value #不要触发匹配属性的设备事件。如果可以使用模式匹配。也可以多次指定
--property-match=property=value #匹配属性吻合的设备。可以多次指定支持模式匹配
--tag-match=property #匹配标签吻合的设备。可以多次指定。
--sysname-match=name #匹配sys设备名相同的设备。可以多次指定支持模式匹配。

查看udev事件队列
1
2
3
4
5
6
udevadm settle [options]			#查看udev事件队列,如果所有事件全部处理完就退出。
--timeout=seconds #等待事件队列空的最大时间。默认是180秒。如果是0则立即退出。
--seq-start=seqnum #只等待到给定的顺序号。
--seq-end=seqnum #只等待到给定顺序号之前。
--exit-if-exists=file #如果文件存在就退出
--quiet #不输出任何信息

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
#udev 规则支持使用占位符和替换项。请按照在其他任何脚本中的相同方式使用。在 udev 规则中可使用以下替换项:
%r、$root #设备目录 /dev(默认)
%p、$devpath #DEVPATH 的值
%k、$kernel #KERNEL 的值或内部设备名称
%n、$number #设备号
%N、$tempnode #设备文件的临时名称
%M、$major #设备的主编号
%m、$minor #设备的次编号
%s{ATTRIBUTE}, $attr{ATTRIBUTE} #sysfs 属性的值(通过 ATTRIBUTE 指定)
%E{VARIABLE}, $env{VARIABLE} #环境变量的值(通过 VARIABLE 指定)
%c、$result #PROGRAM 的输出
%% #% 字符

规则文件中的每个非注释行都由一个或多个键值对的列表组成,这些键值对由逗号分隔。有两种类型的键:

  • 匹配键:

    • ACTION:匹配事件操作的名称.如 add 或 remove(添加或删除设备时。
      DEVPATH:匹配事件设备的开发路径.如 DEVPATH=/bus/pci/drivers/ipw3945,用于搜索与 ipw3945 驱动程序有关的所有事件。
      KERNEL:匹配事件设备的名称。
      KERNELS:让 udev 向上搜索设备路径,以查找匹配的设备名称。
      SUBSYSTEM:匹配事件设备的子系统.如 SUBSYSTEM=usb(用于与 USB 设备有关的所有事件)。
      SUBSYSTEMS:让 udev 向上搜索设备路径,以查找匹配的设备子系统名称。
      ENV{KEY}:环境变量的值,如 ENV{ID_BUS}=”ieee1394,用于搜索与该 FireWire 总线 ID 有关的所有事件。
      ATTR{FILENAME}:事件设备的 sysfs 属性。例如,要匹配 vendor 属性文件名中包含的字符串,可以使用 ATTR{vendor}==“On[sS]tream”。
      ATTRS{FILENAME}:让 udev 向上搜索设备路径,以查找与 sysfs 属性值匹配的设备。
      TEST{octal mode mask}:测试文件是否存在。您可以指定八进制模式掩码。
  • 分配键:

    • NAME:用于网络接口的名称。Udev 无法更改设备节点的名称,只能创建其他符号链接.
      SYMLINK:面向节点的符号链接的名称
      OWNER, GROUP, MODE:设备节点的权限
      ATTR{KEY}:指定要写入事件设备的 sysfs 属性的值。如果使用 == 运算符,也将使用该键匹配 sysfs 属性的值。
      ENV{KEY}:告知 udev 将变量导出到环境。如果使用 == 运算符,也将使用该键匹配环境变量。
      RUN:告知 udev 向程序列表添加要为该设备执行的程序。请记住,将此程序限制于很短的任务,以免妨碍此设备的后续事件。
      OPTIONS:规则和设备选项。

如果所有匹配键都匹配其各自的值,则应用规则并为分配键分配指定的值。每个键都有不同的操作,具体取决于运算符。有效运算符包括:

== 比较相等
!= 比较不等式
= 为键赋值
+= 将值添加到键的当前值中
:= 将最终值分配给键。禁止任何后续规则进行任何后续更改。

实例

修改网卡名字

1
KERNEL=="eth0", SUBSYSTEM=="net", SUBSYSTEMS=="platform", DRIVERS=="fec", NAME+="eth10"

创建符号链接

1
SUBSYSTEM=="tty", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", SYMLINK+="myUSB"

禁用usb设备唤醒功能

1
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="XXXX", ATTR{idProduct}=="XXXX", ATTR{power/wakeup}="disabled"

参考链接:


udev
https://tomwithkernel.github.io/usb/udev/
作者
Tom
发布于
2024年11月11日
更新于
2024年11月12日
许可协议