Вопрос или проблема
Это изначально было задано на 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
.
Основные аспекты и решение проблемы:
-
Рабочая среда udev: Как правило, udev управляет устройствами, отображаемыми в файловой системе
/dev
. Правила udev позволяют изменять права доступа и владение этими файлами, что вы успешно осуществили для вашего устройства/dev/foobar
. Однако sysfs служит для отображения атрибутов устройства и классов, структура которых управляется ядром, и в большинстве случаев права доступа устанавливаются самим драйвером устройства. -
Ограничения udev в sysfs: Udev напрямую не управляет файлами в sysfs, так как эти файлы не являются устройствами в привычном понимании, а представляют собой интерфейс для взаимодействия с параметрами и состояниями компонентов ядра. Поэтому правила udev в классическом виде на них применить нельзя.
-
Решения для изменения прав доступа в sysfs:
- Изменение драйвера: Самым верным решением будет модификация кода вашего драйвера для назначения корректных прав доступа к атрибутам при их создании. Это может включать в себя использование функций, таких как
sysfs_create_group()
с корректным указанием прав доступа. - Использование системного скрипта: Вы можете написать скрипт и добавить его в init-систему, такой скрипт будет менять права доступа к атрибутам каждый раз при загрузке системы. Это не оптимальное, но действующее решение, которое позволяет обойти ограничения поддержки udev для sysfs.
- Изменение драйвера: Самым верным решением будет модификация кода вашего драйвера для назначения корректных прав доступа к атрибутам при их создании. Это может включать в себя использование функций, таких как
-
Гибридный подход: Если доступ администратора к коду драйвера невозможен, вы можете использовать комбинацию правил udev для создания устройства в
/dev/
с нужными правами и скриптов для последующего изменения прав в sysfs по событию изменения устройства.
Заключение
Для большинства задач, включая вашу, модификация самого драйвера — лучший способ обеспечения нужного уровня безопасности и функциональности. Однако в случаях, когда это невозможно, системные скрипты могут временно решить проблему. Понимание структуры и ограничений sysfs и udev поможет вам более эффективно управлять аппаратными ресурсами и добиваться необходимой конфигурации.