![如何使用 udev 规则更改 Sysfs 文件的权限](https://linux22.com/image/954485/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20udev%20%E8%A7%84%E5%88%99%E6%9B%B4%E6%94%B9%20Sysfs%20%E6%96%87%E4%BB%B6%E7%9A%84%E6%9D%83%E9%99%90.png)
我正在编写一个在启动时启动的自定义模块内核。我可以使用以下命令在 sysFS 文件中写入:
echo -e "(0,0,255,750)\n" | sudo tee /sys/fs/led_sysfs/led_value
但是我将有另一个软件需要写入该sysFs
文件。该软件只能在用户模式下启动,而不能使用 sudo。
默认情况下,SysFs 的权限是-rwxrwx---
,并且在创建 SysFs 文件的规则中它不能是 777。我发现最好的解决方案是创建一个只有我的用户和 SysFs 的新组。
所以我发现我可以编写一个 udev 规则来更改参数。该命令udevadm info -a -p /sys/fs/led_sysfs
给我以下信息:
KERNEL=="led_sysfs"
SUBSYSTEM==""
DRIVER==""
ATTR{led_value}=="(not readable)"
looking at parent device '/fs':
KERNELS=="fs"
SUBSYSTEMS==""
DRIVERS==""
因此我尝试了多种不同的规则,但都不起作用...以下是我尝试过的:
KERNEL=="led_sysfs", ACTION=="add", RUN+="/bin/chmod 777 /sys/fs/led_sysfs/led_value ;/bin/chown root:led /sys/fs/led_sysfs/led_value ;"
KERNEL=="led_sysfs", ACTION=="change", RUN+="/bin/chmod 777 /sys/fs/led_sysfs/led_value ;/bin/chown root:led /sys/fs/led_sysfs/led_value ;"
KERNEL=="led_sysfs", RUN+="/bin/chmod 777 /sys/fs/led_sysfs/led_value ;/bin/chown root:led /sys/fs/led_sysfs/led_value ;" KERNEL=="led_sysfs", RUN+="/bin/chmod 777 /sys/fs/led_sysfs/led_value"
KERNEL=="led_sysfs", RUN+="/bin/chown root:led /sys/fs/led_sysfs/led_value" KERNEL=="led_sysfs", RUN+="/bin/chmod 777 /sys/fs/led_sysfs/led_value;"
KERNEL=="led_sysfs", RUN+="/bin/chown root:led /sys/fs/led_sysfs/led_value; KERNEL=="led_sysfs", RUN+="/usr/bin/find /sys/fs/led_sysfs/ -type f -name led_value -exec chown root:led {} ; -exec chmod 666 {} ;"
问题是否出在我创建模块或规则的方式上?提前致谢。
答案1
找到解决方案!我改变了创建模块内核的方式。我使用:
sysfs_file_change_owner(kobj_ref, led_attr.attr.name, new_uid, new_gid);
因此该文件将与我的用户(仅为此用途而创建)位于同一组中。这样,我就可以写入 sysfs 文件,而无需添加新规则。