Yocto Project を使用して組み込み用のカスタム Linux ディストリビューションを作成する

専門家向けの組み込み Linux 開発用オープンソース・ツール

組み込み Linux 開発を容易に行い、さまざまなアーキテクチャー間で移植できるようにすることを目標に発足したオープンソース・プロジェクトが Yocto Project です。この記事では Yocto Project について紹介し、このプロジェクトを利用する方法について順を追って説明します。

Jeffrey M. Osier-Mixon, Yocto Project Community Manager, Intel Corporation

Author photo - Jeffrey Osier-MixonJeff "Jefro" Osier-Mixon は、テクニカル・ライター、開発者、開発者の擁護者、コミュニティー・マネージャーとして、オープンソース・システムや組み込みシステムに 20 年以上携わっており、IBM developerWorks に「Booting Linux on the BeagleBoard-xM」、「Open hardware: How and why it works」など何本かの記事を寄稿しています。彼は現在 Intel で Yocto Project のコミュニティー・マネージャーを務めています。また彼のブログでオープンソース関係のカンファレンスのカレンダーを管理しています。



2012年 9月 27日

概要

Yocto Project はオープンソースのコラボレーション・プロジェクトであり、組み込み製品のための Linux ベースのカスタム・システムをハードウェア・アーキテクチャーに関わらず構築するための、テンプレート、ツール、手段を提供しています。プロジェクトの名前の由来を知らない人のために説明すると、yocto は国際単位系 (SI) の最小単位であり、接頭辞としての yocto は 10^-24 を表します。

この記事では Yocto Project による業界標準のオープンソース・ツールの使い方について、順を追って説明します。具体的には、組み込み機器用にカスタマイズした Linux オペレーティング・システムを作成する方法について、また QEMU を使用する仮想マシンでそのオペレーティング・システムをブートする方法について説明します。Yocto Project は Linux Foundation が後援するオープンソース・プロジェクトであり、主要なハードウェア企業やオペレーティング・システム・ベンダーの資金提供を受け、Linux システムを構築するための産業レベルのツール、手段、メタデータを提供しています。

Yocto Project には、OpenEmbedded プロジェクトと連携して保守を行っている主要なコンポーネントが 2 つあります。その 1 つはビルド・エンジンである BitBake、もう 1 つはビルド・プロセスの実行に使用される中核的なレシピ・セットの OpenEmbedded-Core です。次のセクションでは、Yocto Project のすべてのコンポーネントについて説明します。

Yocto Project の紹介

コラボレーション・プロジェクト (「アンブレラ」プロジェクトと呼ばれることもあります) である Yocto Project には、開発プロセスを構成する数多くのまったく異なるさまざまな要素が含まれています。これらの要素は全体としての Yocto Project の中では「プロジェクト」と呼ばれ、ビルド・ツール、ビルド命令のメタデータ (「レシピ」と呼ばれます)、ライブラリー、ユーティリティー、GUI (Graphical User Interface) などがあります。

Poky

Poky は Yocto Project のリファレンス・ビルド・システムです。Poky には、BitBake、OpenEmbedded-Core、BSP (Board Support Package) に加え、ビルドに組み込まれる他のあらゆるパッケージやレイヤーが含まれています。また Poky という名前は、このリファレンス・ビルド・システムを使用してビルドされたデフォルトの Linux ディストリビューションのことも指しています。このディストリビューションは最小限のシステム (core-image-minimal) の場合もあれば、GUI を備えた完全な Linux システム (core-image-sato) の場合もあります。

Poky ビルド・システムは Yocto Project 全体のリファレンス・システム、つまりこのプロジェクトのプロセスの実例として考えることができます。Yocto Project をダウンロードする場合、実際には、ここで説明しているようにデフォルト・システムのビルドに使用できるツール、ユーティリティー、ライブラリー、ツールチェーン、メタデータといったもののインスタンスをダウンロードしています。このリファレンス・システムも、そのリファレンス・システムによって作成されるリファレンス・ディストリビューションも、名前は Poky です。このディストリビューションを基に独自のディストリビューションを作成することもでき、そのディストリビューションには当然ながら好きな名前をつけることができます。

