Правило Udev для класса/атрибута устройства sysfs, касающееся владения

Вопрос или проблема

Это изначально было задано на Stack Overflow, но было закрыто как не по теме. Надеюсь, это правильный форум для вопроса.

Я пишу драйвер символьного устройства, который предоставляет атрибуты класса и устройства в sysfs. Я использую udev, чтобы сделать устройства, которые появляются в /dev, доступными для чтения/записи для определенной группы, но я не могу понять, как сделать атрибуты sysfs доступными для записи той же группой без использования shell-скрипта.

$ ls -l /dev/foobar
crw-rw---- 1 root my_group 241, 0 Jan  4 21:57 /dev/foobar # права собственности применены через udev
$ ls -l /sys/class/my_class/wo_attribute
--w--w---- 1 root root 4096 Jan  4 22:02 wo_attribute # все еще в группе root :/
$ ls -l /sys/class/my_class/my_device/rw_attribute
-rw-rw-r-- 1 root root 4096 Jan  4 22:13 rw_attribute # аналогично

Я пытался использовать udevadm info, чтобы сопоставить ключи KERNEL и SUBSYSTEM sysfs пути, но безрезультатно. Также я нашел поля udev_event и get_ownership в struct class; первое мне не удалось использовать, а второе работает для атрибутов устройства, но мне приходится жестко кодировать gid группы my_group, что не является идеальным.

Вот пример попытки найти правильные ключи соответствия для класса:

$ udevadm info -a /sys/class/my_module
 looking at device '/class/my_class':
    KERNEL=="my_class"
    SUBSYSTEM=="subsystem"
    DRIVER==""
    ATTR{wo_attribute}=="(не читаемый)"

  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}=="(не читаемый)"
    ATTRS{gpio/unexport}=="(не читаемый)"
    ATTRS{my_class/wo_attribute}=="(не читаемый)"

Но правило udev KERNEL=="my_class", GROUP="my_group" не работает.

Работает ли udev только с устройствами под /dev, или есть способ применить правила к атрибутам sysfs?

Ответ или решение

Конфигурирование udev правил для управления правами доступа к атрибутам в sysfs классов и устройств — это задача, которая требует глубокого понимания работы udev и sysfs. Ваш случай сложен тем, что вы желаете настроить права доступа для атрибутов, находящихся в /sys/class/, что отличается от обычной практики управления файлами устройств в /dev.

Основные аспекты и решение проблемы:

  1. Рабочая среда udev: Как правило, udev управляет устройствами, отображаемыми в файловой системе /dev. Правила udev позволяют изменять права доступа и владение этими файлами, что вы успешно осуществили для вашего устройства /dev/foobar. Однако sysfs служит для отображения атрибутов устройства и классов, структура которых управляется ядром, и в большинстве случаев права доступа устанавливаются самим драйвером устройства.

  2. Ограничения udev в sysfs: Udev напрямую не управляет файлами в sysfs, так как эти файлы не являются устройствами в привычном понимании, а представляют собой интерфейс для взаимодействия с параметрами и состояниями компонентов ядра. Поэтому правила udev в классическом виде на них применить нельзя.

  3. Решения для изменения прав доступа в sysfs:

    • Изменение драйвера: Самым верным решением будет модификация кода вашего драйвера для назначения корректных прав доступа к атрибутам при их создании. Это может включать в себя использование функций, таких как sysfs_create_group() с корректным указанием прав доступа.
    • Использование системного скрипта: Вы можете написать скрипт и добавить его в init-систему, такой скрипт будет менять права доступа к атрибутам каждый раз при загрузке системы. Это не оптимальное, но действующее решение, которое позволяет обойти ограничения поддержки udev для sysfs.
  4. Гибридный подход: Если доступ администратора к коду драйвера невозможен, вы можете использовать комбинацию правил udev для создания устройства в /dev/ с нужными правами и скриптов для последующего изменения прав в sysfs по событию изменения устройства.

Заключение

Для большинства задач, включая вашу, модификация самого драйвера — лучший способ обеспечения нужного уровня безопасности и функциональности. Однако в случаях, когда это невозможно, системные скрипты могут временно решить проблему. Понимание структуры и ограничений sysfs и udev поможет вам более эффективно управлять аппаратными ресурсами и добиваться необходимой конфигурации.

Оцените материал
Добавить комментарий

Капча загружается...