如何使用“udev”更改 /sys 中的权限以更改 LED/灯的状态?

如何使用“udev”更改 /sys 中的权限以更改 LED/灯的状态?

我有一台 Thinkpad,想使用 ThinkLight(屏幕上方的白色闪光灯,旨在照亮键盘)来接收传入 Jabber 消息的通知。

这很容易实现,只需更改/sys/class/leds/tpacpi::thinklight/brightness为 255。我将使用一个简单的 Bash 脚本来完成,这将使灯闪烁 3 次。

但为了能够做到这一点,我需要更改权限,不仅 root 可以更改此文件。
我不想sudo chmod o+w /sys/class/leds/tpacpi::thinklight/brightness在每次启动后都这样做。

我认为,最好的解决方案是udev为此使用。然而,我以前从未使用过udev,并且对网上找到的教程感到很困惑。

我尝试过这个udev规则:

KERNEL=="tpacpi::thinklight", MODE="0666"

KERNEL="thinklight", MODE="0666"

但这不起作用。虽然我在运行时没有收到错误udevadm test /class/leds

感谢您的帮助和点击。或者也许还有其他解决方案。

答案1

我使用两个 udev 规则(在 下的文件中/etc/udev/rules.d/),如下所示,为组成员提供leds对所有 LED 的访问权限:

SUBSYSTEM=="leds", ACTION=="add", RUN+="/bin/chgrp -R leds /sys%p", RUN+="/bin/chmod -R g=u /sys%p"
SUBSYSTEM=="leds", ACTION=="change", ENV{TRIGGER}!="none", RUN+="/bin/chgrp -R leds /sys%p", RUN+="/bin/chmod -R g=u /sys%p"

ACTION=="change"请注意,需要该规则来处理动态创建的属性。例如,如果 LED 的触发器设置为“计时器”( ),则会创建echo timer > trigger额外的属性delay_on和。指定delay_off操作change以便这些新属性设置其组和权限。

我注意到每次通过写入关闭 LED 时都会生成一个事件change。这似乎是由于每当亮度设置为时都会触发 Linux LED 驱动程序代码清除。这就是为什么第二条规则有条件,以防止每次关闭 LED 时触发规则。0/sys/class/leds/.../brightness0ENV{TRIGGER}!="none"

我的测试表明,在内核 5.4 中,亮度设置为 0 时不再发生更改事件。查看 Linux git 存储库,看起来这个问题似乎已在内核 4.9 中修复。因此,对于 4.9 以上的内核,ENV{TRIGGER}!="none"不需要第二条规则的部分。

答案2

我认为您的“内核”设置错误。来自这个用于编写和调试 udev 规则的很棒的文档:

http://www.reactivated.net/writing_udev_rules.html#basic

我认为你需要 KERNEL=亮度,也许还需要 SUBSYSTEM=LED

然后,以防您的发行版缺乏 inotify 支持。确保 udevd 可以看到您的更改:

# udevcontrol reload_rules

相关内容