どのビルド・システムにも必要なものがツールチェーンです。ツールチェーンは指定のアーキテクチャー用にバイナリー実行ファイルを作成するために必要なコンパイラー、アセンブラー、リンカー、その他のバイナリー・ユーティリティーです。Poky は GCC (GNU Compiler Collection) を使用しますが、他のツールチェーンを指定することもできます。Poky はクロスコンパイルとして知られる手法を使用します。つまり、あるアーキテクチャー上のツールチェーンを使用して、別のアーキテクチャー用のバイナリー実行ファイルをビルドします (例えば x86 ベースのシステムで ARM 用のディストリビューションをビルドするなど)。組み込みシステムの開発には、ホスト・システムが有する高いパフォーマンスを活用するためにクロスコンパイルが使用されることがよくあります。

メタデータ・セット

メタデータ・セットはレイヤー構造で提供され、各レイヤーが個別の機能を下位レイヤーに提供できるようになっています。ベース・レイヤーは OpenEmbedded-Core (oe-core) であり、このレイヤーはすべてのビルドに共通で必要なレシピ、クラス、関連の関数を提供します。つまり、oe-core の上に新しいレイヤーを追加することによってビルドをカスタマイズすることができます。

OpenEmbedded-Core は Yocto Project と OpenEmbedded プロジェクトによって共同で保守が行われています。OpenEmbedded から Yocto Project を隔離するレイヤーの 1 つが meta-yocto レイヤーです。このレイヤーは Poky ディストリビューションの構成とリファレンス BSP のコアセットを提供します。

OpenEmbedded プロジェクト自体は個別のオープンソース・プロジェクトであり、Yocto Project と (ほぼ) 交換可能なレシピを持ち、目標も似ていますが、ガバナンスやスコープは異なります。

BSP (Board Support Package)

BSP には、特定のボード (つまり特定のアーキテクチャー) 向けに Linux をビルドする上で必要な必須パッケージとドライバーが含まれています。これらは多くの場合、ボードを製造するハードウェア・メーカーによって保守が行われています。BSP は、ハードウェアとその上で動作する Linux オペレーティング・システムとの間のインターフェースです。仮想マシン用の BSP も作成できることに注意してください。

BitBake

BitBake はビルド・エンジンとして、レシピを読み取り、レシピに従ってパッケージを取得してビルドし、その結果をブート可能なイメージにします。BitBake は Yocto Project と OpenEmbedded プロジェクトによって共同で保守が行われています。

Hob

組み込み Linux の開発を容易にするために、Yocto Project には GUI で作業を行うための手段がいくつか用意されています。Yocto Project に比較的最近追加されたものが Hob です。Hob は BitBake とビルド・プロセスに対するグラフィカル・フロントエンドとして機能します。BitBake も Hob も開発が続けられており、コミュニティーのユーザーによる研究も行われています。

オープンソース・ライセンスへの準拠

Linux に関するどのような開発を行う場合にも、オープンソース・ライセンスに準拠することは非常に重要です。Yocto Project の目標の 1 つは、可能な限り容易にライセンスに準拠できるようにすることです。Yocto Project のツールを使用すると、マニフェストを作成すること、さらにはソース・リポジトリー全体をビルドすること、そしてビルド・プロセスをフィルタリングし、特定のライセンスを使用するパッケージを除外することなどが非常に容易に行えるようになります。Yocto Project は SPDX (Software Package Data Exchange) 仕様に関して Linux Foundation の Open Compliance Program (オープン コンプライアンス プログラム) と連携しています。

EGLIBC

