字符串替换

NAME、SYMLINK、PROGRAM、OWNER、GROUP、MODE 和 RUN 键支持许多类似 printf 的字符串替换。
示例中使用的替换是:

  • %M – 设备的内核主编号
  • %m – 设备的内核次要编号

支持其他字符串替换。

Udev 规则示例

下面的示例包含从 /lib/udev/rules.d/50-udev-default.rules 文件中选择的条目。
此规则文件包含 60 多个条目。

# cat /lib/udev/rules.d/50-udev-default.rules 
# do not edit this file, it will be overwritten on update
SUBSYSTEM=="virtio-ports", KERNEL=="vport*", ATTR{name}=="?*", SYMLINK+="virtio-ports/$attr{name}"
# select "system RTC" or just use the first one
SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc"
SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb"
SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id"
ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}"
ACTION!="add", GOTO="default_permissions_end"
SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="sclp_line[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="ttysclp[0-9]*", GROUP="tty", MODE="0620"
....
  1. 以# 号开头的是注释。

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

  • 匹配键
  • 分配键
  1. 如果所有匹配键都与其各自的值匹配,则应用规则并为分配键分配指定值。
    每个键都有不同的操作,具体取决于运算符。
    有效的运算符是:
  • == : 比较是否相等
  • != : 比较不等式
  • = : 给键赋值
  • += :将值添加到键的当前值
  • := : 将最终值分配给键。禁止任何以后的规则进行任何以后的更改。
  1. Udev 规则中也支持 Shell 样式的模式匹配 (*, ?, [])。

Udev 规则文件和目录

Udev 规则确定如何识别设备以及如何分配通过重新启动或者磁盘更改而持久的名称。
当 Udev 收到设备事件时,它会将配置的规则与 sysfs 中的设备属性进行匹配以识别设备。
规则还可以指定其他程序作为设备事件处理的一部分运行。

Udev 规则文件位于以下目录中:

  • /lib/udev/rules.d/ – 默认规则目录
  • /etc/udev/rules.d/ – 自定义规则目录。这些规则优先。

规则文件需要具有唯一的名称。
自定义规则目录中的文件会覆盖默认规则目录中的同名文件。
规则文件按词法顺序排序和处理。
以下是来自默认和自定义规则目录的规则文件的部分列表:

# ls -l /lib/udev/rules.d/
total 348
-r--r--r--. 1 root root  7266 Aug  5  2017 10-dm.rules
-r--r--r--. 1 root root  2454 Aug  5  2017 11-dm-lvm.rules
-rw-r--r--. 1 root root  2865 Jan 25 16:05 11-dm-mpath.rules
-r--r--r--. 1 root root  1499 Aug  5  2017 13-dm-disk.rules
-rw-r--r--. 1 root root   553 Aug  6  2017 39-usbmuxd.rules
-rw-r--r--. 1 root root  1622 Mar  7 13:27 40-redhat.rules
...
# ls -l /etc/udev/rules.d/
total 8
-rw-r--r--. 1 root root 709 Aug  4  2017 70-persistent-ipoib.rules
-rw-r--r--. 1 root root  96 Apr 21 05:09 70-persistent-net.rules
lrwxrwxrwx. 1 root root   9 Sep 29  2014 80-net-name-slot.rules -> /dev/null

创建到设备节点的符号链接

评估规则的顺序很重要。
创建自己的规则时,我们希望在默认值之前评估这些规则。
因为规则是按词法顺序处理的,所以创建一个文件名如 /etc/udev/rules.d/10-local.rules 的规则文件,以便首先处理它。

以下规则创建到 /dev/xvdd 设备节点的 /dev/my_disk 符号链接。
我们可以创建 Udev 规则来更改网络接口的名称,但 Udev 无法更改设备节点的名称。
只能为设备节点创建另外的符号链接。

KERNEL=="xvdd", SUBSYSTEM=="block", SYMLINK="my_disk"

运行 udevadm trigger 来处理规则文件:

# udevadm trigger

符号链接现在存在。

# ls –l /dev/my*
lrwxrwxrwx. ... /dev/my_disk -> xvdd

删除 10-local.rules 文件并运行 udevadm trigger 以删除符号链接。

udevadm 实用程序

udevadm 实用程序是 Udev 的用户空间管理工具。
在其他功能中,我们可以使用 udevadm 查询 sysfs 并获取设备属性,以帮助创建与设备匹配的 Udev 规则。
要显示 udevadm 用法:

# udevadm --help
udevadm [--help] [--version] [--debug] COMMAND [COMMAND OPTIONS]
Send control commands or test the device manager.
Commands:
  info          Query sysfs or the udev database
  trigger       Request events from the kernel
  settle        Wait for pending udev events
  control       Control the udev daemon
  monitor       Listen to kernel and udev events
  test          Test an event run
  test-builtin  Test a built-in command

我们还可以获得每个 udevadm 命令的用法。
例如,要获得使用 info 命令的帮助:

