Linuxの新定番Yoctoを使ってみよう!

Yoctoとは

Yoctoの紹介

ミリ・マイクロ・ナノと続く単位で一番小さな10-24をヨクトと呼びます。その名を由来にするYocto Projectは、BitBakeというビルドツールとOSSパッケージをビルドするためのレシピを統合し、組み込みLinuxディストリビューションを標準化するために立ち上げられたLinux Foundation傘下のプロジェクトです。

キャッチフレーズは、"Don't Build a Frankenstein OS"で、デバイス毎に継ぎ接ぎして作るのではなく、OSは共通化していこうという想いが込められています。

フランケンシュタインについては、ここのwikiも見てね!

Yoctoを開発しているのは?

この一年でYocto Projectのコードを書いたのは誰か見てみましょう。

ビルドツールであるBitBake、リファレンスディストリビューションとしてレシピを集約したPoky、基本的なOSSパッケージのレシピを集めたOpenEmbedded Core、高信頼性のための機能等のOSSパッケージのレシピを集めたCollection of OpenEmbedded、すべてにおいてIntelと子会社のWind Riverが多くの貢献をしています。全体的にはKernelと同じく、チップベンダーとLinuxディストリビューターが多くの貢献をしていますが、Collection of OpenEmbeddedに富士通がランクインしていることは覚えておいてください(笑)

BitBake
順位 組織 修正パッチの数 全体に占める割合
1 Intel 681 67.1%
2 Linux Foundation 169 16.7%
3 Wind River 25 2.5%
4 Mentor Graphics 22 2.2%
5 Axis Communications 9 0.9%
Poky
順位 組織 修正パッチの数 全体に占める割合
1 Intel 3062 49.7%
2 Wind River 686 11.1%
3 Linux Foundation 525 8.5%
4 Mentor Graphics 101 1.6%
5 Axis Communications 73 1.2%
OpenEmbedded Core
順位 組織 修正パッチの数 全体に占める割合
1 Intel 2245 48.3%
2 Wind River 647 13.9%
3 Linux Foundation 344 7.4%
4 Mentor Graphics 79 1.7%
5 Axis Communications 64 1.4%
Collection of OpenEmbedded (meta-openembedded)
【2015.9.1-2016.8.31の統計】
順位 組織 修正パッチの数 全体に占める割合
1 Wind River 282 17.7%
2 Intel 104 6.5%
3 Fujitsu 71 4.5%
4 Mentor Graphics 40 2.5%
5 O.S. Systems 38 2.4%
【2015.1.1-2015.12.31の統計】
順位 組織 修正パッチの数 全体に占める割合
1 Wind River 309 22.8%
2 Fujitsu 160 11.8%
3 Intel 82 6.0%
4 Mentor Graphics 34 2.5%
5 O.S. Systems 24 1.8%

Yoctoはどんなところで使われている?

チップ ベンダーが提供するLinux SDKの多くは、Yoctoをベースにしています。また、Wind RiverやMentor Graphics等の多くの組み込みシステム向けLinuxディストリビューションもYoctoをベースにしています。

今回使用しているAtlasボードにプリインストールされているAngstromもYoctoをベースにしたディストリビューションです。ちなみに、Angstromは100ピコメートルなので、Yoctoの1014倍ですね(笑)

Yoctoを使ってLinuxシステムをビルド

AtlasボードはすぐにLinuxが使えるようにAngstromがプリインストールされていますが、今回はYoctoの使い方を理解するためにYocto Projectの2016年9月時点の最新リリースである2.1.1をビルドしてみましょう。

ビルドするホストOSはUbuntu 14.04.5を使います。

Ubuntu 14.04をインストールしたら、ビルドに必要なソフトウェアをインストールします。

									$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev xterm make xsltproc docbook-utils fop dblatex xmlto autoconf automake libtool libglib2.0-dev libarchive-dev python-git
								

次に、Yocto Projectをダウンロードします。

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

※ファイアウォールがある場合は、事前にProxyを設定します。

									$ git config --global http.proxy http://ユーザー名:パスワード@Proxyサーバ名:ポート番号
								

Yoctoのバージョンを2.1.1にセットします。

									$ cd poky
									$ git checkout -b yocto-2.1.1 yocto-2.1.1
								

パッケージ管理システムSMARTを最新版にするパッチを適用します。

									https://github.com/ubinux/smart2/tree/master-next/patches-yocto/for_2.1.1
									の下記パッチをダウンロード
									0001-rpm-The-config-file-of-rpm-will-be-installed-into-SD.patch
									0002-python-smartpm-change-smart-to-smart2.patch
									0003-smart2-add-dependences-of-smart2.patch

									ダウンロードしたパッチをあてます。
									$ patch –p1 < 0001-rpm-The-config-file-of-rpm-will-be-installed-into-SD.patch
									$ patch –p1 < 0002-python-smartpm-change-smart-to-smart2.patch
									$ patch –p1 < 0003-smart2-add-dependences-of-smart2.patch
								

ビルドするための初期化をします。

									$ source oe-init-build-env build.armv7
									build.armv7が生成され、 build.armv7に移動していることを確認します。
								

ターゲットの設定をします。

									conf/local.confの38行目を
									MACHINE ??= "qemux86"
									から
									MACHINE ??= "beaglebone"
									に変更します。

									※今回はYoctoでビルドしたカーネルは使わないので、Cyclone V SoCと同じARMv7アーキテクチャーでPokyで標準サポートされているボードに設定します。
								

準備が整いました。いよいよ、ビルドしてみましょう!ダウンロードとビルドに数時間掛かると思うので、待ってられない人は、こちらからクラウド化を検討ください(笑)

OSSパッケージをビルドします。

									$ bitbake core-image-sato
								

toolchain (GCC, Glibc等)をビルドします。

									$ bitbake core-image-sato -c populate_sdk
								

エラーなく終了したら、ビルド完了です。

思ったより簡単にビルドできましたね?もっと詳しく知りたい人は、ここを読んでね!もっともっと詳しく知りたい人は、ここを読んでね!

SMARTを使ってパッケージを管理

SMARTはYocto Projectで採用されているパッケージ管理システムです。Red Hat/CentOS/FedoraのDNFやYum、Debian/Ubuntuのapt-getのYocto版のような位置付けです。今回はオリジナルのSMARTからフォークして改良されたSMART2(https://github.com/ubinux/smart2)を使います。

それでは、YoctoでビルドしたパッケージからSMARTを使ってシステムを構築してみましょう!

...続きは、一度上に戻って動画を見てね!(ブラウザ右下の|^|ボタンを押すと早いよ!)

									$ sudo ./tmp/deploy/sdk/poky-glibc-x86_64-core-image-sato-cortexa8hf-neon-toolchain-2.1.1.sh

									$ . /opt/poky/2.1.1/environment-setup-cortexa8hf-neon-poky-linux-gnueabi
									$ export RPM_USRLIBRPM=/opt/poky/2.1.1/sysroots/cortexa8hf-neon-poky-linux-gnueabi/usr/lib/rpm/
									$ export RPM_ETCRPM=/opt/poky/2.1.1/sysroots/cortexa8hf-neon-poky-linux-gnueabi/etc/rpm
									$ export RPM_LOCALEDIR=/opt/poky/2.1.1/sysroots/cortexa8hf-neon-poky-linux-gnueabi/usr/share/locale

									$ mkdir rootfs
									$ . /opt/poky/2.1.1/sysroots/x86_64-pokysdk-linux/usr/bin/enviroment-smart.sh

									$ smart --rootfs-dir=$PWD/rootfs --interface=tgui