我有一台 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/.../brightness
0
ENV{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