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_uj
vom Kernelmodul bereitgestellten Elemente intel_rapl_common
gehö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 powercap
und 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
PROGRAM
Berechtigungen und Eigentümer zu ändern? - Oder gibt es alternativ eine andere, ähnlich „saubere“ Möglichkeit, Leseberechtigungen zu erhalten?