#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 (что соответствует корневому пользователю). Обратный вызов может установить для этих выходных параметров другие значения.