カーネルモジュールがロードされた後にサービスを実行する方法

カーネルモジュールがロードされた後にサービスを実行する方法

ここ数時間、このことで頭を悩ませています。私のマシンの 1 つではintel-rapl-msrドライバーにバグがあり、それを再ロードすると問題が解決します。起動時にこれを実行するサービスを簡単に作成できると思いました。しかし、ドライバーがロードされた後にサービスをロードすることができません。

[Unit]
Description=Reload intel-rapl-msr
Requires=systemd-modules-load.target
WantedBy=multi-user.target

ExecStart=/nix/store/wqjkhyyffqdbx767vlqklzi12ln8j3pv-unit-script-cpu-script-start/bin/cpu-script-start

のスクリプトにはExecStart次の内容だけが含まれます:

rmmod intel_rapl_msr
modprobe intel_rapl_msr

この方法では、起動時に次のメッセージが表示されてサービスが失敗します:

mmod: ERROR: Module intel_rapl_msr is not currently loaded

では、このカーネル モジュールがロードされた後にサービスを強制的に実行することは可能ですか?

どのような助けでも大歓迎です!

答え1

systemd-modules-load.serviceを使用してこれらのモジュールのロードを開始していたサービスのモジュール依存関係を解決しました

実際には、モジュールを /etc/modules-load.d/modules.conf に追加します。

https://www.freedesktop.org/software/systemd/man/modules-load.d.html#

答え2

だから今はポーリングするだけでlsmod動作しますが、ちょっと汚いです:

while ! lsmod | grep -q intel_rapl_msr;
do
  echo "intel_rapl_msr not loaded yet... sleeping for 5 seconds"
  sleep 5
done
echo "found intel_rapl_msr"
rmmod intel_rapl_msr
modprobe intel_rapl_msr

関連情報