Yocto ProjectでRaspberry Pi用Linux ディストリビューション作成

WEBサービス開発グループの堀です。

近年、Raspberry Piのような安価でLinuxが動作するシングルボードコンピュータ(年齢的にマイコンボードという呼び方のほうがしっくりきます)が流通するようになり、Webなエンジニアでも組み込みの世界に入っていけるようになりました。

Raspberry Piならraspbianのようにシングルボードコンピュータによって専用のディストリビューションが用意されていたりしますが、そういうものが準備されていないボードがあったり、全部入りなディストリビューションはいらない、インストールするソフトウェアは厳選して容量は出来るだけ小さくしたい、ハードウェアに依存しない世界で開発がしたい、などと思うこともあります。そんなときに役立つのがYocto Projectです。(Yocto(ヨクト)は国際単位系の最小単位で10の-24乗を表す語だそうです)

Yocto Projectとは

Yocto Project(以下Yocto)は、カスタムLinuxディストリビューションを作成するためのビルドツール群で、オープンソースのコラボレーション・プロジェクトなどとも言われます。様々なアーキテクチャーでLinux環境を構築するためのテンプレート(レシピ)やビルドのためのツールなど各種ユーティリティが含まれていて、ハードウェアに依存しないクロス開発を実現できます。

Yoctoのリファレンス・ビルド・システムはpokyと呼ばれ、ビルド・エンジンのBitBakeとレイヤーと呼ばれるOSSパッケージのレシピ集のOpenEmbedded-Coreやハードウェアに必須なパッケージ・ドライバを含んだBSP (Board Support Package)などから構成されています。(ややこしい話ですが、Yoctoで作成したLinux ディストリビューションのこともPokyと言ったりします)

yocto-environment

MPU(CPU)としてARM、MIPS、 PowerPC、x86を使用しているシングルボードコンピューターであればだいたい対応できます。今回は日本では2月に発売されたRaspberry Pi zero(*1)向けのLinuxディストリビューションを作成してみます。Yoctoの基本設定でビルドしてもイメージサイズはraspbian jessie Liteの1/10程度になります。

(*1)Raspiberry Pi zeroはスイッチサイエンスKSYで650円ほどで購入できます

Yocto環境のセットアップ

サーバーのセットアップ

YoctoはUbuntu、Fedora、CentOS、openSUSEで動作するように作られていますが、今回はUbuntu 16.04を使用します。すでに入ってるものもあると思いますが、以下のビルドに必要なパッケージをapt-getでインストールします。

注意:ビルド時にdisk容量が多く必要になりますので、50GB程度のdisk容量を確保することをお勧めします。

Yocto本体(poky)をインストール

Yocto本体をgitでインストールします。ブランチを指定しない場合は当然masterが選択されますが、バグ等を含んで動かないといったトラブルに見舞われることが多々ありますので、ブランチを指定してインストールすることをオススメします。Yoctoのメジャーバージョンの名前は、2.3はpyro、2.2はmorty、2.1はkrogothのようになっています。今回は2.3のpyroを使用します。

OpenEmbedded-Core、BSPのインストール

先ほど作成されたpokyディレクトリの下にRaspberry Pi用のOpenEmbedded-Core、BSP(レイヤー)を展開します。バージョンはpokyと同じpyroを使用します。2017/07/13の段階でRaspberry Pi / Raspberry Pi2 /Raspberry Pi3/ raspberry pi zero / raspberry pi zero wifi(日本未発売)がサポートされているようです。

これでRaspberry Pi zero向けのLinuxディストリビューションを作成するYocto環境が整いました。

ビルド

build環境作成

build環境の雛形を作ってくれる便利スクリプトoe-init-build-envを実行してビルド環境を作成します。無事に作成し終わるとbuild/ディレクトリへ移動してくれます。

レイヤー追加

build/ディレクトリでRaspberry Pi zeroに必要なレイヤーをbitbake-layersコマンドで指定します。今回は行いませんが、ここで色々なレイヤーを追加することでイメージのカスタマイズができます。

設定ファイル修正

oe-init-build-envスクリプトで作成されたビルド用の設定ファイルconf/local.confにターゲットとなるハードウェア(今回はraspberry pi zero)とビルドに必要なOSSなどがダウンロードされるディレクトリを追記します。(local.confの一番先頭に書いてしまってOKです)
表記法は基本的にMakefileと同様ですが、詳細についてはYoctoのドキュメントをご確認ください。

ビルド

bitbakeコマンドでビルドを行います。この処理で必要なOSSなどをダウンロードしたりコンパイルしたりなどを行いますので、ビルドが完了するまでには数時間かかります。(ビルドにかかる時間はCPUやネットワークの帯域など環境によります)

昔は現役を引退したノートPCなどに環境を作ってビルドしていたものですが、最近はパブリッククラウドでCPU大盛りのサーバーをお手軽かつ、リーズナブルな金額で借りることができるようになりましたので、ビルドの時間も短縮できるようになりました。(ニフティクラウドのsmallサーバープラン(1CPU/1GBメモリ)では4時間強ですが、wlarge16サーバープラン(8vCPU/16GB)で1時間弱で終わります)

問題なければimageファイルがbuildディレクトリのtmp/deploy配下に作成されます。(イメージサイズは132MBになりました)

動作テスト

micro SDカードに作成したイメージを書き込み、Raspberry Pi zeroでbootするか確認します。イメージを書き込むツールはddコマンドでも構いませんし、パブリッククラウドを借りてビルドしているなら、イメージをWindows PCにダウンロードしてWin32 Disk Imagerなどを使用して書き込んだりしてもよいでしょう。

まとめ

以上、Raspberry Pi zero用のLinuxディストリビューション作成を例にYocto Projectの使い方を紹介しました。何もツールを使わずに1から行うと大変なLinuxのディストリビューション作成もYocto Projectによって簡単に行うことができるようになりました。機会がありましたら、ぜひ、Yocto Projectをお試しください。
次回は、このRaspberry Pi zeroを使用してハードウェアを操作する作例を紹介したいと思います。

rpi0