如何让我的内核模块的 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_typeget_ownership 字段,它可能包含集合所有者和组标识符的回调。该字段具有以下签名:

struct kobj_type {
    ...
    void (*get_ownership)(struct kobject *kobj, kuid_t *uid, kgid_t *gid);
};

调用回调时,*uid*gid都包含0(对应root用户)。回调可以将这些输出参数设置为其他值。