Open23

yoctoを使ってみる

zakkiezakkie

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

zakkiezakkie

ビルド用VMの作成

multipass launch --disk 100G --memory 8G --cpu 4 \
  --cloud-init multipass-cloudinit.yaml \
  --name yocto-builder 22.04
multipass-cloudinit.yaml
#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 ]
zakkiezakkie

ビルドする。

ほぼ 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"

zakkiezakkie

ビルドを実行する

bitbake core-image-minimal
zakkiezakkie

ビルドはとても時間がかかる。

全てソースコードをダウンロードして、コンパイルしている。

高速化の手法は色々あるみたいだけど、結局初回はダウンロードする必要があるので、どうしようもない。
https://qiita.com/naohikowatanabe/items/868eefed28cefec20ff8

CI に組み込むなら、ダウンロードキャッシュとビルドキャッシュを使い回すように工夫する必要がありそう。
それか、札束で殴って、EC2 のいいインスタンスを使えば高速化できるかも。

zakkiezakkie

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

zakkiezakkie

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

zakkiezakkie

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

zakkiezakkie

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, パスワード無しでログインできる

zakkiezakkie

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

zakkiezakkie

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 \
zakkiezakkie

macOS で dd する際、disk5 ではなく、rdisk5 を使うと速い

sudo dd if=hoge.img of=/dev/rdisk5 bs=16m status=progress
zakkiezakkie

作成したイメージの中身を確認する

$ 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
...
zakkiezakkie

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

runqemu nographic serialstdio qemuparams="-m 1024"

root/(nopassword) でログインできる。