YoctoでRaspberryPi 3B+向けのOSを作ってみる

こんにちは。

私は現在、『ラブライブ!虹ヶ咲学園スクールアイドル同好会』を視聴しています。

天王寺璃奈さんはかわいいですね。
彼女は感情を表に出すのが苦手で、普段はスケッチブックに表情を描き、コミュニケーションをとっています。
また、技術面に明るく、アイドル活動時は顔を覆うディスプレイを自在に制御し、豊かな感情を表現しています。
youtu.be

そんな折、こんなツイートを見かけました。

ハードもソフトも自作している天王寺璃奈さん。OSもカスタマイズしていることでしょう。
きっとYocto Projectを利用しています。
というわけで僕もYoctoを触りたいと思います。

モチベーション

Advent calendar用 兼 仕事の勉強です。
ありふれた内容ですが、まずは人の真似からということで初めてみます。

ちょうどラズパイを持て余していたこともあり、
まずは最小限のラズパイ用OSをYoctoでビルドしてみます。

Yocto Projectとは

簡単に言うと、組み込みシステム向けのLinuxを作るためのツールです。
OSを作るための諸々がまとまっているものという認識でいます。
Yoctoのいい点は、オリジナルの構成を作れること、デファクトスタンダードであることです。
デファクトスタンダード最高。

詳しくは公式や「Yocto とは」でヒットした記事を読んでください。
触ってみたい方は岩松さんの『レシピの作り方入門』がいいと思います。

作業環境

以下の内容をUbuntu20.04 on VirtualBoxに割り当てて作業します。

項目 内容
プロセッサ Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz 8コア
メモリ 10GB
ストレージ SSD 10GB, HDD 1TB

環境構築

まずはYocto Projectを導入していきます。 公式導入手順を参考に、必要なパッケージをインストールしていきます。

$ sudo apt install gawk wget git-core diffstat unzip texinfo gcc-multilib \
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

ビルドツールPokyをcloneします。

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

ラズパイ用のOSを作るにあたって必要なmeta-raspberrypiをcloneします。
レイヤーはpokyにまとめておきました。

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

ビルド

pokyディレクトリでbuildディレクトリを作成します。

~/poky$ source oe-init-build-env

レイヤ追加

build/conf/bblayers.confに、先ほどcloneしてきたレイヤmeta-raspberrypiを追加します。
これで、ビルドツールbitbakeがレイヤを認識してくれます。

BBLAYERS ?= " \
  /path/to/poky/meta \
  /path/to/poky/meta-poky \
  /path/to/poky/meta-yocto-bsp \
  /path/to/poky/meta-raspberrypi \
  "

対象マシン設定

対象マシンを設定するために、build/conf/local.confを編集します。
私の場合はRaspberry Pi 3B+で、SoCのBCM2837が64bitアーキテクチャを採用しています。 せっかくなので、raspberrypi3-64を採用します。

マシン名は、meta-rasberrypi/docs/layer-contents.mdmeta-rasberrypi/conf/machine/以下で確認できます。

## Supported Machines

* raspberrypi
* raspberrypi0
* raspberrypi0-wifi
* raspberrypi2
* raspberrypi3
* raspberrypi3-64 (64 bit kernel & userspace)
* raspberrypi4
* raspberrypi4-64 (64 bit kernel & userspace)
* raspberrypi-cm (dummy alias for raspberrypi)
* raspberrypi-cm3

マシン名をlocal.confの末尾に追記します。

MACHINE ?= "raspberrypi3-64"

ビルド実行

今回は最小限の構成でビルドします。
天に3回祈って寝ます。結果は追記します。

$ bitbake core-image-minimal

(追記2020/12/03)ビルド成功してました。4時間弱かかりました......

ビルド生成物

ビルドで生成されたファイルを確認します。
生成物は、build/tmp/deploy/images/マシン名以下にあります。
大量にありますが、今回必要なのは
Image,core-image-minimal-raspberrypi3-64.tar.bz2,bcm2837-rpi-3-b-raspberrypi3-64.dtbのみです。
(ファイル名からの判断なので動作確認してません。今microSDがないので......)

トラブルシューティング

VBoxの共有フォルダ内で作業していたが、bitbakeが権限的に実行できなかった。
仕様で共有フォルダの権限を変更できないので(グループに入ることで読み書きはできるがbitbakeはnot permittedされる)、
結局、VBoxでHDDを追加、Ubuntuでマウントして作業ディレクトリを移動した。

まとめ

環境構築から記事作成までぶっ通しでやったので疲れた......。
次はGUI(wayland)を追加するのもいいかもしれない。