はじめてのYoctoプロジェクト (Raspberry-pi 4)
最近組み込み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にも共通で必用なベーシックな機能やよく使われるアプリケーション・ライブラリなどのレシピを持っています。基本的にこの中のファイルは触ってはいけません
git clone git://git.yoctoproject.org/poky
次にRaspberry-piのBSP (Board Support Package)レシピmeta-raspberrypiをcloneする。meta-raspberrypiはラズパイのデバイス認識のために必用なドライバや起動のためのブートローダなどのボード専用ソフトウェアのレシピ群です。ボードがラズパイではない場合は、そのボード専用のmeta-xxxが必用になります。
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-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