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

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

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

/dev/sda
...
/dev/sdz
/dev/sdaa
/dev/sdab
/dev/sdac
...

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

ACTION=="add|change", KERNEL=="sd[a-z]|sr[0-9]", SUBSYSTEM=="block", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"

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

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

KERNEL=="sd[a-z]|sd[a-z][a-z]|sr[0-9]"

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

..., KERNEL=="sd[a-z]*|sr[0-9]", KERNEL!="sd[a-z]*[0-9]", ...

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

答案1

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

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

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

/usr/lib/udev/rules.d/60-persistent-storage.rules

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"

相关内容