这个问题最初是在Stack Overflow上提出的,但因偏离主题而被关闭。希望这是适合这个问题的论坛。
我正在编写一个字符设备驱动程序,该驱动程序公开 sysfs 下的类和设备属性。我正在使用 udev 使出现在/dev
某个组中的设备可读/可写,但我不知道如何在不使用 shell 脚本的情况下使 sysfs 属性可由同一组写入。
$ ls -l /dev/foobar
crw-rw---- 1 root my_group 241, 0 Jan 4 21:57 /dev/foobar # ownership applied by udev
$ ls -l /sys/class/my_class/wo_attribute
--w--w---- 1 root root 4096 Jan 4 22:02 wo_attribute # still in root group :/
$ ls -l /sys/class/my_class/my_device/rw_attribute
-rw-rw-r-- 1 root root 4096 Jan 4 22:13 rw_attribute # ditto
我尝试使用udevadm info
来匹配 sysfs 路径的 KERNEL 和 SUBSYSTEM 键,但没有效果。我还发现了udev_event
和get_ownership
字段struct class
;前者没有成功,而后者适用于设备属性,但我必须对my_group
的 gid 进行硬编码,这并不理想。
以下是尝试为该类别找到正确匹配键的示例:
$ udevadm info -a /sys/class/my_module
looking at device '/class/my_class':
KERNEL=="my_class"
SUBSYSTEM=="subsystem"
DRIVER==""
ATTR{wo_attribute}=="(not readable)"
looking at parent device '/class':
KERNELS=="class"
SUBSYSTEMS==""
DRIVERS==""
ATTRS{devcoredump/disabled}=="0"
ATTRS{drm/version}=="drm 1.1.0 20060810"
ATTRS{firmware/timeout}=="60"
ATTRS{gpio/export}=="(not readable)"
ATTRS{gpio/unexport}=="(not readable)"
ATTRS{my_class/wo_attribute}=="(not readable)"
但是 udev 规则KERNEL=="my_class", GROUP="my_group"
不起作用。
udev 是否仅适用于下的设备/dev
,或者是否有办法将规则应用于 sysfs 属性?
Stackoverflow 管理员的重大失误。应该作为重复项关闭... ;-) 这是您的答案:
https://stackoverflow.com/questions/70293974/how-do-i-make-my-kernel-modules-sysfs-entry-be-owned-by-a-non-root-user
udev 不能用于在 中设置文件权限
/sys
,只能在 中使用/dev
。SO 管理员可能读到“udev”并立即认为是“管理员的东西”。因此,有用的方法是在驱动程序代码中执行此操作。您可以通过在 udev 中添加和
RUN=
条目来执行此操作。chmod
chgrp