# udevadm info --help
udevadm info [OPTIONS] [DEVPATH|FILE]
Query sysfs or the udev database.
  -h --help                   Print this message
     --version                Print version of the program
  -q --query=TYPE             Query device information:
       name                     Name of device node
       symlink                  Pointing to node
       path                     sysfs device path
       property                 The device properties
       all                      All values
  -p --path=SYSPATH           sysfs device path used for query or attribute walk
  -n --name=NAME              Node or symlink name used for query or attribute walk
  -r --root                   Prepend dev directory to path names
  -a --attribute-walk         Print all key matches walking along the chain
                              of parent devices
  -d --device-id-of-file=FILE Print major:minor of device containing this file
  -x --export                 Export key/value pairs
  -P --export-prefix          Export the key name with a prefix
  -e --export-db              Export the content of the udev database
  -c --cleanup-db             Clean up the udev database

udevadm 实用程序示例

下面是一些例子。
在 Udev 数据库中查询 /dev/xvdd 的设备路径:

# udevadm info --query=path --name=/dev/xvdd 
/devices/vbd-5696/block/xvdd

要查询 Udev 数据库以获取 /dev/xvda 的所有设备信息:

# udevadm info --query=all --name=/dev/xvda
P: /devices/vbd-768/block/xvda
N: xvda
E: DEVNAME=/dev/xvda
E: DEVPATH=/devices/vbd-768/block/xvda
E: DEVTYPE=disk
E: DM_MULTIPATH_TIMESTAMP=1524287355
E: ID_PART_TABLE_TYPE=dos
E: MAJOR=202
E: MINOR=0
E: MPATH_SBIN_PATH=/sbin
E: SUBSYSTEM=block
E: TAGS=:systemd:
E: USEC_INITIALIZED=476119

输入以下内容以打印 /dev/xvda 的所有 sysfs 属性。
这些属性可以在 Udev 规则中用于匹配设备。
它沿链打印所有设备,直到 sysfs 的根。

# udevadm info --attribute-walk --name=/dev/xvda
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
  looking at device '/devices/vbd-768/block/xvda':
    KERNEL=="xvda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{size}=="41943040"
    ATTR{stat}=="   16775        4   686095    36372     2953      313   203104    42044        0    19603    78392"
    ATTR{range}=="16"
    ATTR{discard_alignment}=="0"
    ATTR{ext_range}=="16"
    ATTR{alignment_offset}=="0"
    ATTR{badblocks}==""
    ATTR{inflight}=="       0        0"
    ATTR{removable}=="0"
    ATTR{capability}=="10"
  looking at parent device '/devices/vbd-768':
    KERNELS=="vbd-768"
    SUBSYSTEMS=="xen"
    DRIVERS=="vbd"
    ATTRS{devtype}=="vbd"
    ATTRS{nodename}=="device/vbd/768"
Linux Udev

Udev 是 Linux 内核的设备管理器。
Udev 在启动时为所有类型的设备在 /dev 目录中动态创建或者删除设备节点文件。
通过查看 systemd RPM 包中包含的“udev”文件名,我们可以看到 Udev 现在是 systemd 的一部分。

# rpm -ql systemd | grep udev
/etc/udev
/etc/udev/hwdb.bin
/etc/udev/rules.d
/etc/udev/udev.conf
/usr/bin/udevadm
...

Udev 守护进程 systemd-udevd 会在系统中添加或者删除设备时直接从内核接收设备 uevent。
对于每个事件,systemd-udevd 都会执行 Udev 规则中指定的匹配指令。

当磁盘因故障从系统中移除时,设备文件名可能会更改。
例如,设备在启动时被命名为 /dev/sda、/dev/sdb 和 /dev/sdc。
但是在下一次重新启动时,/dev/sdb 失败,之前的 /dev/sdc 被命名为 /dev/sdb。
对 /dev/sdb 的任何配置引用现在都包含最初由 /dev/sdc 引用的内容。

避免这种情况的解决方案是通过重新启动来保证设备的名称一致。
我们可以将 Udev 配置为创建持久名称并在文件系统挂载表 /etc/fstab 中使用这些名称,或者将这些名称用作 mount 命令的参数。

匹配键

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

  • ACTION :匹配事件动作的名称。
  • DEVPATH :匹配事件设备的 devpath。
  • KERNEL :匹配事件设备的名称。
  • NAME :匹配网络接口的名称。如果在前面的规则之一中设置了 NAME 键,则可以使用它。
  • SYMLINK :匹配以节点为目标的符号链接的名称。如果在上述规则之一中设置了 SYMLINK 密钥,则可以使用它。可以有多个符号链接,但只有一个需要匹配。
  • SUBSYSTEM :匹配事件设备的子系统。
  • TEST{八进制模式掩码}:测试文件是否存在。我们可以指定八进制模式掩码。

其他匹配键包括 DRIVER、ATTR{filename}、KERNELS、SUBSYSTEMS、DRIVERS、ATTRS{filename}、TAGS、ENV{key}、TAG、PROGRAM 和 RESULT。

https://onitroad.com 更多教程

分配键

以下键可以具有分配给它们的值:

  • NAME – 用于网络接口的名称。 Udev 不能更改设备节点的名称,只能创建另外的符号链接。
  • SYMLINK – 以节点为目标的符号链接的名称
  • OWNER, GROUP, MODE – 设备节点的权限
  • OPTIONS - 规则和设备选项。示例中使用的 ignore_remove 选项表示“当设备消失时不要删除设备节点”。

其他分配键包括 ATTR{key}、ENV{key}、TAG、RUN{type}、LABEL、GOTO、IMPORT{type}、WAIT_FOR 和 OPTIONS。

日期:2020-09-17 00:14:55 来源:oir作者:oir