Я хотел бы собрать данные об использовании мощности моего процессора на некоторых «простых» Linux-компьютерах (т. е. без всяких наворотов вроде виртуальных машин или, тем более, K8) с помощью scaphandre или prometheus_node_exporter, запущенных как служба systemd, а не как root.
Проблема: /sys/…/energy_uj
предоставленный модулем ядра объект intel_rapl_common
по умолчанию принадлежит пользователю root и имеет режим 0400.
Мой первый подход был таким:
ExecStartPre=-+/usr/bin/modprobe intel_rapl_common
ExecStartPre=+/usr/bin/find /sys/devices/virtual/powercap -name energy_uj -exec chmod g+r -R {} + -exec chown root:powercap {} +
DynamicUser=yes
Group=powercap
Хотя это и работает (systemd, по-видимому, «создает» эфемерную (основную) группу только на основе существования этого служебного файла, который может использоваться командой chmod), мне бы хотелось более чистого подхода.
Итак, я создал необходимые записи в /usr/lib/sysusers.d/
, /usr/lib/modules-load.d/
чтобы иметь группу powercap
и автоматически загружать модуль ядра, а также добавил правило udev:
ENV{SUBSYSTEM}=="powercap", ACTION=="add|change", MODE="0440", OWNER="root", GROUP="powercap"
но это правило, похоже, не имеет никакого эффекта, разрешения и владелец всех связанных папок такие же, как и прежде. Однако, похоже, что правило применяется правильно, потому что когда я делаю:
ENV{SUBSYSTEM}=="powercap", ACTION=="add|change", OWNER="root", PROGRAM+="/usr/bin/find /sys$env{DEVPATH} -name energy_uj -exec chmod g+r -R {} + -exec chown root:powercap {} +"
это правило работает. Но такое ощущение, что я регрессировал к изначальному решению на основе systemd/ExecStartPre.
Итак, извините, я задам два вопроса как один:
- Есть ли способ создать «чистое» правило udev без
PROGRAM
изменения прав доступа и владельца? - Или, в качестве альтернативы, есть ли другой, столь же «чистый» способ получить разрешения на чтение?