2023年12月22日金曜日

「pcDuino3」でYocto Project その5

前回からの続きです。

このテーマを最初からご覧になる場合はこちらからどうぞ。


「Yocto Project」におけるレシピとは?

「Yocto Project」を使う上で、絶対に避けて通れないのが「レシピ」という概念です。

レシピって聞いて、皆さん何を思い浮かべるでしょうか?

そう、お料理のレシピですよね。


はい、これでもう「Yocto Project」のレシピは理解できたも同然です!


例えば、今晩の夕食はカレーライスにしようと思います。

カレーライス


まず「ご飯」のレシピを想像してみましょう。

「ご飯」を炊くためには、まず、お米が必要です。

お米は、何処で買いましょう?

どうやって、どのくらい研ぎましょうか?

炊飯器にどのくらいの水を入れましょうか?

どのくらいの時間蒸らしましょうか?

…などなど、細かく書くと意外と複雑ですよね。

次に「カレールー」のレシピです。

これは「ご飯」よりも、もっと複雑です。

何処産のターメリックをどれくらい使いましょうか?

何処産のカルダモンをどれくらい使いましょうか?

何処産のシナモンをどれくらい使いましょうか?

何処産のコリアンダーをどれくらい使いましょうか?

辛さは?

…こりゃキリがないですね。

他にも「野菜」や「お肉」の調理方法が書いてあるレシピが、カレーライスを作るためには必要です。


これを「Yocto Project」でLinuxディストリビューションを作る場合に置き換えてみます。

まず「Linuxカーネル」のレシピがあります。

「Linuxカーネル」をビルドするには、ソースコードが必要です。

ソースコードは、どこからダウンロードしましょう?

どのアーキテクチャでビルドしましょうか?

どういったオプションでビルドしましょうか?

どのようなモジュールを追加しましょうか?

…などなど「ご飯」の時と似てますよね。

他にも「ブートローダー」や「BusyBox」など、Linuxが動作するために必要な部材のレシピが存在します。

前回「git clone」して生成された「poky」というディレクトリの中には、これらのレシピがたくさん入っています。

料理のレシピは、紙のメモ等かもしれませんが、そこはLinuxなので「Yocto Project」のレシピはテキストファイル形式で存在しています。

拡張子は「.bb」です。

以下の通り「poky」ディレクトリの下層、たとえば「~/poky/meta/recipes-kernel/」ディレクトリの中には、たくさんのソフトウェアごとのディレクトリがあって…

「poky」ディレクトリの下層 - 1


その中に、それぞれの「.bb」ファイルが存在するのを確認できますね。

「poky」ディレクトリの下層 - 2


興味のある方は、レシピがどういう風に書かれているか、見てみるのも良いかもしれません。

(但し、訳が分かんなくてもヘコタレナイこと!)


「bitbake」コマンドとは?

さて、カレーライスの場合は、私たち自身がレシピを読みながら料理をしなければなりません。

では、Linuxディストリビューションの場合は?

それを行うのが、ビストロ「Yocto Project」の料理長「bitbake」コマンドさんだったのです。

前回、以下のようなコマンドを打ちましたよね?

終わるまでに5時間くらい掛かった例のヤツ。


$ bitbake core-image-minimal


これは、料理長「bitbake」さんに「core-image-minimal」というお料理を注文したことになります。

「bitbake」さん、料理長なのにお客さんの注文取ったり、色々大変なので「グズグズすんな」とか「トロトロしてんじゃねー」とか「ぁくしろよ!」とか言っちゃダメ。

でもって「core-image-minimal」の注文を受けた「bitbake」料理長、厨房に戻ると「core-image-minimal」に必要な食材を買い出しに行きます。

…え、今からかいっ!?

まあ、そういったツッコミは、例え話なんでご勘弁を。

たくさんのレシピに書かれている部材をすべて買い揃えた「bitbake」料理長、厨房に戻って、これまたレシピ通りに各食材を調理していきます。

こうして「bitbake」料理長の大車輪の活躍で出来上がったのが「core-image-minimal」というお料理、すなわち、Linuxディストリビューションとなります。


「Yocto Project」におけるレイヤーとは?

コスプレする人のことじゃないです。

「Yocto Project」には、レシピの他、もう一つ重要な概念「レイヤー」というものがあります。

前回ビルドした「core-image-minimal」は、いわばプレーンなカレーライス、学食の300円のカレーみたいなもんで、なんのヒネリもないシンプルなものです。

(今思うと、アレはアレで美味しかったなぁ。)

これをグレードアップして、カツカレーライスにしたいと思います。

しかし、カツカレーライスを作るためには、ベースのプレーンなカレーライスのレシピに加えて、上に乗せるカツのレシピも必要になります。

