如何让我的内核模块的 sysfs 条目为非 root 用户所有?
How do I make my kernel module's sysfs entry be owned by a non-root user?
我有以下代码:
static struct kobj_attribute my_attribute =__ATTR(my_node, 0444, my_show_fn, my_store_fn);
...
kobject_init(&my_module->kobj, &ktype_my_module);
ret = kobject_add(&my_module->kobj, kernel_kobj, "%s", "my_module");
...
ret = sysfs_create_file(&my_module->kobj, &my_attribute.attr);
这将创建一个 /sys/kernel/my_module/my_node node
,由具有 0444 权限的 root 拥有。
如何从内核代码中让非 root 用户拥有此节点?
sysfs 属性的所有者和组标识符由创建此属性的 kobject 确定。
具体来说,它是 struct kobj_type
的 get_ownership
字段,它可能包含集合所有者和组标识符的回调。该字段具有以下签名:
struct kobj_type {
...
void (*get_ownership)(struct kobject *kobj, kuid_t *uid, kgid_t *gid);
};
调用回调时,*uid
和*gid
都包含0(对应root用户)。回调可以将这些输出参数设置为其他值。
我有以下代码:
static struct kobj_attribute my_attribute =__ATTR(my_node, 0444, my_show_fn, my_store_fn);
...
kobject_init(&my_module->kobj, &ktype_my_module);
ret = kobject_add(&my_module->kobj, kernel_kobj, "%s", "my_module");
...
ret = sysfs_create_file(&my_module->kobj, &my_attribute.attr);
这将创建一个 /sys/kernel/my_module/my_node node
,由具有 0444 权限的 root 拥有。
如何从内核代码中让非 root 用户拥有此节点?
sysfs 属性的所有者和组标识符由创建此属性的 kobject 确定。
具体来说,它是 struct kobj_type
的 get_ownership
字段,它可能包含集合所有者和组标识符的回调。该字段具有以下签名:
struct kobj_type {
...
void (*get_ownership)(struct kobject *kobj, kuid_t *uid, kgid_t *gid);
};
调用回调时,*uid
和*gid
都包含0(对应root用户)。回调可以将这些输出参数设置为其他值。