Qtブログ(日本語)

Raspberry Pi 4 Boot to Qt ユーザー空間で起動時間最適化方法

作成者: Qt Group 日本オフィス|Sep 18, 2024 3:29:48 AM
本稿は「How to optimize boot time in user space on a Raspberry Pi 4 / Boot2Qt」の抄訳です。
 

特定の要件を満たしたり、使いやすさを向上させたりするために、システムの起動時間を短縮する方法を知っておくことは多くの場合、有益です。

注: これはRaspberry Piの最短動時間を示すものではなく、最適化調整の入門記事です。

この記事では、ユーザー空間での最適化のみを対象としています。他の(カーネル空間など)の最適化の方が良い結果をもたらす可能性もありますが、アプリケーション開発者の視点から最も利用しやすい方法であると思われます。

Raspberry Pi 4は、初期起動段階の最適化に関しては制限がありますのでご注意ください。

環境

  • Raspberry Pi 4B
  • Boot to Qt (あるいは同様のユーザー空間のイメージ)
  • HDMIディスプレイ
  • ターゲットイメージ用にビルドされたアプリケーション

この最適化により、全体の起動時間を約13%短縮することができました。

イメージとツールチェーンの入手

このシナリオでは、Boot to Qt イメージが使用されますが、この手順は特定のイメージに限定されるものではありません。Boot to Qt イメージとツールチェーンは、Qtメンテナンスツールで入手できます。

まずRaspberry Piにイメージをフラッシュし、電源を入れます。RaspberryがデフォルトのBoot to Qtアプリケーションで起動したら、次の手順に進みます。

任意: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スクリプトを修正することで、後から依存関係を追加することができます。

ステップ 1

新しいスクリプトを作成し、シンボリックリンクのターゲットをそのスクリプトに変更します。スクリプトが実行可能であることを確認してください。

ステップ 2

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"
    }
  ]
}
ステップ 3

アプリケーションを最小限のブートで起動するための /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

 

このスクリプトの処理内容
  • カーネルデータに必要な sysfs をマウント
  • ハードウェアおよびプロセス管理に使用されるprocのマウント
  • 一時的なセッションデータに必要な tmpfs をマウント
  • ルートディレクトリへの書き込みアクセス権を取得するためにルートを再マウント
  • Raspberry Pi 4のグラフィックに必要なカーネルモジュールをロード
  • kms.configファイル用の環境変数を設定
  • アプリケーションを起動

注:アプリケーションによっては、さらにカーネルモジュールをロードする必要があります。