yocto cheat sheet
はじめの一歩
# リリース一覧: https://wiki.yoctoproject.org/wiki/Releases
git clone git://git.yoctoproject.org/poky.git -b scarthgap
source poky/oe-init-build-env <working directory name>
bitbake core-image-minimal # ビルドする
ビルド
raspi 用のイメージを作る
TODO
成果物を SD カードに焼く
cd tmp/deploy/images/$MACHINE/
sudo dd if=core-image-minimal-genericx86-64.rootfs.wic of=/dev/<media>
カスタマイズ
ファイルをイメージに追加する
# レイヤを作成
bitbake-layers create-layer myproject
bitbake-layers add-layer myproject
# myapp を作成
cd myproject
rm -r recipes-example/
mkdir -p recipes-myproj/myapp/files
vim recipes-myproj/myapp/myapp_1.0.bb # 中身は下段
echo 0.0.1 > recipes-myproj/myapp/files/myapp_version
echo 'IMAGE_INSTALL:append = " myapp"' >> ../build/conf/local.conf
SUMMARY = "My Application"
DESCRIPTION = "My Application"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://myapp_version"
S = "${WORKDIR}"
FILES:${PN} += "/version"
do_install () {
install -m 0755 myapp_version ${D}/version
}
変数の意味: https://docs.yoctoproject.org/ref-manual/variables.html
プログラムをビルドして追加する
先ほどの myproject をいじる。
SUMMARY = "My Application"
DESCRIPTION = "My Application"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://hello.c"
S = "${WORKDIR}"
do_configure () {
# Do nothing
:
}
do_compile () {
${CC} ${LDFLAGS} hello.c -o hello
}
do_install () {
install -d ${D}${bindir}
install -m 0755 hello ${D}${bindir}
}
hello.c は files 以下に作成する
cat > recipes-myproj/myapp/files/hello.c <<EOF
#include <stdio.h>
int main() {
printf("Hello Yocto!\n");
}
EOF
既成のパッケージを追加する
poky が提供しているパッケージは IMAGE_INSTALL
の指定で簡単にインストールできる。
https://git.yoctoproject.org/poky/plain/meta/recipes-extended/ などから目的のパッケージを選ぶ。
以下のように指定する
echo 'IMAGE_INSTALL:append = " zip"' >> build/conf/local.conf
あるいは packagegroup も使える。何が使えるかは例えば https://git.yoctoproject.org/poky/plain/meta/recipes-extended/packagegroups/packagegroup-core-base-utils.bb を見ればわかるはず
echo 'IMAGE_INSTALL:append = " packagegroup-core-base-utils"' >> build/conf/local.conf
デーモンの起動スクリプトを追加する (SysVinit編)
以下のように、2つのファイルを作成する
recipes-myproj/mydaemon/
├── files
│ └── mydaemon
└── mydaemon_1.0.bb
update-rc.d はすでにレシピがあるので、inherit update-rc.d
を唱えれば、よしなに反映してくれる。
SUMMARY = "My Daemon"
DESCRIPTION = "My Daemon"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://mydaemon"
S = "${WORKDIR}"
# do update-rc.d
inherit update-rc.d
INITSCRIPT_NAME = "mydaemon"
INITSCRIPT_PARAMS = "defaults 90"
do_install () {
install -d ${D}${sysconfdir}/init.d
install -m 0755 ${S}/mydaemon ${D}${sysconfdir}/init.d/mydaemon
}
files/mydaemon は https://raw.githubusercontent.com/fhd/init-script-template/refs/heads/master/template あたりを参考に、一般的な init スクリプトを作成して配置する。
あとは IMAGE_INSTALL に追加して↓、ビルドすればOK。
ehco 'IMAGE_INSTALL:append = " mydaemon"' >> build/conf/local.conf
デーモンの起動スクリプトを追加する (systemd編)
TODO
see https://docs.yoctoproject.org/dev-manual/new-recipe.html#enabling-system-services
レイヤ一覧
bitbake-layers show-layers
bbファイルのライセンス宣言を非公開のものにする
LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""
ファイルシステムを Read Only にする
TODO
ディスクイメージにパーティションを追加する (手動)
build ディレクトリに、test.wks
を作成する。core-image-minimal-genericx86
は対象に合わせる。
include tmp/deploy/images/genericx86-64/core-image-minimal-genericx86.wks
part /data --ondisk sda --size 5120 --fstype=vfat --label data --align 1024
これを使って、以下のように作成する
wic create ./test.wks -e core-image-minimal -o output
ls output/test-*-sda.direct
output/test-202502241431-sda.direct # < これをSDカードにddで書き込む
ディスクイメージにパーティションを追加する (レイヤに組み込む)
上で作った myproject
を使う。
cd myproject
mkdir wic
mkdir classes
wic/custom-wic.wks
を作成する。
ここでは build/tmp/deploy/images/genericx86-64/core-image-minimal-genericx86.wks を参考に、以下のようにした。
part /boot --source bootimg-efi --sourceparams="loader=grub-efi" --ondisk sda --label msdos --active --align 1024
part / --source rootfs --ondisk sda --fstype=ext4 --label platform --align 1024 --use-uuid
part swap --ondisk sda --size 44 --label swap1 --fstype=swap
part /data --ondisk sda --size 5120 --fstype=vfat --label data --align 1024 --use-uuid
bootloader --ptable gpt --timeout=5 --append="rootfstype=ext4 console=ttyS0,115200 console=tty0"
wks のマニュアル: https://docs.yoctoproject.org/ref-manual/kickstart.html
次に classes/custom-wic.bbclass
を作成する
ROOTFS_POSTPROCESS_COMMAND += "create_data_dir;"
WKS_FILE = "custom-wic.wks"
IMAGE_FSTYPES += "wic"
create_data_dir() {
mkdir ${IMAGE_ROOTFS}/data
}
最後に local.conf でこれを有効にして、ビルドする
echo 'INHERIT += "custom-wic"' >> build/conf/local.conf
bitbake core-image-minimal
rootfs のサイズを拡張する
# 5GB 余分にスペースを作る
echo 'IMAGE_ROOTFS_EXTRA_SPACE = "5242880"' >> build/conf/local.conf
ビルドしたパッケージに含まれるパッケージの一覧
build/tmp/deploy/images/qemux86-64/*.manifest
ビルド高速化
並列度を上げる
echo 'PARALLEL_MAKE="-j 12"' >> build/conf/local.conf
echo 'BB_NUMBER_THREADS="9"' >> build/conf/local.conf
PARALLEL_MAKE
はコア数の1.5倍、BB_NUMBER_THREADS
はコア数の1.2倍程度がちょうど良いっぽい。
デフォルトではコア数になるぽい。
ダウンロードキャッシュを使う
mv build/downloads /path/to/downloads # 既存のダウンロードキャッシュを移動 (必要なら)
echo 'DL_DIR = "/path/to/downloads"' >> build/conf/local.conf
ビルドキャッシュを使う
mv build/sstate-cache /path/to/sstate-cache
echo 'SSTATE_DIR = "/path/to/sstate-cache/${MACHINE_ARCH}"' >> build/conf/local.conf
bitbake 関連
bitbake core-image-minimal -c listtasks # タスク一覧
bitbake core-image-minimal -c clean
デバッグ
QEMU で動かす
runqemu nographic serialstdio qemuparams="-m 1024"
root/(nopassword) でログインできる。
QEMU を終了する
Ctrl-A + Ctrl-X
or ゲストOSで shutdown -h now
する
トラブルシュート
RDEPENDS が反映されない
アプリレシピ recipes-test/myapp/myapp_1.0.bb
などで、RDEPENDS を使って依存するパッケージを宣言し、成果物に組み込むことができます。python3 をインストールしたい場合:
RDEPENDS:${PN} += "python3"
しかし、この設定はパッケージマネージャ (rpm や dpkg) が管理します。そして core-image-minimal などではインストールされません。結果、宣言してもエラーにもならず無視されます。
そのような場合は local.conf などで、EXTRA_IMAGE_FEATURES += "package-management"
を有効にする必要があります。
ガセだった。パッケージマネージャがなくても反映されます。
IMAGE_INSTALL でパッケージの追加ができない
build/conf/local.conf
に IMAGE_INSTALL:append = " myapp"
のように書いて myapp を追加することができます。
これを以下のようにすると反映されません。
# NG な書き方。理由は分からない...
IMAGE_INSTALL += "myapp"
Discussion