Eu gostaria de coletar o uso de energia da minha CPU em algumas caixas Linux "simples" (ou seja, sem coisas sofisticadas como VMs ou muito menos K8s) via scaphandre ou prometheus_node_exporter, executando como serviço systemd e não como root.
O problema: os /sys/…/energy_uj
módulos expostos pelo kernel intel_rapl_common
são, por padrão, propriedade do root e do modo 0400.
Minha primeira abordagem foi
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
Embora isso funcione (o systemd aparentemente "cria" um grupo efêmero (primário) apenas com base na existência desse arquivo de serviço, que pode ser usado pelo chmod), eu gostaria de uma abordagem mais limpa.
Então, criei as entradas necessárias /usr/lib/sysusers.d/
para /usr/lib/modules-load.d/
ter um grupo powercap
e carregar o módulo do kernel automaticamente, e também adicionei uma regra do udev:
ENV{SUBSYSTEM}=="powercap", ACTION=="add|change", MODE="0440", OWNER="root", GROUP="powercap"
mas esta regra parece não ter efeito, as permissões e o proprietário de todas as pastas relacionadas são como antes. Porém, parece que a regra é aplicada corretamente, pois quando o faço:
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 {} +"
essa regra funciona. Mas parece que regredi à solução original baseada em systemd/ExecStartPre.
Então, desculpe, estou fazendo duas perguntas ao mesmo tempo:
- Existe uma maneira de criar a regra "limpa" do udev sem
PROGRAM
alterar permissões e propriedade? - Ou, alternativamente, existe outra maneira "limpa" de obter permissões de leitura?