私は、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 ルールを作成する方法はありますか?- あるいは、読み取り権限を取得するための同様に「クリーンな」方法は他にもありますか?