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