カツも一から作るとなれば、結構大変です。

お肉は何処で買えば良いのか?

油の量や温度はどうするのか?

...などなど。

カレーライスとは別の料理として、複数のレシピが必要になりそうです。

これを「Yocto Project」風に言えば、カレーライスの上に、カツのレシピが含まれた、カツの「レイヤーを加える」必要があるわけです。

おまけに、このカツカレーライスに福神漬をトッピングしちゃった日にゃ、ダイコンやらレンコンやら、それらの味付けやらで、複数のレシピが含まれた福神漬の「レイヤーを加える」ことになります。

すなわち、レイヤーとは、ある要素を一纏めにしたレシピの集合体と言えます。

前回作った「core-image-minimal」が、プレーンなカレーライス。

今後、この記事で作ろうとする「pcDuino3」向けの「core-image-minimal」が、カツカレーライス。

このように例えるなら「pcDuino3」向けのLinuxディストリビューションは、前回作った「core-image-minimal」に「レイヤーを加える」ことによって作成することになります。

レイヤーは原則として「meta-xxx」というディレクトリ名が付けられます。

このディレクトリの中に、関連するレシピ、すなわち「.bb」ファイルがたくさん配置されています。

(「.bb」ファイル以外のものもありますが、それは今は気にしないで。)

ディレクトリを配置しただけではダメです。

レイヤーの場所を教えてあげないと「bitbake」料理長、その中のレシピが見れなくて困っちゃう。

それをやっているのが以下のパスの「bblayers.conf」ファイルです。


/home/yocto/poky/build/conf/bblayers.conf

「bblayers.conf」のあるディレクトリ


この「bblayers.conf」ファイル、中身はこんな感じのテキストです。

「bblayers.conf」の内容

これを見ると、なにやら「BBLAYERS」という変数に、パスのリストを代入しているように見えます。

この代入により「meta」と「meta-poky」と「meta-yocto-bsp」の3つレイヤーが登録されていることになります。

わずか3つ!

すなわち、前回作った「core-image-minimal」は、非常に少ないレイヤーで構成されていたことが分かります。

そりゃ学食の300円カレーだもの…。


「meta-sunxi」レイヤー

さて「pcDuino3」用のLinuxディストリビューションを作るために必要なレイヤーを手に入れなければなりません。

ところで「pcDuino3」のような名の通ったボードでLinuxを動かすために、白紙の状態から独自のレシピを書いてレイヤーを作ることは、まず無いと思います。

そういったものは、大概はコミュニティの方々が既に開発して、公開している上にメンテナンスまでやってくれています。

本当にありがたいですよね。

お仕事で独自のLinuxボードを作って、それにLinuxを動かす場合でも、使用したCPUのベンダーが必要なレシピやレイヤーを提供していることがほとんどで、最小限のカスタマイズで移植可能です。

では「pcDuino3」に必要なレイヤーがどこにあるか?

結論から言うと、まず以下の「meta-sunxi」レイヤーのページを御覧ください。

このページは「Yocto Project」の元となった、組み込み機器用のLinuxディストリビューションを作るためのソフトウェアフレームワーク「OpenEmbedded」がサポートする、公式の各種レイヤー情報ページです。

そして、このページの「Machines」タブをクリックしてください。


https://layers.openembedded.org/layerindex/branch/master/layer/meta-sunxi/

「OpenEmbedded Layer Index」 - 1


このページを下の方へスクロールしますと…。

「OpenEmbedded Layer Index」 - 2


pcduino3」という表記がありますね。

どうやら、このレイヤーを使えば良いらしいことが分かります。

「OpenEmbedded Layer Index」 - 3


因みに「sunxi」って何?って思いますよね。

これは「pcDuino3」に搭載されている、中国Allwinner Technology社のCPUシリーズの型番に由来します。

「pcDuino3」に搭載されているものは「A20(sun7i)」です。

他にも、このシリーズには「A10 (sun4i)」や「A13 (sun5i)」などが存在します。

つまり「sunxi」の「x」は、型番の番号のアスタリスクになっているわけです。

スンシィー、寸志!?…なんか中国語っぽい意味かと思ったけど違ったみたい。


さて、今回は作業無くウンチクだけで終了。

次回から、実際にこのレイヤーをどのように「Yocto Project」に組み込むか?をやっていきたいと思います。


<続く>

0 件のコメント:

コメントを投稿

BSD 4-Clause License

  名称:「四条項BSDライセンス」(BSD-4-clause) タイプ: ・コピーレフト…× ・ライセンス文の掲示…〇 ・コピーライト(著作権)の掲示…〇 ・その他…〇 原文: Copyright (c) <year>, <copyright holde...