systemd サービスが /sys/…/energy_uj にアクセスできるようにします - 所有者を変更する udev ルールは効果がありませんか?

systemd サービスが /sys/…/energy_uj にアクセスできるようにします - 所有者を変更する udev ルールは効果がありませんか?

私は、root ではなく systemd サービスとして実行している scaphandre または prometheus_node_exporter を介して、いくつかの「プレーン」 Linux ボックス (つまり、VM や K8 などの特別な機能がない) の CPU 電力使用量を収集したいと考えています。

問題:/sys/…/energy_ujカーネル モジュールによって公開されるものはintel_rapl_common、デフォルトではルートによって所有され、モードは 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/必要なエントリを作成し、udev ルールも追加しました。/usr/lib/modules-load.d/powercap

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 ベースのソリューションに戻ってしまったように感じます。

申し訳ありませんが、2つの質問を1つとして質問します。

  • PROGRAM権限や所有権を変更せずに「クリーンな」udev ルールを作成する方法はありますか?
  • あるいは、読み取り権限を取得するための同様に「クリーンな」方法は他にもありますか?

関連情報