EGLIBC (Embedded GLIBC) は GLIBC (GNU C Library) のバリエーションであり、組み込みシステムに適した動作をするように設計されています。EGLIBC の目標には、フットプリントの削減、コンポーネントを構成可能にすること、クロスコンパイルやクロステストを十分にサポートすることなどがあります。EGLIBC は Yocto Project の傘下にありますが、その保守は独自のガバナンス構造の中で行われています。

アプリケーション開発ツールキット (ADT)

アプリケーション開発ツールキット (Application Development Toolkit: ADT) を使用すると、システム開発者は Yocto Project のツールを使用して作成したディストリビューションの SDK (Software Development Kit) を提供することができるため、アプリケーション開発者はそれを利用して、システム開発者が提供するソフトウェア・スタックを対象にした開発を行えるようになります。ADT には、クロスコンパイル・ツールチェーン、デバッグ・ツールやプロファイリング・ツール、そして QEMU エミュレーション・スクリプトやサポート・スクリプトなどが含まれています。また ADT には、IDE (Integrated Development Environment: 統合開発環境) で作業を行いたい人のための Eclipse プラグインも含まれています。

Yocto Project 傘下の他のツール

他にも Yocto Project の名の下で開発されているツールとして以下のようなものがあります。

  • Autobuilder: Yocto Project のツールの自動ビルドを継続的に作成し、自動 QA (Quality Assurance) アクティビティーを実現します。
  • Cross-Prelink: クロスコンパイル開発環境のためのプリリンクを提供し、パフォーマンスを改善します。
  • Pseudo: ブート可能な最終イメージをビルドするために不可欠な、ルート・アクセスをエミュレートします。
  • Swabber: ホスト・コンポーネントによってクロスコンパイルのビルドに問題が発生した場合、その問題を検出します。
  • Build Appliance: Hob を実行する仮想マシンであり、Linux 以外のビルド・ホストを使用する場合に Yocto Project のプロセスを直接表示できるようにします (注: Yocto Project のビルド・ツールは現在、Linux でしかサポートされていません)。

ガバナンスとコミュニティー

あらゆるオープンソース・プロジェクトに不可欠な要素の 1 つが、そのプロジェクトのコンポーネントを開発、サポートするコミュニティーです。Yocto Project の活発なコミュニティーには組織も参加しており、ハードウェア・メーカー、オペレーティング・システムやツールのプロバイダー、電子機器メーカーなど、組み込み開発のあらゆる分野の組織がカバーされています。またコミュニティーに参加している個人の多くは、これらの組織で働く人々です。

このプロジェクトを管理しているのは、1 人のチーフ・アーキテクトと、メンテナーや技術リーダーたちであり、彼らがすべての技術的決定を下します。メンバー組織の多くは通常は互いに競争していますが、このプロジェクトではコラボレーションによって、Advisory Board を構成しています。Advisory Board の役割は、名前からもわかるように、実質的には助言を与えることです。Advisory Board は、プロジェクトのリソース (インフラストラクチャーを含む)、支援活動や奉仕活動、資金などを管理しています。


Linux ディストリビューションをビルドする

このセクションでは、リファレンス・ビルド・システムである Poky を使用して、基本的な組み込み Linux システムをビルドする方法について説明します。ここで説明するプロセスではリファレンス・ディストリビューションをビルドしますが、そのディストリビューションのビルドに必要なすべてのツールもビルドします。お望みであれば、コンパイルをしなくても済むように、ビルド済みのバイナリーをダウンロードすることもできます。詳細については『The Yocto Project Quick Start』を参照してください (「参考文献」を参照)。

これらのツール自体は Linux プラットフォームでしかサポートされていません (具体的には Ubuntu、Fedora、CentOS、openSUSE)。注意する点として、これらの各システムの最新リリースはサポート対象に含まれていない場合がよくありますが、実際には動作することが多く、また他の多くの Linux ディストリビューションでも動作する可能性があります。

