我想通过 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
改变权限和所有权? - 或者,是否有另一种类似的“干净”的方法来获取读取权限?