允許 systemd 服務存取 /sys/…/energy_uj - udev 規則更改擁有者沒有效果?

允許 systemd 服務存取 /sys/…/energy_uj - udev 規則更改擁有者沒有效果?

我想透過 scaphandre 或 prometheus_node_exporter 收集一些「普通」linux 機器(即沒有虛擬機器等花哨的東西,更不用說 K8s)上的 CPU 功率使用情況,以 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 的解決方案。

所以,抱歉,我想問兩個問題:

  • 有沒有辦法在不PROGRAM更改權限和所有權的情況下制定「乾淨」的 udev 規則?
  • 或者,是否有另一種類似的「乾淨」方式來取得讀取權限?

相關內容