允许 systemd 服务访问 /sys/…/energy_uj-udev 规则更改所有者没有效果?

允许 systemd 服务访问 /sys/…/energy_uj-udev 规则更改所有者没有效果?

我想通过 scaphandre 或 prometheus_node_exporter 在一些“普通”Linux 机器(即没有像 VM 或 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 的解决方案。

因此,抱歉,我想问两个问题:

  • 有没有办法制定“干净”的 udev 规则而不PROGRAM改变权限和所有权?
  • 或者,是否有另一种类似的“干净”的方法来获取读取权限?

相关内容