我试图了解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"
可执行文件device_added.sh
包含...
`echo "USB device removed at $(date)" >>/tmp/scripts.log`
...并且可执行文件device_added_2.sh
包含...
`echo "USB device removed at $(date)" >>/tmp/scripts_2.log`
我已将对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"
然后,我再次使用udev注册更改,拔出USB驱动器,将其插入,然后检查测试日志文件以获取更新。我希望scripts_2.log
不会被更新。可是!因此,看来:=
并不能阻止以后对密钥的更改。
因此,+=
和/或:=
运算符可以防止以后以某种方式更改键吗?我应该使用另一个操作员来防止以后进行更改吗?
man udev
和http://www.reactivated.net/writing_udev_rules.html
似乎不太可能对此有误,所以我可能对此有误解。
我希望:=
会阻止scripts_2.log
进行更新。
更新-2019-05-12:
我发现this stackexchange post在问一个非常相似的问题,但是在此提供的两个答案没有回答这个问题。一个答案建议使用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"
...使用+=
添加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"
然后,我再次使用udev注册更改,拔出USB驱动器,将其插入,然后检查测试日志文件以获取更新。我希望scripts_2.log
不会被更新,但确实如此。因此,看来OPTIONS +="last_rule"
并不能阻止以后对密钥的更改。
答案 0 :(得分:1)
:=
的文档似乎不完整;它执行描述的内容,但跨规则文件执行。我像这样重复了您的实验:
在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"
在另一个名为73-seat-late.rules
的上游规则文件中,有此规则
TAG=="uaccess", ENV{MAJOR}!="", RUN{builtin}+="uaccess"
现在我用udevadm test /sys/...
测试两个规则集都适用的设备的规则,这将使我们:
run: '/bin/device_added.sh'
run: '/bin/device_added_2.sh'
run: 'uaccess'
Unload module index
Unloaded link configuration context.
然后,我像这样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.
(因为具有较高词法等级的规则文件名具有优先权-手册中的另一个歧义)