udev - += 和 := 之间的区别

Ary*_*rya 5 linux udev

我试图了解udev运算符,以便为我的设备创建规则,但关于运算符的几个在线资源之间似乎存在差异,从而阻止了以后对密钥的更改。哪个udev操作员(如果有的话)将阻止以后对密钥进行更改?

以下两个关于 udev 运算符的来源之间似乎存在差异,这会阻止以后对密钥进行更改。

http://www.reactivated.net/writing_udev_rules.html指出+: ensures that no later rule can have any effect,但man udev指出:=将会Assign a value to a key finally; disallow any later changes.man udev还表示"+="将会Add the value to a key that holds a list of entries.。那么,哪个udev操作员(如果有的话)将阻止以后对密钥进行更改?

我通过为我的 USB 闪存驱动器创建 /etc/udev/rules.d/80-test.rules 来测试这个问题。该规则具有以下键值行...

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added.sh" 
SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added_2.sh"
Run Code Online (Sandbox Code Playgroud)

可执行文件device_added.sh包含...

`echo "USB device removed  at $(date)" >>/tmp/scripts.log`
Run Code Online (Sandbox Code Playgroud)

...并且可执行文件device_added_2.sh包含...

`echo "USB device removed  at $(date)" >>/tmp/scripts_2.log`
Run Code Online (Sandbox Code Playgroud)

我将更改注册到 udev:,$ sudo udevadm control --reload 然后插入 USB 闪存驱动器。然后我检查 和 是否/tmp/scripts.log/tmp/scripts_2.log创建并具有适当的字符串,他们确实这样做了。所以,这似乎+=并不能阻止以后对密钥的更改。

然后我测试了是否可以通过在规则的第一个密钥对中:=进行替换来防止以后对密钥进行更改...:=+=

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN:="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added_2.sh"
Run Code Online (Sandbox Code Playgroud)

然后我再次使用 udev 注册更改,拔下 USB 驱动器,然后插入,然后检查测试日志文件是否有更新。我预计scripts_2.log不会更新。然而,确实如此!所以,似乎:=也不能阻止以后对密钥的更改。

那么,+=and/or:=运算符能否以某种方式阻止以后对键进行更改?我应该使用另一个运算符来防止以后发生更改吗?

似乎 和man udev都不太可能http://www.reactivated.net/writing_udev_rules.html是错误的,所以我可能对此有误解。

我希望:=阻止scripts_2.log更新。

更新 - 2019-05-12: 我发现这篇 stackexchange 帖子提出了一个非常相似的问题,但那里提供的两个答案没有回答这篇文章中的问题。一个答案建议使用GOTO,这是我理解的一种解决方法,另一个答案建议使用:=,这与前面提到的来源一样,似乎是错误的。

更新 - 2019-05-19: 我刚刚意识到以下声明,在http://www.reactivated.net/writing_udev_rules.html ...

Additional options
Another assignment which can prove useful is the OPTIONS list. A few options are available:

all_partitions - create all possible partitions for a block device, rather than only those that were initially detected
ignore_device - ignore the event completely
last_rule - ensure that no later rules have any effect

For example, the rule below sets the group ownership on my hard disk node, and ensures that no later rule can have any effect:

KERNEL=="sda", GROUP="disk", OPTIONS+="last_rule"
Run Code Online (Sandbox Code Playgroud)

...用于+=添加last_rule分配,这似乎应该与 具有相同的效果:=。所以,我再次编辑了我的规则......

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN:="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", OPTIONS+="last_rule"
SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added_2.sh"
Run Code Online (Sandbox Code Playgroud)

然后我再次使用 udev 注册更改,拔下 USB 驱动器,然后插入,然后检查测试日志文件是否有更新。我原以为scripts_2.log不会更新,但它确实更新了。所以,似乎OPTIONS +="last_rule"也不能阻止以后对密钥的更改。

Mic*_*kis 2

看来文档:=不完整;它执行所描述的操作,但是跨规则文件。我像这样重复了你的实验:

50-udevoptest.rules

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device",  RUN:="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added_2.sh"
Run Code Online (Sandbox Code Playgroud)

在来自上游的另一个名为 的规则文件中73-seat-late.rules,有这样的规则

TAG=="uaccess", ENV{MAJOR}!="", RUN{builtin}+="uaccess"
Run Code Online (Sandbox Code Playgroud)

udevadm test /sys/...现在我用两个规则集都适用的设备测试规则,这让我们:

run: '/bin/device_added.sh'
run: '/bin/device_added_2.sh'
run: 'uaccess'
Unload module index
Unloaded link configuration context.
Run Code Online (Sandbox Code Playgroud)

然后我像这样重命名实验mv 50-udevoptest.rules 99-udevoptest.rules,然后重复udevadm test /sys/...,这得到了我们:

run: '/bin/device_added.sh'
run: '/bin/device_added_2.sh'
Unload module index
Unloaded link configuration context.
Run Code Online (Sandbox Code Playgroud)

(因为具有较高词汇等级的规则文件名具有优先权 - 手册中的另一个含糊之处)