リネオブログ

Yocto よもやま話 第 12 回 「Yocto Project 始めます その 2」

2023 年 06 月 20 日   Yocto Project よもやま話

目次

  1. Build System 概要
  2. Layer
  3. 今回のまとめ

今回は、先月予告しました "Yocto Project 始めます その 2" と題して、実際に Yocto Project から poky を入手して構築を行い簡単なカスタマイズを行うまで複数回の連載記事の第二回目を提供していきます。
本連載では、Yocto Project が提供する poky ディストリビューションで LTS として提供される Kirkstone (Yocto 4.0) を使用していますが、今回は Kirkstone の中でもバージョン 4.0.10 をベースにカスタマイズを行う際に必要となる基礎的な情報を紹介していきます。

【補足:前回(第 5 回「Yocto Project 始めます その 1」)時点からの変更点】

  • 動作確認ディストリビューションの変更
    • Ubuntu 18.04 (LTS)
    • Ubuntu 20.04 (LTS)
    • Ubuntu 22.04 (LTS) [追加]
    • Fedora 34
    • Fedora 35
    • Fedora 36 [追加]
    • CentOS 7.x
    • CentOS 8.x
    • AlmaLinux 8.5
    • AlmaLinux 8.7 [追加]
    • Debian GNU/Linux 9.x (Stretch)
    • Debian GNU/Linux 10.x (Buster)
    • Debian GNU/Linux 11.x (Bullseye)
    • OpenSUSE Leap 15.3

1. Build System 概要

本章では、カスタマイズを行う際に必要と思われる Build System の概要を説明していきます。

Build System のワークフロー図

上記の図は、YoctoProject の WebSite やドキュメントで多く使われている Build System のワークフロー図です。右側上部の凡例を拡大したものが下図となります。

右側上部の凡例を拡大

薄い水色の Build System は、bitbake コマンドを指しています。

1.1 bitbake コマンドの入力

bitbake コマンドは、灰色の Metadata/Input のうち、Metadata(bb) [以降レシピと表記]をパラメータとして起動し、起動時に Configuration と呼ばれるファイル群を読みこんで動作します。

1.1.1 レシピ

bitbake コマンドは、レシピの種類によって最終生成物が異なります。

  • ソフトウェアレシピ
    橙色の UpstreamSource を入力元として緑色の Output Packages(Package Feed)[以降パッケージフィードと表記]に、白色の Process Steps(task) [以降、タスクと表記]を経てパッケージを生成するもの。
  • イメージレシピ
    青色の Output Image Data(images) [以降、イメージと表記]を出力先として、パッケージフィードに含まれるパッケージ群をタスクの処理によりイメージを生成するもの
  • パッケージグループレシピ
    複数のパッケージを纏めてグループとして定義することで、イメージレシピ内の記述を簡潔にするもの

レシピは、".bb" をサフィックスに持つファイルで、既存のレシピに対する差分は ".bbappend" と呼ばれるファイルに記載します。

1.1.2 コンフィグレーションファイル

ワークフロー図左側の Metadata/Input には、レシピ(Metadata)の他に 3 つのコンフィグレーションの記載があります。
ここに記載されたファイルは、bitbake 実行時に読み込む poky/meta/conf/bitbake.conf ファイルの中から読み出されています。

bitbake.conf 内の該当箇所

    809 ##################################################################
    810 # Include the rest of the config files.
    811 ##################################################################
    812
    813 require conf/abi_version.conf
    814 include conf/site.conf
    815 include conf/auto.conf
    816 include conf/local.conf
    817 require conf/multiconfig/${BB_CURRENT_MC}.conf
    818 include conf/machine/${MACHINE}.conf
    819 include conf/machine-sdk/${SDKMACHINE}.conf
    820 include conf/distro/${DISTRO}.conf
    821 include conf/distro/defaultsetup.conf
    822 include conf/documentation.conf
    823 include conf/licenses.conf
    824 require conf/sanity.conf
include/require という2種類の構文で読み込むファイルを指定しています。
2つの構文の違いは、require の場合、ファイルは必須であり見つからない場合はエラーとなり bitbake はエラーで終了します。include の場合は、ファイルは見つからない場合にエラーとしません。

User Configuration は、conf/local.conf を指しており、oe-init-build-env で生成されたプロジェクト固有の設定を定義します。
Machine BSP Configuration は、MACHINE 変数に設定されたマシン名のコンフィグレーションファイルを指しており、マシンに固有の設定を定義します。
Policy Configuration は、DISTRO 変数に設定されたディストリビューション名のコンフィグレーションファイルを指しており、ディストリビューション固有の設定を定義します。
複数のマシンでも同一のディストリビューションを指定した場合は、同一の構成となることから、Policy とワークフロー図では表記されています。

