Udev 规则:如何仅匹配设备 #26 之后的内核设备(而不是分区)?

Pro*_*kup 4 arch-linux udev

有些系统有超过 26 个(块)设备(如硬盘驱动器),内核将其命名如下:

/dev/sda
...
/dev/sdz
/dev/sdaa
/dev/sdab
/dev/sdac
...
Run Code Online (Sandbox Code Playgroud)

大多数 udev 规则示例都非常简单,仅匹配前 26 个设备,例如:

ACTION=="add|change", KERNEL=="sd[a-z]|sr[0-9]", SUBSYSTEM=="block", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"
Run Code Online (Sandbox Code Playgroud)

但26号设备之后如何匹配呢?无法写入sd*,因为类似的分区sda1不应该匹配。

我可以想象编写另一个“或”(管道符号:)|来进行匹配,例如:

KERNEL=="sd[a-z]|sd[a-z][a-z]|sr[0-9]"
Run Code Online (Sandbox Code Playgroud)

或者将匹配分为正部分和负部分,例如:

..., KERNEL=="sd[a-z]*|sr[0-9]", KERNEL!="sd[a-z]*[0-9]", ...
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来编写可读的 udev 规则,匹配设备 #27 及以上,但不匹配任何分区?

Pro*_*kup 5

KERNEL=="sd*[!0-9]|sr*"

可以在操作系统本身提供的 udev 规则中找到。

在这个 Arch Linux 案例中,看一下文件:

/usr/lib/udev/rules.d/60-persistent-storage.rules
Run Code Online (Sandbox Code Playgroud)

ATA 部分:

$ grep /usr/lib/udev/rules.d/60-persistent-storage.rules -e \"ATA\"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", IMPORT{program}="ata_id --export $devnode"
Run Code Online (Sandbox Code Playgroud)