ホスト・システムが Linux を実行していない場合や、何も本格的にインストールせず、試してみたいだけの場合には、Yocto Project Build Appliance をダウンロードすることができます。この仮想マシンには Yocto Project の最新公式リリースがプリインストールされています。Build Appliance は VMWare Player または VirtualBox 内で実行することができ、ブートすると直接 Hob GUI が表示されます。Build Appliance を使用すると、以下に説明するステップの大半は既に完了しており、途中を飛ばして「Hob を試す」に進むこともできますが、Hob が何をしているのか理解できるように、やはり途中のセクションを読むことをお勧めします。また、Yocto Project の Web サイトで Hob のドキュメントがある場所については「参考文献」を参照してください。

Yocto Project のツールをダウンロードする

以下の 2 つの方法のいずれかで Yocto Project のツールをダウンロードします。必ず、少なくとも 50GB の空き容量があるディスクを使うようにしてください。推奨される空き容量は 100GB です。

  • 完全にテストされた最新リリースを含む tar ファイルを Yocto Project のダウンロード・ページからダウンロードすることができます。その tar ファイルをダウンロードしてディレクトリーに解凍します (リスト 1)。
    リスト 1. poky をダウンロードする
    $ wget \
    http://downloads.yoctoproject.org/releases/yocto/yocto-1.2/poky-denzil-7.0.tar.bz2
    $ tar xjf poky-denzil-7.0.tar.bz2
    $ cd poky-denzil-7.0
  • git を使用して最新リリース (または任意のブランチ) を取得することもできます。ただし、開発のマスター・ブランチは tar ファイルとしてまとめられたテスト済みのリリースほど安定してはないかもしれません。リスト 2git を使用して最新リリースをダウンロードする方法を示しています。
    リスト 2. git を使用して poky を取得する
    $ git clone git://git.yoctoproject.org/poky.git
    $ cd poky

    この場合、pokygit を使用して随時更新できるため、サブディレクトリーの名前は、リリース番号のない単なる poky であることに注意してください。

環境を初期化する

以下の手順で動作環境を初期化します。

  1. まず、ホスト・システムのソフトウェア・リポジトリーから、必要な開発パッケージをすべてインストールします。ホスト上で既にソフトウェアを開発している場合には、これらのパッケージのほとんどが既にインストール済みかもしれません。リスト 3456 は、さまざまなディストリビューションで必要なパッケージのインストール方法です。

    リスト 3. Ubuntu で必要なパッケージのインストール
         $ 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
    リスト 4. Fedora で必要なパッケージのインストール
         $ sudo yum groupinstall "development tools"
         $ sudo yum install python m4 make wget curl ftp tar bzip2 gzip \
         unzip perl texinfo texi2html diffstat openjade \
         docbook-style-dsssl sed docbook-style-xsl docbook-dtds fop xsltproc \
         docbook-utils sed bc eglibc-devel ccache pcre pcre-devel quilt \
         groff linuxdoc-tools patch cmake \
         perl-ExtUtils-MakeMaker tcl-devel gettext chrpath ncurses apr \
         SDL-devel mesa-libGL-devel mesa-libGLU-devel gnome-doc-utils \
         autoconf automake libtool xterm
    リスト 5. CentOS で必要なパッケージのインストール
         $ sudo yum -y groupinstall "development tools"
         $ sudo yum -y install tetex gawk sqlite-devel vim-common redhat-lsb xz \
           m4 make wget curl ftp tar bzip2 gzip python-devel \
           unzip perl texinfo texi2html diffstat openjade zlib-devel \
           docbook-style-dsssl sed docbook-style-xsl docbook-dtds \
           docbook-utils bc glibc-devel pcre pcre-devel \
           groff linuxdoc-tools patch cmake \
           tcl-devel gettext ncurses apr \
           SDL-devel mesa-libGL-devel mesa-libGLU-devel gnome-doc-utils \
           autoconf automake libtool xterm
    リスト 6. openSUSE で必要なパッケージのインストール
         $ sudo zypper install python gcc gcc-c++ libtool fop \
         subversion git chrpath automake make wget xsltproc \
         diffstat texinfo freeglut-devel libSDL-devel
  2. パッケージに提供されているスクリプトを使用してシェルの環境変数を設定します。このスクリプトを実行すると、作業ディレクトリーは build サブディレクトリーとなり、このサブディレクトリーからビルドを実行することができます。

    $ cd poky 
    $ . ./oe-init-build-env
  3. メインの構成ファイル (conf/local.conf) を調べます。デフォルトで、この構成ファイルは qemux86 (つまり 32 ビットの x86 プロセッサーをエミュレートする QEMU インスタンス) のイメージを作成するように設定されています。マルチプロセッサー・ホストの場合には、以下の並列処理オプションをコメントでないようにし、ビルドを高速化することを強くお勧めします。ここではとりあえず、この 2 つの値を両方ともプロセッサーのコア数の 2 倍に設定します (例えば 4 コア・プロセッサーの場合は 8)。

    BB_NUMBER_THREADS = "8"
    PARALLEL_MAKE = "-j 8"