変数と演算子
Bitbake では様々な変数が使用されています。
Bitbake コマンドが主に参照する変数に関しては、BitBake User Manual解説されています。
meta-data に関する変数に関しては、Yocto Project Reference Manual で簡単に解説されています。
変数に対する値の設定に関して、bitbake では独自の書式・演算子が使用されており、こちらも BitBake User Manual で解説されています。

1.2 Build System

ワークフロー図の薄い水色の Build System は、bitbake コマンドで実行される処理を指しています。
個々の処理(Process Steps)はタスクという単位に分割されて定義されています。
bitbake では、共通する処理や定義は ".bbclass" をサフィックスとして持つファイルに記載されています。
基本的な処理内容は、poky/ meta/classes/base.bbclass 及び、base.bbclass から読み込まれる他のクラスで定義されています。

base.bbclass 内の他のクラスファイルの読み込み指定個所

      1 BB_DEFAULT_TASK ?= "build"
      2 CLASSOVERRIDE ?= "class-target"
      3
      4 inherit patch
      5 inherit staging
      6
      7 inherit mirrors
      8 inherit utils
      9 inherit utility-tasks
     10 inherit metadata_scm
     11 inherit logging

クラスファイルの読み込みは、inherit を指定し、サフィックスを除いたクラス名を指定しています。
クラスファイルは、複数のレシピ間で共通する処理が記述されており、Yocto4.0.10のpoky/meta/classes ディレクトリには 207 のクラスファイルが含まれています。
各クラスの処理内容は、Yocto Project Reference Manual で簡単に解説されています。

base.bbclass ファイルは、 上記リファレンスマニュアルで解説されているよう、全てのレシピファイルで共通するクラスファイルで、自動的に読み込まれる仕様となっています。

最終生成物がパッケージとなるソフトウェアレシピは、主に以下のタスクを経てパッケージを生成します。

  • fetch ソースファイルを取得する
  • patch パッチを適用する
  • config 構築前の設定
  • compile コンパイル
  • パッケージの生成

実際の処理の概要は、Yocto Project Overview and Concepts Manual 内の BitBake Tool にて説明されています。

1.3 Upatream Source

ワークフロー図のオレンジ色の Upstream Source は、OpenEmbdded の Build System の特徴であるパッケージを生成する際に使用するソースコードは、指定された場所から取得するというコンセプトの元、外部から取得することを基本としています。
Yocto Project Overview and Concepts Manual 内の Sources にて概要が説明されています。

1.4 Package Feeds

ワークフロー図の緑色の Package Feeds は、ソフトウェアレシピの最終生成物であり、またイメージレシピを生成する際に使用するパッケージが保存されている場所となります。 Yocto Project Overview and Concepts Manual 内の Package Feeds にて概要が説明されています。

1.5 Output Image Data

ワークフロー図の青色の Output Image Data は、Package Feeds 内のパッケージを使用して、bitbake の ImageGeneration/SDKGeneration の処理を経て生成される Image/SDK を指します。Yocto Project Overview and Concepts Manual 内の ImageGeneration SDKGeneration にて概要が説明されています。

2. Layer

ワークフロー図で説明されている、MetaData/Inputs のレシファイルピやコンフィグレーションファイル、task を定義するクラスファイルは、レイヤーと呼ばれる集合に含まれます。
レイヤーの定義は、Yocto Project Reference Manual で簡単に説明されており、Layer Model については Yocto Project Overview and Concepts Manual 内の The Yocto Project Layer Model にて説明されています。

2.1 Base Layer

基本的なレシピファイルやコンフィグレーションファイル、クラスファイルの集合体はベースレイヤーと呼ばれています。
Yocto Project で提供する poky では、Yocto Project とopen embedded project が共同で開発・管理を行う openembedded-core (meta)が含まれています。 open embedded project では、openembedded-core に含まれなかった一般的に使われるレシピの集合を meta-oe レイヤーとして提供しています。

2.2 Distro Layer

Distribution のコンフィグレーションファイルや、Distribution に特有のレシピは、Distro Layer と呼ばれるレイヤーに含まれます。conf/distro 以下にコンフィグレーションファイルを含むレイヤーはディストリビューションレイヤーに分類されます。
Yocto Project Overview and Concepts Manual 内の Distro Layer にて概要が説明されています。Poky では、meta-poky が Distro Layer として提供されています。

2.3 BSP Layer

マシンのコンフィグレーションファイルやマシンに特有のレシピは、BSP Layer と呼ばれるレイヤーに含まれます。conf/machine 以下にコンフィグレーションファイルを含むレイヤーは BSP レイヤーに分類されます。
Yocto Project Overview and Concepts Manual 内の BSP Layer にて概要が説明されています。Poky では meta-yocto-bsp が BSP Layerとして提供されています。

