RaspberryPi Linux

YoctoでRaspberryPi4のイメージをビルドしてみた

昨今、様々なデバイスで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ごとのインストールコマンドが記載されているため、素直にそれに従います。

$ sudo apt-get 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 pylint3 xterm python3-subunit mesa-common-dev

Yocto本体+ラズパイ向け設定の取得

続いて、Yocto本体(poky)を取得します。

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

pokyだけではラズパイ向けイメージのビルドに対応していません。そこで、ラズパイ向けのレイヤー(設定の集まりみたいなもの)を取り込みます。

$ cd poky
$ git clone https://github.com/agherzan/meta-raspberrypi.git

ビルド前設定

レイヤーの取り込みができたら、いよいよビルドに入ります。

まずは以下のコマンドでpokyをセットアップします。このコマンドを実行すると、カレントディレクトリがpoky/buildに移動します。

$ source oe-init-build-env

ここからは下準備として、各種設定ファイルの書き換えをします。まずはconf/bblayers.confにラズパイ用レイヤー(赤字部分)を追加します。

$ sudo vi 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にターゲットの設定(赤字部分)を追加します。

$ sudo vi 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を指定すると良いようです。

$ bitbake core-image-minimal

ここからはひたすら待ちます。CPU4コア・メモリ4GBのマシンで約4時間近くかかりました。

コンソールを見ていると、次々にパッケージがビルドされていく様子を見れて面白いです。先述したワークフローに従ってビルドが進行されていくのが分かります。

完成したイメージをラズパイで動かす

できあがったイメージをラズパイ本体で動かしてみます。

ビルドされたイメージはpoky/build/tmp/deploy/images/raspberrypi4-64下にあります。拡張子がwic.bz2のファイルがそれです。

core-image-minimal-raspberrypi4-64-20210417040438.rootfs.wic.bz2

このファイルを取り出して展開すると、拡張子がwicのファイルが出てきます。これをEtcherなどの書き込みツールでSDカードに書き込むだけです。

あとは書き込んだSDカードをラズパイに挿して起動できれば大成功です。

まとめ

今回はただ動かしただけですが、イチからLinux全体をビルドできたと考えるとちょっと面白いですね!Yoctoの神髄であるオリジナルのディストリビューション作成については、今後挑戦してみたいと思います。

ではでは

関連記事

C言語 自作物 Linux プログラミング

wordleもどきのCUIアプリをつくってみた

最近、wordleという英単語当てゲームで遊んでいます。シンプルなゲームながら、通勤時間の暇つぶしや友人とのスコア比べなど意外と中毒性があり面白いです。 普通に英単語の勉強にもなるので、もっとたくさん ...

RaspberryPi Linux

Raspberry Pi4+Ubuntu ServerでGitLabを動かしてみる

お仕事でGitLabに触れる機会があったので、学習用に自宅にもGitLabが欲しくなりました。 手元にあるRaspberry Pi4+Dockerならお手軽に立ち上げられるはずと着手したものの、意外と ...

Flutter プログラミング

【Flutter】アプリ内の設定値を実装する方法

アプリ内で独自の設定を作る場合、そのデータを保持する方法を考える必要があります。 SQL、テキストファイルなど選択肢は多々ありますが、shared_preferencesというパッケージを使えば簡単に ...

RaspberryPi Linux

YoctoでRaspberryPi4のイメージをビルドしてみた

昨今、様々なデバイスでLinuxが動くようになっている中、組み込みLinuxのデファクトスタンダードとなりつつあるのが「Yocto」と呼ばれるビルドシステムです。 組み込みの現場ではその名前を聞くこと ...

C++ 自作物

言語処理系をつくろう(第7回):比較演算子を実装する

自作の言語処理系開発日記の第7回です。前回までで変数の実装が終わったので、ここからはいよいよ制御構文を実装…と思ったのですが、制御のためには比較演算子を実装する必要がありました。 ということで、今回は ...

Ryo Yoneyama

とある会社でソフトウェアエンジニアをしています。技術的な備忘録を中心にまとめてます。ネタがあれば日記も書きます。

    -RaspberryPi, Linux