✍️

yocto cheat sheet

2025/03/05に公開

はじめの一歩

# リリース一覧: 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
myapp_1.0.bb
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 をいじる。

myapp_1.0.bb
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 を唱えれば、よしなに反映してくれる。

mydaemon_1.0bb
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 を参考に、以下のようにした。

wic/custom-wic.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 を作成する

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.confIMAGE_INSTALL:append = " myapp" のように書いて myapp を追加することができます。
これを以下のようにすると反映されません。

# NG な書き方。理由は分からない...
IMAGE_INSTALL += "myapp"

マニュアル等

Discussion