Erlauben Sie einem systemd-Dienst den Zugriff auf /sys/…/energy_uj – hat die Änderung des Besitzers durch die Udev-Regel keine Auswirkung?

Erlauben Sie einem systemd-Dienst den Zugriff auf /sys/…/energy_uj – hat die Änderung des Besitzers durch die Udev-Regel keine Auswirkung?

Ich möchte meinen CPU-Stromverbrauch auf einigen „einfachen“ Linux-Boxen (also ohne ausgefallene Dinge wie VMs oder gar K8s) über scaphandre oder prometheus_node_exporter erfassen, die als systemd-Dienst und nicht als Root ausgeführt werden.

Das Problem: Die /sys/…/energy_ujvom Kernelmodul bereitgestellten Elemente intel_rapl_commongehören standardmäßig root und haben den Modus 0400.

Mein erster Ansatz war

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

Obwohl dies funktioniert (systemd „erstellt“ anscheinend eine flüchtige (primäre) Gruppe nur auf Grundlage der Existenz dieser Servicedatei, die von chmod verwendet werden kann), hätte ich gerne einen saubereren Ansatz.

Also habe ich die erforderlichen Einträge in erstellt /usr/lib/sysusers.d/, /usr/lib/modules-load.d/um eine Gruppe zu haben powercapund das Kernelmodul automatisch zu laden, und ich habe außerdem eine Udev-Regel hinzugefügt:

ENV{SUBSYSTEM}=="powercap", ACTION=="add|change", MODE="0440", OWNER="root", GROUP="powercap"

aber diese Regel scheint keine Wirkung zu haben, die Berechtigungen und Besitzer aller zugehörigen Ordner sind wie zuvor. Es scheint jedoch, dass die Regel ordnungsgemäß angewendet wird, denn wenn ich dies tue:

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 {} +"

diese Regel funktioniert. Aber es fühlt sich an, als wäre ich zur ursprünglichen systemd/ExecStartPre-basierten Lösung zurückgekehrt.

Entschuldigen Sie, ich stelle zwei Fragen in einer:

  • Gibt es eine Möglichkeit, die Udev-Regel „sauber“ zu erstellen, ohne PROGRAMBerechtigungen und Eigentümer zu ändern?
  • Oder gibt es alternativ eine andere, ähnlich „saubere“ Möglichkeit, Leseberechtigungen zu erhalten?

verwandte Informationen