ARM系のEmbedded Linuxボードは大抵Yoctoプロジェクトのビルド・システムを使用しています。今後カーネルやrootfsの一部修正をする可能性があるので、練習のためにYoctoによるビルドを行ってみました。ターゲットはSAMA5D3 Xplainedです。
Yoctoとは
Yoctoプロジェクトは組み込みシステムのためにクロスコンパイラ、カーネル、ブートローダー、rootfsのビルドを行うワークフローを提供するプロジェクトです。対応CPUアーキテクチャはx86, x86-64, ARM, PowerPC, MIPSです。
複数のアーキテクチャへ対応する上にこれらのアーキテクチャそれぞれがCPUのバリエーションを持ち、かつSoCがそれぞれ自由なIOを内蔵していることから、全部の組み合わせを明示的に網羅すると人の手では管理できないものになります。そこで、Yocto(というか、中核となったOpenEmbedded)では、レシピと呼ばれるメタデータを宣言してこれらを組み合わせることにより、少ない重複で非常に広い範囲のシステムに対応しています。
レシピはYoctoプロジェクトとOpenEmbeddedプロジェクト自身から提供される他、サードパーティからも提供されます。例えばSAMDA5D3 Xplainedのレシピは、2015年9月現在AtmelのNicolas Ferre氏によってlinux4sam / meta-atmel で管理されています。
ビルド環境
小手試しにYoctoを利用してクロスコンパイラ(SDK)、カーネル、ブートローダー、rootfsをビルドしてみました。ビルド・マシンはVMware Workstation上のUbuntuです。
- 仮想CPU 2コア
- 2GBメモリ
- Ubuntu 14.04 LTS 32bit
- 100GB 仮想ディスク
ディスク容量ですが、ビルドが全部終わったときはOS含めて30GBほど占有していました。100GB有った方がいいと思いますが、50GBでも何とかなるかも知れません。
ビルド・システムであるbitbakeは、CPUのコア数を調べて自動的に同時に走るタスク数を決めます。私の物理CPUはIntel Core-i3 2cores 4threadsなので、リソースをVMに食い尽くされないようVMのコア数は2コアとしました。
最後に、下準備としてubuntu上で以下のコマンドを実行し、ビルドのためのツールをそろえておきます。
sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \ build-essential chrpath socat libsdl1.2-dev xterm
レシピの準備
ここから下の作業は、原則としてlinux4sam / meta-atmel ( branch : fido )の説明に沿ったものです(当初masterを紹介していましたが、安定しないので少し古いfidoに)。
まず、次のコマンド群を実行します(コピーしてシェルにペーストできます)。
mkdir yocto
cd yoctogit clone git://git.yoctoproject.org/poky -b fido
git clone git://git.openembedded.org/meta-openembedded -b fido
git clone git://github.com/meta-qt5/meta-qt5.git -b fido
git clone git://github.com/linux4sam/meta-atmel.git -b fidocd poky
このコマンド群はローカル・ディスクにyocto関連のレポジトリを展開します。一部のレポジトリはYoctoのツールおよび公式レシピ群であり、他のレポジトリはAtmelその他が用意したSAMA5D3 Xplained用のレシピ群です。上のスクリプトが実行されると全てのデータがディスク上に用意されます。
なお、以上の作業の後に、yocto/poky/meta-atmel/recipes-qt/qt4を削除しました。どういうわけかこのディレクトリがあるとあとで説明するビルドが失敗します。私の場合、qtを使う予定が無いのでqt4を削除してビルドを続けました。
ターゲットの設定
レシピの準備ができたら、ビルド前の設定を行います。最初にyocto/pokyディレクトリでoe-init-build-envを実行します。引数は新しく作るビルド用のディレクトリ名です。
source oe-init-build-env build-atmel
名前の通り、このスクリプトはビルド環境の初期化を行います。ここで環境の初期化とは
- ディレクトリと設定ファイルの準備
- 環境変数の設定
です。
ディレクトリと設定ファイルの準備はそれらが無いときにだけ行われますので、このスクリプトは何度実行しても修正した設定ファイルを破壊しません。いいかえると、設定ファイルを作るのは最初の一回だけです。正常に動作が終わると、ビルド用ディレクトリの中に移動します。
次に、レシピのレイヤーを修正します。
nano conf/bblayers.conf
Yoctoプロジェクトではレシピをレイヤーとして管理しています。あるいはレシピを優先順位に従って処理していると言ってもいいかもしれません。このレイヤー構造をSAMA5D3用にするために、conf/bblayers.confの内容を以下のテキストで置き換えます。これでビルド・システムが参照するレシピにatmelが用意したレシピが挟み込まれます。
# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatiblyLCONF_VERSION = "6"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BSPDIR := ${@os.path.abspath(os.path.dirname(d.getVar(‘FILE’, True)) + ‘/../../..’)}
BBLAYERS ?= " \
${BSPDIR}/meta-atmel \${BSPDIR}/meta-qt5 \
${BSPDIR}/poky/meta \
${BSPDIR}/poky/meta-yocto \
${BSPDIR}/poky/meta-yocto-bsp \
${BSPDIR}/meta-openembedded/meta-oe \
${BSPDIR}/meta-openembedded/meta-networking \
${BSPDIR}/meta-openembedded/meta-python \
${BSPDIR}/meta-openembedded/meta-ruby \
${BSPDIR}/meta-openembedded/meta-multimedia \
"
レイヤーの設定が終わったら、conf/bblayers.confを保存してエディタを終了してください。次にビルド対象の設定をおこないます。
nano conf/local.conf
最初にターゲットマシンの名前を指定します。何もしないと最初はx86がターゲットになっていますので必ず修正します。
MACHINE ??= "sama5d3-xplained"
次にパッケージの型を指定します。これはターゲットのrootfs用に用意するモジュールのパッケージ方法です。yoctoではrpmのほうが良いという論議がされていますが、linux4sam / meta-atmelでは、ipkを使うよう指示されています。実際にはこれはどちらでもビルドは成功します。ipkを使うのは、あとからマシンに書き込む際に占有メモリが少ないからでしょう。SAMA5D3 Xplainedは256MBしかNANDを持っていませんので、なるべくディスク容量を抑える工夫だと思われます。
PACKAGE_CLASSES ?= "package_ipk"
さらに、ディストリビューションを変更します。
DISTRO = "poky-atmel"
このほか、linux4sam / meta-atmelではダウンロード・ディレクトリも指定するよう指示がありますが、無視して結構です。
以上の作業が終わったらconf/local.confを保存してエディタを終了してください。
ビルド
ビルドに掛かる時間ですが、カーネル、ブートローダー、rootfsの生成に数時間。SDK生成に2,3時間といったところでした。
以下のコマンドを実行することで、カーネル、ブートローダー、rootfsを生成することが出来ます。
bitbake core-image-minimal
bitbakeはyoctoプロジェクトのビルドツールです。ツールが見つからないと言うエラーが出たら、yoctディレクトリでもう一度以下のコマンドを実行してください。
source oe-init-build-env build-atmel
これで検索パスが設定され、bitbakeが見つかるはずです。
また、次のコマンドを実行するとsdkが生成されます。
bitbake meta-toolchain
以上で作業は終了です。
追記
この投稿をアップロードした後、bitbakeのターゲットはcore-image-minimalではなくatmel-demo-imageをつかうようになりました。
bitbake atmel-demo-image
core-image-minimalはUSB-Aポート経由で/dev/ttyACMxが使えず不便だったからです。ビルド時間はかなり多くなり、ビルド後のディスク消費量はUbuntu 14.04 LTS本体を含め57GBになりました。
参考リソース
- Yocto Project を使用して組み込み用のカスタム Linux ディストリビューションを作成する : IBM DeveloperWorksによる解説。例示されている内容は古いですが、概要の理解には十分です。
- linux4sam / meta-atmel : Yoctoプロジェクト用のAtmelメタデータのリポジトリ。Yoctによるビルド手順はここを参考にするといいでしょう。
- Yocto Project : プロジェクト・ページ
- Yoct Poroject Quick Start : Yoctoプロジェクトの概要の紹介。簡単なビルド方法の説明。
- OpenEmbedded : Yoctoのベースとなったクロス・コンパイラ環境の提供ページ