特定の要件を満たしたり、使いやすさを向上させたりするために、システムの起動時間を短縮する方法を知っておくことは多くの場合、有益です。
注: これはRaspberry Piの最短動時間を示すものではなく、最適化調整の入門記事です。
この記事では、ユーザー空間での最適化のみを対象としています。他の(カーネル空間など)の最適化の方が良い結果をもたらす可能性もありますが、アプリケーション開発者の視点から最も利用しやすい方法であると思われます。
Raspberry Pi 4は、初期起動段階の最適化に関しては制限がありますのでご注意ください。
この最適化により、全体の起動時間を約13%短縮することができました。
このシナリオでは、Boot to Qt イメージが使用されますが、この手順は特定のイメージに限定されるものではありません。Boot to Qt イメージとツールチェーンは、Qtメンテナンスツールで入手できます。
まずRaspberry Piにイメージをフラッシュし、電源を入れます。RaspberryがデフォルトのBoot to Qtアプリケーションで起動したら、次の手順に進みます。
Boot to Qtのビルドに関する一般的な手順は、ここで取り上げられています。
Boot to Qt ディストリビューションをビルドする際、WebEngine を使用しない場合は、b2qt.conf ファイルから webengine の DISTRO_FEATURES を削除してください。これにより、時間とリソースを節約できます。
注:さらなる最適化(例えば静的ビルド)を目指す場合は、最終的にはご自身でBoot to Qtをビルドする必要があります。
ユーザー空間で最初に起動されるプロセスは /sbin/init です。デフォルトのイメージを使用している場合、これは systemdの起動スクリプトのシンボリックリンクです。systemd-analyze ツールを起動後に適用すると、デフォルトで多くの不要なサービスが起動していることがわかります。
以下は
systemd-analyze plot > /tmp/systemd-boot.svg
を実行した調査結果の一部です。
不要なサービスを一つずつ削除する代わりに、初期化に systemd を使用しないようにします。この最適化後は、systemd のランレベル、サービス、その他の機能は利用できなくなりますのでご注意ください。代わりに、systemd とは独立した init スクリプトを使用します。
この時点では、アプリケーションの依存関係を把握しておくことをお勧めします。理想的にすぐ利用できるアプリケーションが存在しますが、そうでない場合は、initスクリプトを修正することで、後から依存関係を追加することができます。
新しいスクリプトを作成し、シンボリックリンクのターゲットをそのスクリプトに変更します。スクリプトが実行可能であることを確認してください。
QT_QPA_EGLFS_KMS_CONFIG 経由でアプリケーションが後で使用する新しい /opt/kms.config
ファイルを作成します。次のような内容になります。
{
"device": "/dev/dri/card1",
"hwcursor": false,
"pbuffers": true,
"outputs": [
{
"name": "VGA1",
"mode": "off"
},
{
"name": "HDMI1",
"mode": "1024x600"
}
]
}
アプリケーションを最小限のブートで起動するための /sbin/new_init.sh
スクリプトは、以下のような内容です。
#!/bin/sh
mount -t sysfs none /sys
mount -t proc none /proc
mount -t tmpfs none /tmp
mount -o remount,rw /
#graphics setup
modprobe -a vc_sm_cma gpu_sched videodev v3d i2c_brcmstb
export QT_QPA_EGLFS_KMS_CONFIG=/opt/kms.config
./opt/app
注:アプリケーションによっては、さらにカーネルモジュールをロードする必要があります。