Как сделать так, чтобы запись sysfs моего модуля ядра принадлежала пользователю, не являющемуся пользователем root?

#linux #kernel #sysfs #file-ownership

#линукс #ядро #системные файлы #владение файлами

Вопрос:

У меня есть следующий код:

 static struct kobj_attribute my_attribute =__ATTR(my_node, 0444, my_show_fn, my_store_fn); ...  kobject_init(amp;my_module-gt;kobj, amp;ktype_my_module);  ret = kobject_add(amp;my_module-gt;kobj, kernel_kobj, "%s", "my_module");  ...  ret = sysfs_create_file(amp;my_module-gt;kobj, amp;my_attribute.attr);  

Это создает /sys/kernel/my_module/my_node node файл , принадлежащий root с разрешениями 0444.

Как я могу сделать пользователя, не являющегося пользователем root, владельцем этого узла из кода ядра?

Комментарии:

1. Вы пытались изменить владельца узла после sysfs_create_file ?

2. @Philippe Да, это работает, но только для моего случая использования лучше установить его в ядре.

Ответ №1:

Идентификаторы владельца и группы атрибута sysfs определяются объектом kobject, для которого создан этот атрибут.

В частности, это get_ownership поле struct kobj_type , которое может содержать обратный вызов для идентификаторов владельца набора и группы. Поле имеет следующую подпись:

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

Когда вызывается обратный вызов, оба *uid и *gid содержат 0 (что соответствует корневому пользователю). Обратный вызов может установить для этих выходных параметров другие значения.