🐙

はじめてのYoctoプロジェクト (Raspberry-pi 4)

2023/09/12に公開

最近組み込みLinuxをいじる仕事が多く、この際イチからYoctoを勉強しようと思い立ち、この記事を書くに至りました。

目的

Yocto(ツールの実態はbitbake)自体はLinuxビルドツールですが、あまりにも多くの機能を持つので体系的に勉強するには無理があります。そして、公式ドキュメントはすべて英語で書かれており日本語話者には理解が大変です。今回は「極小のLinuxをビルドする」という最初のステップを通して、YoctoでLinuxをビルドする流れを知るところから始めます。

ゴール

  • Raspberry-piに極小Linuxを焼いて動かす

用意するもの

  • Linux PC (今回はUbuntu 20.04を想定、100GB以上の空き容量必須)

  • Raspberry-pi-4

  • Micro SD カード

  • Raspberry-piに接続する周辺機器

    • ディスプレイ
    • HDMIケーブル
    • キーボード
    • 電源

環境構築

今回は開発PCとしてUbuntuを想定しています
まずは必要なソフトウェアをインストール

sudo apt install 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 libegl1-mesa libsdl1.2-dev python3-subunit mesa-common-dev zstd liblz4-tool file locales
sudo locale-gen en_US.UTF-8

作業ディレクトリを作り、入ります

mkdir yocto-development
cd yocto-development

pokyをcloneする。pokyはすべてのYoctoプロジェクトで必ず必要になるレシピ群で、どんなLinuxにも共通で必用なベーシックな機能やよく使われるアプリケーション・ライブラリなどのレシピを持っています。基本的にこの中のファイルは触ってはいけません
https://github.com/yoctoproject/poky

git clone git://git.yoctoproject.org/poky

次にRaspberry-piのBSP (Board Support Package)レシピmeta-raspberrypiをcloneする。meta-raspberrypiはラズパイのデバイス認識のために必用なドライバや起動のためのブートローダなどのボード専用ソフトウェアのレシピ群です。ボードがラズパイではない場合は、そのボード専用のmeta-xxxが必用になります。
https://github.com/agherzan/meta-raspberrypi

git clone git@github.com:agherzan/meta-raspberrypi.git

さて、先程cloneしたpokyにはたくさんのバージョンがあります(Release wiki page)。これを他のレシピ群とも合わせなければいけません。これは簡単で、各リポジトリをgitでそのバージョンにcheckoutするだけです。
まずはpokyをcheckout

cd poky
git checkout mickledore
# 怒られたら git checkout -b mickledore origin/mickledore
cd ..

そしたらmeta-raspberrypiも

cd meta-raspberrypi
git checkout mickledore
# 怒られたら git checkout -b mickledore origin/mickledore
cd ..

次はビルドディレクトリを作ります。pokyを使って自動でビルドの環境が整ったディレクトリをワンコマンドで作ることができます。

source poky/oe-init-build-env build

するとbuildというディレクトリが出来てすでに中に入っていることと思います。ここまでで

yocto-development
├── build
├── meta-custom
├── meta-raspberrypi
└── poky

ができていればOK。

Yoctoプロジェクトでは、基本的にcloneしたリポジトリなどには変化を加えません。Yoctoのファイル群は非常に繊細なので元の状態から触ってはいけません。その代わりこのビルドディレクトリに自分のしたいカスタマイズを書くことが出来ます。

さて、今回のゴールは「Raspberry-piに極小のLinuxを焼いて動かす」でした。ここで普通のLinux(そんなものは存在しないが)からカスタマイズしたい部分は「Raspberry-piに」と「極小のLinux」という部分です。「極小のLinux」という部分は実は既にpokyにあるレシピ名を選んでビルドすれば簡単に出来てしまいます。結局このbuildの中でやりたいことはRaspberry-pi用にカスタマイズするということです。

まずはconf/local.confの編集

-MACHINE ??= "qemux86-64"
+MACHINE ??= "raspberrypi4-64"

このraspberrypi4-64はどこから来たかというとmeta-raspberrypi/conf/machine配下にある.confファイルの名前から来ています。ここにあるファイル名から自分のビルドしたいラズパイボードの名前を選び、MACHINEの値をその名前に変更します。今回はラズパイ4 64bitをターゲットにしています。

次に、meta-raspberrypiを読み込むようにconf/bblayers.confを編集

BBLAYERS ?= " \
  /tmp/yocto-development/poky/meta \
  /tmp/yocto-development/poky/meta-poky \
  /tmp/yocto-development/poky/meta-yocto-bsp \
+  /tmp/yocto-development/meta-raspberrypi \
"

ここに書いたmeta-xxxはビルドするときに参照されるようになります。

ビルド

さて、ビルドの準備が出来ました。source poky/oe-init-build-env buildをした後はbitbakeコマンドが使えるようになっているはずです。bitbake <image>で実際のビルドが開始されます。今回はpokyにすで入っているレシピのプリセット、core-image-minimalを使用します。

bitbake core-image-minimal

ビルドの速さは完全にマシンスペックによります。場合によっては1時間以上かかりますので、ネットフリックスでも見て待ちます。

出来上がりましたら、SDカードを開発PCに差し込んで焼き込みます。まずはSDカードを空っぽにフォーマットします。DisksなどのUbuntuのアプリケーションを使ってフォーマットし、パーティションは何も作らない状態にします。
そして、lsblkコマンドなどでSDカードのデバイスのパスを探ります

$ lsblk
NAME                  MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
...
sdb                     8:16   1  29.8G  0 disk
...

この場合SDカードの場所は/dev/sdbとなります。

焼き込みにはお手軽なbmaptoolを使います。リンク先からインストール方法を調べてインストールします。

build/tmp/deploy/images/raspberrypi4-64にビルドしたイメージが格納されているので、移動して中にあるイメージファイルをbmaptoolでコピー。コマンドはsudo bmaptool copy --bmap xxx.wic.bmap xxx.wic.bz <device path>

cd tmp/deploy/images/raspberrypi4-64
sudo bmaptool copy --bmap core-image-minimal-raspberrypi4-64.wic.bmap core-image-minimal-raspberrypi4-64.wic.bz2 /dev/sdb

コピーが終わったら焼き込み完了です、ラズパイに挿して起動してみましょう!

おわり

Discussion