2.4 Software Layer

ディストリビューションの定義やマシンの定義を含まないソフトウェアレシピが含まれるレイヤーは、SoftWare レイヤーと呼ばれています。
Yocto Project Overview and Concepts Manual 内の Software Layer にて概要が説明されています。

Poky では、Software レイヤーは提供されていませんが、openembedded-project では、複数のソフトウェアレイヤーが提供されています。(meta-oe 以外はソフトウェアレイヤー)

2.5 Layer Index

Open embedded project では、公開されている Layer 情報を OpenEmbedded Layer Index として提供しています。
OpenEmbedded Layer Index では、レイヤーの検索だけでなく、keyword を指定したレシピの検索MachineDistroClasses の検索及び一覧表示が行えます。

現在の Layer 構成では含まれないソフトウェアを追加する際、既に作成されたレシピが無いか検索する際に便利なサイトが提供されています。

3. 今回のまとめ

今回はカスタマイズ作業を行う際に必要と思われるトピックを紹介してきました。 説明やリンク先の情報を元に、次回連載では実際にイメージのカスタマイズ・レシピのカスタマイズなどの実例の紹介を行う予定です。

この記事の著者
執筆者
伊東 孝康

ウィンドウシステム X10 の時代からオープンソースに関わり、リネオでカーネル層からアプリケーション層まで幅広い組込みの開発を行う。
2020 年 10 月 Yocto Project Ambassador に就任

Yocto Project の勉強がしたい Yocto での問題を解決して欲しい お客様の Yocto 開発を支援するサービス群 Yoctoコンシェルジュ

組込みLinuxセキュリティ基礎講座
Vigiles サポート
Yocto Project よもやま話
Yocto よもやま話 第 14 回 「Yocto 4.3 Nanbield リリース」
Yocto よもやま話 第 14 回 「Yocto 4.3 Nanbield リリース」

2024 年 03 月 26 日 Yocto Project よもやま話

Yocto よもやま話 第 13 回 「Yocto Project の最新動向 2023 夏」
Yocto よもやま話 第 13 回 「Yocto Project の最新動向 2023 夏」

2023 年 07 月 25 日 Yocto Project よもやま話

Yocto よもやま話 第 12 回 「Yocto Project 始めます その 2」
Yocto よもやま話 第 12 回 「Yocto Project 始めます その 2」

2023 年 06 月 20 日 Yocto Project よもやま話

Linux 技術ネタ
RISC-Vについて学ぶ-後編
RISC-Vについて学ぶ-後編

2024 年 01 月 10 日 Linux 技術ネタ

RISC-Vについて学ぶ-前編
RISC-Vについて学ぶ-前編

2023 年 12 月 12 日 Linux 技術ネタ

イベントレポート
EdgeTech+ West 2024 出展レポート
EdgeTech+ West 2024 出展レポート

2024 年 07 月 26 日 イベントレポート

Advanced Technology Forum 2024 Summer 参加レポート
Advanced Technology Forum 2024 Summer 参加レポート

2024 年 07 月 09 日 イベントレポート

リクルート
新卒採用、絶賛募集中!
新卒採用、絶賛募集中!

2023 年 05 月 30 日 リクルート

国立大学オンライン研修レポート 2022
国立大学オンライン研修レポート 2022

2022 年 09 月 27 日 リクルート

信州リネオ便り
社内BBQを開催しました!
社内BBQを開催しました!

2024 年 09 月 25 日 信州リネオ便り

夏季休業明け、スイカを頂きました!
夏季休業明け、スイカを頂きました!

2024 年 08 月 20 日 信州リネオ便り

逃げ上手の聖地、諏訪大社上社前宮
逃げ上手の聖地、諏訪大社上社前宮

2024 年 08 月 07 日 信州リネオ便り

ソリューション統括部
シリコンバレー探検記 2019 ~番外編~
シリコンバレー探検記 2019 ~番外編~

2019 年 12 月 10 日 ソリューション統括部

シリコンバレー探検記 2019 ~後編~
シリコンバレー探検記 2019 ~後編~

2019 年 12 月 10 日 ソリューション統括部

シリコンバレー探検記 2019 ~前編~
シリコンバレー探検記 2019 ~前編~

2019 年 12 月 10 日 ソリューション統括部

マーケティング統括部
大成功決起大会!!(ET2019)
大成功決起大会!!(ET2019)

2019 年 12 月 13 日 マーケティング統括部

ESEC 2019 決起大会
ESEC 2019 決起大会

2019 年 04 月 25 日 マーケティング統括部

シリコンバレー探検記 その 2
シリコンバレー探検記 その 2

2018 年 12 月 18 日 マーケティング統括部