Yocto Linux BSPのビルド時におけるTIPS(ビルドの効率化、Dockerを使ってビルド等)を紹介します。
前回の[入門] Yocto Linux BSPのビルド方法 - i.MX 8M Plus編の続きとなりますので、こちらも併せてご参照ください。
3.4. ビルドに対するTIPS
3.4.1. 途中でエラーが発生しても、可能な限りビルドを続ける
Yocto BSPのビルド規模が大きいため、途中でネットワークが切れたり、メモリが足りなくなったりなどの理由で 途中で止まることが珍しくありません。大抵はやり直せば通ったりするのですが、退勤の直前にビルドを仕込んで翌朝のビルドパスを期待していても、 実はビルド開始直後に1つのエラーで落ちていてほとんど進んでいなかったなど、肩をがっくりと落とす場合も多いです。 そんなときのために、エラーが発生しても依存関係のない別のパッケージのビルドは継続させる、というオプションが用意されています。-kを付けてください。
$ bitbake -k imx-image-full
3.4.2. ビルド時に走るスレッド数を制限する
例えば16スレッド、32GBのシステムのマシンなどで新規にビルドを行う場合、スワップが発生する可能性が高いです。 それを避けるには、bitbakeコマンドを実行するときにBB_NUMBER_THREADS変数を設定することで同時スレッド数を絞ることができます。この例では同時に走るスレッドを8スレッドまでに制限します。
$ BB_NUMBER_THREADS=8 bitbake imx-image-full
3.4.3. sstate-cacheの有効利用
デフォルトの設定でビルドを実施すると、/path/to/imx-yocto-bsp/build/sstate-cacheディレクトリが生成されます。 同じプロジェクトで再度なにかしらのビルドをすると、ここに生成されたキャッシュが自動的に使われて再ビルドを行い、 時間の短縮を図るようになっています。 このsstate-cacheは、違うターゲットのビルドを行うときにも使えて、時間とストレージの節約が可能です。 例えばi.MX8MPlus EVK向けのビルドで生成されたsstate-cacheをi.MX8MMiniEVKのビルドで再利用することも可能です。
$ cd /path/to/imx-yocto-bsp/build
# i.MX8MPlus EVK向けで生成されたsstate-cacheを別プロジェクトでも使うため、一つ上の階層に移動させる
$ mv ./sstate-cache ../
# i.MX8MMini EVK向けのプロジェクトを新規で作成する
$ MACHINE=imx8mm-lpddr4-evk DISTRO=fsl-imx-xwayland source ./imx-setup-release.sh -b build_imx8mm
次に、移動させたsstate-cacheを参照するように設定ファイルを変更します。 i.MX8MPlus EVK向け、i.MX8MMini EVK向けの両方を設定します。変更するファイルは以下の2つです。
/path/to/imx-yocto-bsp/build/conf/local.conf
/path/to/imx-yocto-bsp/build_imx8mm/conf/local.conf
これらのファイルに以下の行を追加します。ここのパスが、先ほど1階層上に移動させたところを指定しています。
conf/local.conf
SSTATE_DIR ?= "${BSPDIR}/sstate-cache/"
その後にビルドを実施すると、大幅なビルド時間の短縮と使用ストレージの削減が見込まれます。
注釈 複数のYoctoのバージョン間でのsstate-cacheの共有は推奨しません
3.4.4. Root File systemパーティションサイズの変更
YoctoでSDカードイメージを生成するとき、デフォルトでは書き込み対象のSDカードやeMMCのサイズは考慮せずにビルドが行われます。 仮に16GBのSDカードを用意しても、ユーザが自由に使えるパーティションは(例えばですが)1GBしか設定されておらず、 残り15GB弱は無駄になってしまう、あるいは後からパーティション拡張をしなければならないということになります。 以下の変数をconf/local.confに設定しておくことで、あらかじめもっと大きなパーティションサイズのイメージファイルを生成することが可能です。
conf/local.conf
IMAGE_ROOTFS_EXTRA_SPACE = "13631488"
注釈 単位は1kなので、上の例では13GBを追加で設定します。
注釈 poky/scripts/lib/wic/partition.py でパーティションサイズの計算をしています。
3.5. ターゲットのRootfsにアプリケーションを追加する
wiresharkというアプリをターゲットに追加してみましょう。
conf/local.confに以下の行を追加します。
conf/local.conf
IMAGE_INSTALL:append = " wireshark"
注釈 wireshark(パッケージ名) の前にスペースを入れること
注釈 追加できるパッケージは、sourcesディレクトリにて<package name>_<version>.bbというレシピが提供されている必要あり。このバージョンでは./meta-openembedded/meta-networking/recipes-support/wireshark/wireshark_3.4.12.bbでレシピが提供されています。
複数のアプリを入れる場合は、一行の中にスペースをいれて追加します。
conf/local.conf
IMAGE_INSTALL:append = " wireshark tcpdump"
あるいはIMAGE_INSTALL:appendの行を複数行追加します。
conf/local.conf
IMAGE_INSTALL:append = " wireshark"
IMAGE_INSTALL:append = " tcpdump"
3.6. imx-docker
Dockerを使ってYocto BSPのビルドを行うようにする imx-docker というパッケージも用意されています。 インストールなど事前に必要なステップは imx-dockerのREADME を参照ください。
3.6.1. imx-dockerをclone
$ git clone https://github.com/nxp-imx/imx-docker
3.6.2. imx-dockerの設定
デフォルトでは、env.shが最新バージョンのenv.shへのシンボリックリンクになっているので、imx-6.1.55-2.2.0/env.shへのシンボリックリンクに変更します。
$ cd imx-docker
$ rm env.sh
$ ln -s imx-6.1.55-2.2.0/env.sh env.sh
ビルド設定を変更する場合はimx-6.1.55-2.2.0/env.shを書き換えます。例えば、デフォルトではimx-image-coreをビルドするようになっているのでimx-image-fullに書き換えます。
imx-6.1.55-2.2.0/env.sh
IMAGES="imx-image-full"
imx-6.1.55-2.2.0/yocto-build.sh の末尾にYocto SDKのビルドコマンドを追加します。
imx-6.1.55-2.2.0/yocto-build.sh
bitbake ${IMAGES} -c populate_sdk
注釈 ビルド生成物の出力ディレクトリはDOCKER_WORKDIR変数で決まり、デフォルトでは/opt/yoctoに設定されています。変更したい場合はimx-6.1.55-2.2.0/env.shを書き換えます。
注釈 DOCKER_WORKDIRのパーミッションを正しく設定しておく必要があります。
$ sudo mkdir /opt/yocto
$ sudo chown $USER:$USER /opt/yocto
3.6.3. imx-dockerでYoctoイメージ、Yocto SDKをビルド
$ ./docker-build.sh Dockerfile-Ubuntu-20.04
$ ./docker-run.sh imx-6.1.55-2.2.0/yocto-build.sh
本投稿の「Comment」欄にコメントをいただいても、現在返信に対応しておりません。
お手数をおかけしますが、お問い合わせの際には、NXP代理店、もしくはNXPまでお問い合わせください。
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.