Вопрос или проблема
Я начинаю использовать 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
Предполагая, что я добавил своего пользователя в группу root
(с sudo usermod -aG root USERNAME
), теперь я могу понизить яркость панели, запустив echo 5 >/sys/class/backlight/intel_backlight/brightness
и т.д.
.
Ответ или решение
Чтобы постоянно устанавливать разрешения в каталоге /sys/
в Linux, необходимо учитывать, что этот каталог является виртуальной файловой системой, управляемой ядром, и напрямую это сделать нельзя. Однако существует несколько методов, позволяющих обходными путями добиться желаемого результата после каждой перезагрузки системы. Вот некоторые из этих методов:
Теория
Каталог /sys/
предоставляет интерфейс к различным аспектам ядра, и его содержимое создается динамически при запуске системы. Таким образом, любые изменения разрешений в этой файловой системе останутся активными только до следующей перезагрузки. Однако, чтобы управлять доступом к определенным файлам в /sys/
, например к файлу управления яркостью клавиатуры /sys/class/leds/asus::kbd_backlight/brightness
, такие изменения можно автоматизировать через конфигурацию системы.
Пример
-
Настройка через
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"
-
Использование 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
-
Использование systemd-tmpfiles:
Создайте файл конфигурации в/etc/tmpfiles.d/
, например,brightness.conf
, с содержимым:z- /sys/class/leds/asus::kbd_backlight/brightness 0664 root root - -
Это настройка изменит права доступа при каждом запуске системы.
Применение
Эти методы позволят автоматизировать процесс изменения разрешений на файлы и каталоги в /sys/
, обеспечивая доступ к функционалу системы, необходимому пользователю. Каждый метод может быть применен в зависимости от требований к безопасности системы и уровня доступа, который требуется предоставить.
С помощью описанных подходов вы можете настроить свои устройства в Archlinux с использованием менеджера входа SDDM и окружения рабочего стола KDE таким образом, чтобы необходимость ручной настройки после каждого перезапуска была исключена.