Как установить постоянные разрешения в /sys/?

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

Я начинаю использовать X в качестве пользователя и мне нужно установить яркость клавиатуры в /sys/class/leds/asus\:\:kbd_backlight/brightness. Каталог /sys/ пересоздается после перезагрузки, поэтому разрешения также будут сброшены. Как настроить это так, чтобы мне не нужно было делать файл доступным для записи для всех пользователей после каждой загрузки?

Я использую Archlinux с SDDM в качестве менеджера входа и KDE в качестве рабочего окружения.

Нет, вы не можете, разрешения sysfs определяются в пространстве ядра и не могут быть изменены с помощью пользовательских инструментов (если только с поддержкой со стороны ядра).

Но для вашей проблемы, вы можете настроить запись sudo, которая позволяет всем записывать в этот путь, например, ALL ALL = (ALL) NOPASSWD: /usr/bin/tee /sys/class/leds/asus\:\:kbd_backlight/brightness

И когда вы записываете в этот каталог, используйте скрипт как этот: echo 1 | sudo /usr/bin/tee "/sys/class/leds/asus::kbd_backlight/brightness"

Дополнительный способ добиться изменения разрешений – это с помощью правила udev:

$ cat /etc/udev/rules.d/99-asus.rules

# разрешить управление яркостью клавиатуры для всех
ACTION=="add", SUBSYSTEM=="leds", KERNEL=="asus::kbd_backlight", RUN+="/bin/chmod a+w /sys/class/leds/%k/brightness"

чтобы протестировать правило, попробуйте
udevadm test /sys/class/leds/asus::kbd_backlight
в отчете вы должны увидеть указанную команду выполнения.

и чтобы запустить её используйте
sudo udevadm trigger --verbose --action=add /sys/class/leds/asus::kbd_backlight

основано на этом ответе

У меня была похожая проблема, мне нужно было установить разрешения до запуска службы nodered. Следуя совету goldilocks, я создал этот скрипт systemd:

$ cat /etc/systemd/system/setledspermissions.service

[Unit]
Description=Сделать светодиоды доступными для записи всем
Before=nodered.service

[Service]
Type=oneshot
User=root
ExecStart=/bin/bash -c "/bin/chmod a+w /sys/class/leds/led0/*"

[Install]
WantedBy=multi-user.target

После написания файла службы я активировал его с помощью

$ sudo systemctl enable setledspermissions.service
$ sudo systemctl start setledspermissions.service
$ sudo systemctl status setledspermissions.service

Каталог /sys в Linux является фиктивным, это вид в ядро, представленный в виде файлов. Поэтому, чтобы изменить разрешения в нем постоянно, нужно вмешиваться в ядро, что было бы неразумным. Как говорится в комментариях, возможно, решение состоит в использовании systemd-юнита для выполнения этой настройки (в общем случае, произведите изменение как часть процесса загрузки).

systemd имеет механизм для настройки файлов, создаваемых при каждой загрузке, systemd-tmpfiles, что, вероятно, является самым простым способом настройки файлов в sysfs.

Чтобы постоянно изменять разрешения для чего-то под /sys/, создайте новый конфигурационный файл на уровне администратора (man tmpfiles.d перечисляет, куда идут эти конфигурационные файлы, и описывает их синтаксис – под /etc/tmpfiles.d/ на fedora и ubuntu), содержащий запись конфигурации типа z.

Например, я хочу иметь возможность управлять яркостью панели, записывая в файл /sys/class/backlight/intel_backlight/brightness как обычный пользователь, но он доступен только для чтения для всех, кроме root (права доступа к файлу 0644, пользователь root и группа root).

Я создаю файл /etc/tmpfiles.d/brightness.conf, который содержит:

#    Путь                                         Режим  UID  GID  Возраст Аргумент
z- /sys/class/backlight/intel_backlight/brightness  0664  root root -   -

из man tmpfiles.d:

Тип
Тип состоит из одной буквы и, возможно, из одного или нескольких модификаторов
знаков: знак плюс (“+”), восклицательный знак (“!”), знак минус (“-“),
знак равно (“=”), тильда (“~”) и/или каретка (“^”).

z
Изменить режим доступа, владельца и группу, а также восстановить контекст
безопасности SELinux для файла или каталога, если он существует.

Модификаторы типа

Если используется знак минус (“-“), то неудача этой строки
во время создания (и только создания) не приведет к
возврату ошибки выполнения systemd-tmpfiles.

так что эта строка означает «изменить разрешения /sys/class/backlight/intel_backlight/brightness на 0664, принадлежит root и группе root, игнорируя любые ошибки».

Чтобы протестировать эти изменения:

$ sudo systemd-tmpfiles --dry-run --create brightness-control.conf
Would change "/sys/class/backlight/intel_backlight/brightness" to mode 664

Предполагая, что я добавил своего пользователя в группу rootsudo usermod -aG root USERNAME), теперь я могу понизить яркость панели, запустив echo 5 >/sys/class/backlight/intel_backlight/brightness и т.д.

.

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

Чтобы постоянно устанавливать разрешения в каталоге /sys/ в Linux, необходимо учитывать, что этот каталог является виртуальной файловой системой, управляемой ядром, и напрямую это сделать нельзя. Однако существует несколько методов, позволяющих обходными путями добиться желаемого результата после каждой перезагрузки системы. Вот некоторые из этих методов:

Теория

Каталог /sys/ предоставляет интерфейс к различным аспектам ядра, и его содержимое создается динамически при запуске системы. Таким образом, любые изменения разрешений в этой файловой системе останутся активными только до следующей перезагрузки. Однако, чтобы управлять доступом к определенным файлам в /sys/, например к файлу управления яркостью клавиатуры /sys/class/leds/asus::kbd_backlight/brightness, такие изменения можно автоматизировать через конфигурацию системы.

Пример

  1. Настройка через sudo:
    Можно разрешить определенному пользователю изменять яркость клавиатуры. Для этого настройте файл конфигурации sudo:

    ALL ALL = (ALL) NOPASSWD: /usr/bin/tee /sys/class/leds/asus::kbd_backlight/brightness

    Затем используйте команду:

    echo 1 | sudo /usr/bin/tee "/sys/class/leds/asus::kbd_backlight/brightness"
  2. Использование udev:
    Вы можете создать правило udev, которое будет изменять разрешения на нужный файл при каждом добавлении устройства:

    ACTION=="add", SUBSYSTEM=="leds", KERNEL=="asus::kbd_backlight", RUN+="/bin/chmod a+w /sys/class/leds/%k/brightness"

    Затем можно протестировать правило:

    udevadm test /sys/class/leds/asus::kbd_backlight

    И применить его:

    sudo udevadm trigger --verbose --action=add /sys/class/leds/asus::kbd_backlight
  3. Использование systemd-tmpfiles:
    Создайте файл конфигурации в /etc/tmpfiles.d/, например, brightness.conf, с содержимым:

    z- /sys/class/leds/asus::kbd_backlight/brightness 0664 root root - -

    Это настройка изменит права доступа при каждом запуске системы.

Применение

Эти методы позволят автоматизировать процесс изменения разрешений на файлы и каталоги в /sys/, обеспечивая доступ к функционалу системы, необходимому пользователю. Каждый метод может быть применен в зависимости от требований к безопасности системы и уровня доступа, который требуется предоставить.

С помощью описанных подходов вы можете настроить свои устройства в Archlinux с использованием менеджера входа SDDM и окружения рабочего стола KDE таким образом, чтобы необходимость ручной настройки после каждого перезапуска была исключена.

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

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