初期ビルドを実行する

初期ビルドにはホストのコンパイラーを使用し、クロスコンパイル・ツールチェーンと、他に必要なビルド・ツールをビルドします。BitBake もすべてのソフトウェア・パッケージをダウンロードする必要があるため、少し時間がかかる場合があります。ビルドが完了すると、tmp/deploy/images サブディレクトリーの中にイメージ・ファイルが見つかるはずです。

リスト 7. 初期ビルドによって作成されたイメージ
$ ls tmp/deploy/images
bzImage-3.2.11+gi...1.bin
bzImage-qemux86.bin
core-image-minimal-qemux86-20120506194741.rootfs.ext3
core-image-minimal-qemux86-20120506194741.rootfs.tar.bz2
core-image-minimal-qemux86.ext3
core-image-minimal-qemux86.tar.bz2
modules-3.2.11-yocto-standard-r1-qemux86.tgz
README_-_DO_NOT_DELETE_FILES_IN_THIS_DIRECTORY.txt

また、tmp/deploy/IMAGE/license.manifest も調べてください。ここには、このイメージ全体で使用されているすべてのライセンスのリストが含まれています。

新しいイメージをブートする

ビルドが完了したら、32 ビットの x86 マシンをエミュレートする QEMU を使用して、そのイメージをブートすることができます。そのためには、単純に以下のコマンドを実行します。

$ runqemu qemux86

ユーザー名 root、パスワードなしでマシンにログインすることができます。おめでとうございます!これで、組み込み Linux ディストリビューションをビルドすることができました。

最終イメージや、最終イメージを構成するパッケージ、さらにはビルド・プロセスそのものに対しては、いくらでもカスタマイズすることができます。このビルド・システムは Python で作成されており、ドキュメントも整備されています。

Hob を試す

Hob は、ここまでに説明したプロセスの一部を自動化するのを支援する GUI です。Hob の目標は、ビルド・プロセスを可視化し、理解しやすくすることです。実際には、Hob は BitBake のフロントエンドであり、コマンドラインから実行できないこと (そしてスクリプト化できないこと) は Hob でも実行することはできません。ただし、Hob は意志決定プロセスをグラフィカルに表示することができ、また最終的なイメージの中に組み込まれるのが正確にどのパッケージなのか、その概要を示すことができます。Hob には他にも、既存のイメージを変更する機能、カスタマイズしたイメージをテンプレートとして保存する機能、QEMU を使用してイメージを実行する機能、USB (Universal Serial Bus) ディスクにイメージをデプロイしてターゲット機器上でライブ・ブートする機能などがあります。他にも、機能面とユーザビリティー面で多くの機能が検討されています。

Hob を実行するためには、単純にビルド・ディレクトリーから「hob」と入力します。するとメイン画面が表示されます。最初にアーキテクチャーを選択します (この場合は qemux86)。すると Hob は利用可能なレシピを構文解析します。その様子を図 1 に示します。

