yoctoを使ってみる

Bitbake という make に相当するビルドツールを使う

ビルド用VMの作成
multipass launch --disk 100G --memory 8G --cpu 4 \
--cloud-init multipass-cloudinit.yaml \
--name yocto-builder 22.04
#cloud-config
package_update: true
package_upgrade: true
packages:
- tree
- ack
- make
- gawk
- wget
- git
- diffstat
- unzip
- texinfo
- gcc
- build-essential
- chrpath
- socat
- cpio
- python3
- python3-pip
- python3-pexpect
- xz-utils
- debianutils
- iputils-ping
- python3-git
- python3-jinja2
- python3-subunit
- zstd
- liblz4-tool
- file
- locales
- libacl1
- bmap-tools
runcmd:
- [ locale-gen, en_US.UTF-8 ]

ビルドする。
ほぼ https://zenn.dev/morising362/articles/a4e26c92841d04 のとおり。
mkdir ~/yocto-development
cd ~/yocto-development
git clone git://git.yoctoproject.org/poky
git clone https://github.com/agherzan/meta-raspberrypi.git
# 202408 時点で最新の LTS の scarthgap を使うことにした
# 他のリリース > https://wiki.yoctoproject.org/wiki/Releases
cd poky
git switch scarthgap
cd ../meta-raspberrypi
git switch scarthgap
cd ..
source poky/oe-init-build-env build
↑を実行すると build ディレクトリに cd しているはず。
以下のように修正する。手元の Raspberry Pi は 3b+。
diff --git a/conf/bblayers.conf b/conf/bblayers.conf
index dd4f710..f29ab17 100644
--- a/conf/bblayers.conf
+++ b/conf/bblayers.conf
@@ -9,4 +9,5 @@ BBLAYERS ?= " \
/home/ubuntu/yocto-development/poky/meta \
/home/ubuntu/yocto-development/poky/meta-poky \
/home/ubuntu/yocto-development/poky/meta-yocto-bsp \
+ /home/ubuntu/yocto-development/meta-raspberrypi \
"
diff --git a/conf/local.conf b/conf/local.conf
index 72d3566..9cb2c16 100644
--- a/conf/local.conf
+++ b/conf/local.conf
@@ -35,6 +35,7 @@
#MACHINE ?= "genericx86"
#MACHINE ?= "genericx86-64"
#
+MACHINE ?= "raspberrypi3-64"
# This sets the default machine to be qemux86-64 if no other machine is selected:
MACHINE ??= "qemux86-64"

ビルドを実行する
bitbake core-image-minimal

ビルドはとても時間がかかる。
全てソースコードをダウンロードして、コンパイルしている。
高速化の手法は色々あるみたいだけど、結局初回はダウンロードする必要があるので、どうしようもない。
CI に組み込むなら、ダウンロードキャッシュとビルドキャッシュを使い回すように工夫する必要がありそう。
それか、札束で殴って、EC2 のいいインスタンスを使えば高速化できるかも。

git://github.com/raspberrypi/linux.git
の fetch でエラーになる。
github.com が git プロトコルのサポートをやめたから。
以下で回避した。
git config --global url.https://github.com/.insteadOf git://github.com/
refs. https://github.blog/security/application-security/improving-git-protocol-security-github/

bitbakeはCPUの数だけ並列実行してくれるぽい。多めに割り当てておくと良さそう

WICという形式でイメージファイルができるらしい。これどうやったらmacosからSDカードに書き込めるん?

bmaptoolでイメージファイルを作ればいいんかな

bmaptoolでイメージファイルを作ればいいんかな
それでよかった。
$ cd tmp/deploy/images/raspberrypi3-64
$ bmaptool copy --bmap core-image-minimal-raspberrypi3-64.rootfs.wic.bmap core-image-minimal-raspberrypi3-64.rootfs.wic.bz2 /tmp/hoge.img
でもって mac book から、以下を実行する
$ multipass transfer yocto-builder:/tmp/hoge.img ./hoge.img
$ sudo dd if=hoge.img of=/dev/disk4 bs=8m # disk4 は適当に合わせる
終わったら、SDカードをmacから抜いて、raspi にさす。ディスプレイもつないで、電源ON!
プロンプトが出れば完成。root, パスワード無しでログインできる

EXTRA_IMAGE_FEATURES = "read-only-rootfs"
を唱える。

ファイルシステムをREAD ONLYにするのは、どうするのが正解なんだろう?

python を使えるようにする
git clone https://github.com/openembedded/meta-openembedded.git
cd meta-openembedded
git switch scarthgap
bblayers.conf に2行追加
/home/ubuntu/yocto-development/meta-openembedded/meta-oe \
/home/ubuntu/yocto-development/meta-openembedded/meta-python \

SDカードイメージのマウント

macOS で dd する際、disk5 ではなく、rdisk5 を使うと速い
sudo dd if=hoge.img of=/dev/rdisk5 bs=16m status=progress

NOTE: Runtime target 'linux-firmware-rpidistro-bcm43430' is unbuildable, removing...
みたいなエラーは LICENSE_FLAGS_ACCEPTED
を指定したら直った

core-image-base
がいいのかも

作成したイメージの中身を確認する
$ source ./poky/oe-init-build-env
$ bunzip2 -c tmp/deploy/images/raspberrypi3-64/core-image-base
-raspberrypi3-64.rootfs-20241104020558.wic.bz2 > 0.wic
$ wic ls 0.wic
Num Start End Size Fstype
1 4194304 140509183 136314880 fat16
2 142606336 382520319 239913984 ext4
$ wic ls 0.wic:2
debugfs 1.46.5 (30-Dec-2021)
2 40755 (2) 0 0 1024 6-Apr-2011 08:00 .
2 40755 (2) 0 0 1024 6-Apr-2011 08:00 ..
11 40700 (2) 0 0 12288 6-Apr-2011 08:00 lost+found
13 40755 (2) 0 0 3072 9-Mar-2018 21:34 bin
...

runqemu で、ビルドしたイメージを起動できる (MACHINE ??= "qemux86-64"
でビルド) 。
シリアルコンソールを有効にし、メモリを1024MBに指定している
runqemu nographic serialstdio qemuparams="-m 1024"
root/(nopassword)
でログインできる。