
現在、Beaglebone Green を起動して Python スクリプトを開始するまでの時間を短縮しようとしています。私のシンプルな Python スクリプトは、Cape のリレーをオンにするだけです。
リレーがオンになるまでの時間を、起動して何か役に立つことを実行するまでの時間として使用しています。
以前はリレーに 18 秒かかっていましたが、systemd をいじって 14 秒まで短縮できました。
Pythonプログラムを起動するシンプルなユニットファイルを作成しました
[Unit]
Description=Relaycheck run on startup
DefaultDependencies=no
After=systemd-system.slice
[Service]
WorkingDirectory=/home/
ExecStart=/home/relaycheck2.py
StandardOutput=null
[Install]
Alias=relaycheck2.service
現在のブート チャートの切り抜き画像を以下に示します。 ブートチャート
私の理解では、サービスはかなり早い段階で実行されており、ネットワークなどの時間のかかるサービスはリレー サービスに影響を与えません。これは正しいですか?
systemd を使用して起動時間を短縮できる他の方法はありますか?
答え1
プログラムで状態を維持する必要がありますか (書き込み可能なディスクが必要ですか)? おそらく最も手っ取り早い方法は、init システムをまったく使用しないことです。代わりに、カーネル引数 (おそらく uBoot 環境/構成内) に以下を追加することを検討してください。
init=/path/to/your/program
つまり、Linuxカーネルは(プロセスマネージャを実行する代わりにsystemd
)プログラムを最初のプロセスとして実行します。これはPythonスクリプトだと言いましたが、私は考えるスクリプトを init として実行できます。Python アプリケーションを起動するコンパイル言語で小さなラッパー プログラムを作成する必要がある場合があります。
シェル/ラッパープログラムもシグナルを処理する必要があることに注意してください(init/systemdはデフォルトのシグナルハンドラを持たないプログラムに対してシグナルを処理します)。次のようなものを使用すれば済むかもしれません。ダムイニシエータこれは通常、Docker コンテナに使用されます。
書き込み可能なボリュームが必要な場合は、ラッパー プログラムでパーティションをマウントすることもできます (ルート パーティションである必要はありません。ストレージ用に USB スティックをマウントすることもできます)。
カーネル パラメータは組み込みシステム/uBoot では少し扱いにくい場合があるので、まずはデスクトップ VM でこれを試してみます。