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の神髄であるオリジナルのディストリビューション作成については、今後挑戦してみたいと思います。

ではでは

広告の表示がブロックされています。
広告の表示がブロックされています。

関連記事

RaspberryPi Linux

2021/4/18

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

昨今、様々なデバイスでLinuxが動くようになっている中、組み込みLinuxのデファクトスタンダードとなりつつあるのが「Yocto」と呼ばれるビルドシステムです。 組み込みの現場ではその名前を聞くことが増えましたが、まだまだ日本ではドキュメントも乏しくイマイチ掴み所がありません。そこで、まずは使ってみようということでRaspberry Pi4のイメージをビルドしてみることにしました。 目次1 Yoctoとは?2 Raspberry Pi4のイメージを作ってみる2.1 下準備2.2 Yocto本体+ラズパイ ...

この記事を読む

C++ 自作物

2020/8/14

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

自作の言語処理系開発日記の第7回です。前回までで変数の実装が終わったので、ここからはいよいよ制御構文を実装…と思ったのですが、制御のためには比較演算子を実装する必要がありました。 ということで、今回は比較演算子を実装していきます。基本的には四則演算と変わりないのであまり難しくはありません。 目次1 比較演算子の仕様2 実装してみる2.1 トークナイザ2.2 構文解析器2.3 コード生成器2.4 実行系(仮想マシン) 比較演算子の仕様 比較演算子を実装する前に、その仕様について少し考えておきます。 比較演算 ...

この記事を読む

C++ 自作物

2020/8/14

言語処理系をつくろう(第6回):変数を実装する

自作の言語処理系開発日記、第6回です。 これまでは四則演算など、電卓レベルの機能実装に取り組んでいましたが、いよいよ変数を扱えるようにしていきたいと思います。これでかなりプログラミング言語っぽくなるかも(・∀・) 今回は新しい仕組みを入れたりと、割と修正がごちゃごちゃしてしまったので、うまくまとめきれていません。ごめんなさい…。 目次1 変数の実装について2 実装してみる2.1 トークナイザ2.2 構文解析器2.3 コード生成器2.4 実行系(仮想マシン) 変数の実装について これまでは即値しか扱っていな ...

この記事を読む

C++ 自作物

2020/8/14

言語処理系をつくろう(第5回):連続した式の実行

自作の言語処理系開発日記の第5回です。 前回までで括弧を含んだ四則演算ができるようになりましたが、このままでは単なる電卓止まりです。ということで、今回は複数の式を連続して実行できる仕組みを実装していきたいと思います。 目次1 生成規則を考える2 実装してみる2.1 構文解析器2.2 コード生成 生成規則を考える これまでは入力全体を1つの式として解釈していましたが、今回は式の区切りを定義して複数の式として解釈できるようにします。 C言語だと「;」や「,」が区切り文字として使われますが、開発中の言語(roo ...

この記事を読む

C++ 自作物

2020/8/14

言語処理系をつくろう(第4回):括弧付き計算と単項演算子

自作の言語処理系開発日記の第4回です。前回までで乗除算を実装できたので、この調子でもう少し複雑な計算に対応したいと思います。今回はそれぞれの実装が少ないので、一気に2つのステップを進めます。 目次1 括弧を含む計算1.1 生成規則をいじる2 単項演算子(+と-)2.1 生成規則をいじる 括弧を含む計算 これまでの実装では、乗除算は必ず加減算に先立って実行されます。しかし、それでは不十分なので、括弧を含む計算(例:(1+2)*3)を実行できるようにします。 生成規則をいじる 今回も構文解析器の生成規則を修正 ...

この記事を読む

  • このブログの中の人

Ryo Yoneyama

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

-RaspberryPi, Linux

© 2021 Corgi Lab. ~備忘録のための技術ブログ~