如何使用 udev 规则更改 Sysfs 文件的权限

如何使用 udev 规则更改 Sysfs 文件的权限

我正在编写一个在启动时启动的自定义模块内核。我可以使用以下命令在 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 文件,而无需添加新规则。

相关内容