図 1. Hob の「Image configuration (イメージ構成)」画面
「Image configuration (イメージ構成)」を実行中の画面のスクリーン・キャプチャー

次に、ベース・イメージを選択します (先ほどの例で core-image-minimal をビルドしたため、これらのバイナリーは既に存在しています)。「core-image-minimal」を選択し、「View recipes (レシピを表示)」または「View packages (パッケージを表示)」をクリックします。図 2 の画面は「View packages (パッケージを表示)」のスクロール・リストを示しています。チェックボックスを選択またはクリアすると、ビルドにパッケージを含めたり、ビルドからパッケージを削除したりすることができます。また、列ヘッダーをクリックすると、その列でソートすることができます。

図 2. Hob の「Packages (パッケージ)」画面
Hob でパッケージを選択する画面のスクリーン・キャプチャー

「Packages (パッケージ)」タブでは、最小ビルドに Python が含まれていないことに注意してください。図 3 のように python-2.7.2-r2.14 のチェックボックスを選択するだけで、Python を追加することができます。依存関係やサブパッケージもすべて即座に含めることができます。

図 3. Hob でパッケージを追加する
Hob でパッケージを追加する画面のスクリーン・キャプチャー

Build image (イメージをビルド)」をクリックし、皆さんが選択した新しいイメージを Hob がビルドする様子を見てください。ビルドが進むのに伴い、ログを見ることで進行状況を確認することや、「Issues (問題)」タブをクリックして問題が発生していないかどうかを確認することができます。

ビルドが完了したら、図 4 のように「Run Image (イメージを実行)」をクリックするだけで、ビルドされたイメージを QEMU エミュレーターで実行することができます。

図 4. Hob の「Image details (イメージの詳細)」画面
Hob でイメージの詳細を表示した画面のスクリーン・キャプチャー

これで、図 5 のように Python が実際にビルドに含まれているかどうかを確認することができます。

図 5. Python が追加されたかどうかを確認する
コンソールに Python プロンプトが表示され、入力できる状態になっていることを示す画面のスクリーン・キャプチャー

Yocto Project の Web サイトには、詳細な情報、チュートリアル、動画が用意されています (「参考文献」を参照)。


まとめ

Yocto Project のツールの効果的な使い方を習得するには少し時間がかかりますが、それだけの価値があります。これらのツールはワークフローが柔軟で構成が移植可能であり、また構成の自由度が高いため、ビルド・プロセスのあらゆるレベルでカスタマイズすることができます。Yocto Project は商用のワークフローが考慮されており、専門の組み込みシステム開発者によって設計、実装されています。この記事の執筆時点で、オペレーティング・システム・ツールの作成会社が数社、彼らの製品のベースとして Yocto Project を検討しています。皆さんも実際に Yocto Project ツールを試し、その成果に満足できたら、ぜひコミュニティーに参加してください。

参考文献

学ぶために

製品や技術を入手するために

  • Yocto Project の Web サイトには、Yocto Project の公式ドキュメント、詳細な説明、動画、カンファレンスのスライドや議事録、ガバナンス情報などが用意されています。
  • Yocto Project Build Appliance は何もソフトウェアをインストールせずに Yocto Project の実際を理解するための適切な方法です。
  • EGLIBC は GLIBC (GNU C Library) のバリエーションであり、組み込みシステムに使いやすいように設計されています。EGLIBC は Yocto Project の一部です。
  • 皆さんに最適な方法で IBM 製品を評価してください。製品の試用版をダウンロードする方法、オンラインで製品を試す方法、クラウド環境で製品を使う方法、あるいは SOA Sandbox で数時間を費やし、サービス指向アーキテクチャーの効率的な実装方法を学ぶ方法などがあります。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=836364
ArticleTitle=Yocto Project を使用して組み込み用のカスタム Linux ディストリビューションを作成する
publish-date=09272012