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 % p、$devpath % k、$kernel % n、$number % N、$tempnode % M、$major % m、$minor % s{ATTRIBUTE}, $attr {ATTRIBUTE} % E{VARIABLE}, $env {VARIABLE} % c、$result % %
规则文件中的每个非注释行都由一个或多个键值对的列表组成,这些键值对由逗号分隔。有两种类型的键:
匹配键:
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"
参考链接: