昨今、様々なデバイスでLinuxが動くようになっている中、組み込みLinuxのデファクトスタンダードとなりつつあるのが「Yocto」と呼ばれるビルドシステムです。
組み込みの現場ではその名前を聞くことが増えましたが、まだまだ日本ではドキュメントも乏しくイマイチ掴み所がありません。そこで、まずは使ってみようということでRaspberry Pi4のイメージをビルドしてみることにしました。
Yoctoとは?
まず、Yoctoって何?というお話しですが、簡単に言うと「オリジナルのディストリビューションを作れる仕組み」です。カーネルからユーザーランドに至るまで、Linux全体をカスタマイズしてビルドすることができます。
以下はYoctoの公式サイトから引用したワークフローの図です。
Build System(背景が水色のブロック)がYocto内部で実行される処理フローを表しています。ソースの取得→パッチ適用→ビルド→パッケージ化→イメージ作成という風に、必要なソースを外部から取得してビルドすることで柔軟なイメージ作成が可能になっています。
Raspberry Pi4のイメージを作ってみる
さっそくYoctoを試してみましょう。今回は、手元にある組み込みLinuxボードとしてRaspberry Pi4をターゲットとします。
下準備
ホスト環境はUbuntu18.04を使います。2021/4/18時点で、以下のOSがホスト環境として利用できるようです。
- Ubuntu 16.04 (LTS) / 18.04 (LTS) / 20.04
- Fedora 30 / 31 / 32
- CentOS 7.x / 8.x
- Debian GNU/Linux 8.x (Jessie) / 9.x (Stretch) / 10.x (Buster)
- openSUSE Leap 15.1
Yoctoを動かす事前準備として、必要なパッケージをインストールします。Yoctoの公式マニュアルにOSごとのインストールコマンドが記載されているため、素直にそれに従います。
Yocto本体+ラズパイ向け設定の取得
続いて、Yocto本体(poky)を取得します。
pokyだけではラズパイ向けイメージのビルドに対応していません。そこで、ラズパイ向けのレイヤー(設定の集まりみたいなもの)を取り込みます。
$ git clone https://github.com/agherzan/meta-raspberrypi.git
ビルド前設定
レイヤーの取り込みができたら、いよいよビルドに入ります。
まずは以下のコマンドでpokyをセットアップします。このコマンドを実行すると、カレントディレクトリがpoky/build
に移動します。
ここからは下準備として、各種設定ファイルの書き換えをします。まずはconf/bblayers.conf
にラズパイ用レイヤー(赤字部分)を追加します。
--------------------
BBLAYERS ?= " \
/home/ryo/workspace/poky/meta \
/home/ryo/workspace/poky/meta-poky \
/home/ryo/workspace/poky/meta-yocto-bsp \
/home/ryo/workspace/poky/meta-raspberrypi \
"
--------------------
続いて、ビルドターゲットをラズパイに変更します。conf/local.conf
にターゲットの設定(赤字部分)を追加します。
--------------------
# There are also the following hardware board target machines included for
# demonstration purposes:
#
#MACHINE ?= "beaglebone-yocto"
#MACHINE ?= "genericx86"
#MACHINE ?= "genericx86-64"
#MACHINE ?= "edgerouter"
#
# This sets the default machine to be qemux86-64 if no other machine is selected:
MACHINE ??= "qemux86-64"
MACHINE ?= "raspberrypi4-64"
--------------------
ここまでで下準備は完了です。あとはビルドを始めるだけ!
ビルド実行
以下のコマンドでビルドを開始します。必要最小限の機能のみをビルドする場合はcore-image-minimal
を指定すると良いようです。
ここからはひたすら待ちます。CPU4コア・メモリ4GBのマシンで約4時間近くかかりました。
コンソールを見ていると、次々にパッケージがビルドされていく様子を見れて面白いです。先述したワークフローに従ってビルドが進行されていくのが分かります。
完成したイメージをラズパイで動かす
できあがったイメージをラズパイ本体で動かしてみます。
ビルドされたイメージはpoky/build/tmp/deploy/images/raspberrypi4-64
下にあります。拡張子がwic.bz2のファイルがそれです。
このファイルを取り出して展開すると、拡張子がwicのファイルが出てきます。これをEtcherなどの書き込みツールでSDカードに書き込むだけです。
あとは書き込んだSDカードをラズパイに挿して起動できれば大成功です。
まとめ
今回はただ動かしただけですが、イチからLinux全体をビルドできたと考えるとちょっと面白いですね!Yoctoの神髄であるオリジナルのディストリビューション作成については、今後挑戦してみたいと思います。
ではでは