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と言ったりします)
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でインストールします。
1 2 3 4 5 |
$ sudo apt-get install sed wget subversion git-core coreutils \ unzip texi2html texinfo libsdl1.2-dev docbook-utils fop gawk \ python-pysqlite2 diffstat make gcc build-essential xsltproc \ g++ desktop-file-utils chrpath libgl1-mesa-dev libglu1-mesa-dev \ autoconf automake groff libtool xterm libxml-parser-perl |
注意:ビルド時にdisk容量が多く必要になりますので、50GB程度のdisk容量を確保することをお勧めします。
Yocto本体(poky)をインストール
Yocto本体をgitでインストールします。ブランチを指定しない場合は当然masterが選択されますが、バグ等を含んで動かないといったトラブルに見舞われることが多々ありますので、ブランチを指定してインストールすることをオススメします。Yoctoのメジャーバージョンの名前は、2.3はpyro、2.2はmorty、2.1はkrogothのようになっています。今回は2.3のpyroを使用します。
1 2 3 4 5 6 7 8 9 10 |
$ mkdir rpi0 $ cd rpi0 $ git clone git://git.yoctoproject.org/poky.git -b pyro Cloning into 'poky'... remote: Counting objects: 370298, done. remote: Compressing objects: 100% (88683/88683), done. remote: Total 370298 (delta 275206), reused 370182 (delta 275090) Receiving objects: 100% (370298/370298), 133.99 MiB | 4.43 MiB/s, done. Resolving deltas: 100% (275206/275206), done. Checking connectivity... done. |
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(日本未発売)がサポートされているようです。
1 2 3 4 5 6 7 8 9 |
$ cd poky/ $ git clone git://git.yoctoproject.org/meta-raspberrypi -b pyro Cloning into 'meta-raspberrypi'... remote: Counting objects: 4026, done. remote: Compressing objects: 100% (1870/1870), done. remote: Total 4026 (delta 2026), reused 3865 (delta 1875) Receiving objects: 100% (4026/4026), 1013.95 KiB | 445.00 KiB/s, done. Resolving deltas: 100% (2026/2026), done. Checking connectivity... done. |
これでRaspberry Pi zero向けのLinuxディストリビューションを作成するYocto環境が整いました。
ビルド
build環境作成
build環境の雛形を作ってくれる便利スクリプトoe-init-build-envを実行してビルド環境を作成します。無事に作成し終わるとbuild/ディレクトリへ移動してくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$ source poky/oe-init-build-env You had no conf/local.conf file. This configuration file has therefore been created for you with some default values. You may wish to edit it to, for example, select a different MACHINE (target hardware). See conf/local.conf for more information as common configuration options are commented. You had no conf/bblayers.conf file. This configuration file has therefore been created for you with some default values. To add additional metadata layers into your configuration please add entries to conf/bblayers.conf. The Yocto Project has extensive documentation about OE including a reference manual which can be found at: http://yoctoproject.org/documentation For more information about OpenEmbedded see their website: http://www.openembedded.org/ ### Shell environment set up for builds. ### You can now run 'bitbake <target>' Common targets are: core-image-minimal core-image-sato meta-toolchain meta-ide-support You can also run generated qemu images with a command like 'runqemu qemux86' |
レイヤー追加
build/ディレクトリでRaspberry Pi zeroに必要なレイヤーをbitbake-layersコマンドで指定します。今回は行いませんが、ここで色々なレイヤーを追加することでイメージのカスタマイズができます。
1 |
$ bitbake-layers add-layer ../poky/meta-raspberrypi |
設定ファイル修正
oe-init-build-envスクリプトで作成されたビルド用の設定ファイルconf/local.confにターゲットとなるハードウェア(今回はraspberry pi zero)とビルドに必要なOSSなどがダウンロードされるディレクトリを追記します。(local.confの一番先頭に書いてしまってOKです)
表記法は基本的にMakefileと同様ですが、詳細についてはYoctoのドキュメントをご確認ください。
1 2 3 4 |
$ vi conf/local.conf # 以下を記述 MACHINE ?= "raspberrypi0" DL_DIR ?= "${TOPDIR}/downloads" |
ビルド
bitbakeコマンドでビルドを行います。この処理で必要なOSSなどをダウンロードしたりコンパイルしたりなどを行いますので、ビルドが完了するまでには数時間かかります。(ビルドにかかる時間はCPUやネットワークの帯域など環境によります)
1 |
$ bitbake rpi-basic-image |
昔は現役を引退したノートPCなどに環境を作ってビルドしていたものですが、最近はパブリッククラウドでCPU大盛りのサーバーをお手軽かつ、リーズナブルな金額で借りることができるようになりましたので、ビルドの時間も短縮できるようになりました。(ニフティクラウドのsmallサーバープラン(1CPU/1GBメモリ)では4時間強ですが、wlarge16サーバープラン(8vCPU/16GB)で1時間弱で終わります)
問題なければimageファイルがbuildディレクトリのtmp/deploy配下に作成されます。(イメージサイズは132MBになりました)
1 2 |
$ ls -lh tmp/deploy/images/raspberrypi0/rpi-basic-image-raspberrypi0-20170713002746.rootfs.rpi-sdimg -rw-r--r-- 2 nifty nifty 132M Jul 13 10:11 tmp/deploy/images/raspberrypi0/rpi-basic-image-raspberrypi0-20170713002746.rootfs.rpi-sdimg |
動作テスト
micro SDカードに作成したイメージを書き込み、Raspberry Pi zeroでbootするか確認します。イメージを書き込むツールはddコマンドでも構いませんし、パブリッククラウドを借りてビルドしているなら、イメージをWindows PCにダウンロードして
などを使用して書き込んだりしてもよいでしょう。まとめ
以上、Raspberry Pi zero用のLinuxディストリビューション作成を例にYocto Projectの使い方を紹介しました。何もツールを使わずに1から行うと大変なLinuxのディストリビューション作成もYocto Projectによって簡単に行うことができるようになりました。機会がありましたら、ぜひ、Yocto Projectをお試しください。
次回は、このRaspberry Pi zeroを使用してハードウェアを操作する作例を紹介したいと思います。