OS・実行環境

Yocto Project

組み込みLinuxを自作するためのビルド基盤。

概要

Yocto Project(ヨクトプロジェクト)は、組み込みLinuxディストリビューションをカスタムビルドするためのオープンソースビルドフレームワークです。Linux Foundationが主導し、Intel・Texas Instruments・NXP・Qualcommなど主要な半導体メーカーが参加しています。

Yoctoの特徴は、特定のディストリビューション(UbuntuやDebianなど)をベースにするのではなく、必要なコンポーネントをソースコードからビルドして最小限のカスタムLinuxイメージを生成できる点です。これにより、ターゲットボードに最適化された省リソース・セキュアなシステムを構築できます。

中核となるビルドシステムは「BitBake」、パッケージレシピのメタデータコレクションは「OpenEmbedded」です。Buildrootと比べて学習コストは高いですが、大規模プロジェクト・量産品・複数製品ラインの管理に優れます。

歴史・背景

Yocto Projectの前身はOpenEmbeddedプロジェクトです。OpenEmbeddedは2003年頃からHandheld PC向けLinuxビルドシステムとして開発が始まりました。2011年、Linux FoundationがIntelなどと協力してYocto Projectを立ち上げ、OpenEmbeddedのコアレイヤー(OpenEmbedded-Core)をYoctoの基盤として整備しました。

Yoctoのリリースは6ヶ月周期で、各リリースには固有のコード名と番号が付けられます(Kirkstone=4.0、Nanbield=4.3等)。Long Term Support(LTS)リリースは2年間のセキュリティアップデートが提供されます。

2020年代以降、RISC-V対応の充実・再現ビルド(Reproducible builds)・SBOM(Software Bill of Materials)生成機能の追加など、セキュリティ・コンプライアンス対応が強化されています。

技術仕様

Yoctoの主要コンポーネント

Yocto Project エコシステム:

BitBake(ビルドエンジン)
  ↓ レシピ(.bb)を解析・実行
OpenEmbedded-Core(OE-Core)
  ↓ 基本レシピ・クラスのコレクション
meta-yocto-bsp(BSPレイヤー)
  ↓ ボード固有の設定
poky(リファレンスディストリビューション)
  ↓ Yocto公式の参照実装
カスタムレイヤー(meta-myproduct等)
  ↓ 独自レシピ・設定
生成物:
  - rootfs イメージ(.wic / .ext4 / .squashfs)
  - カーネル イメージ
  - デバイスツリー Blob(.dtb)
  - ツールチェーン(SDK)
  - SBOM(ライセンス情報)

ディレクトリ構成

poky/
├── bitbake/          # BitBakeビルドエンジン
├── meta/             # OpenEmbedded-Core(基本レシピ)
├── meta-poky/        # Pokyディストリビューション設定
├── meta-yocto-bsp/   # 参照BSP(BeagleBone等)
└── build/            # ビルドディレクトリ(bitbake後に生成)
    ├── conf/
    │   ├── bblayers.conf  # 使用するレイヤーの定義
    │   └── local.conf     # ローカルビルド設定
    ├── tmp/              # ビルド中間生成物
    └── downloads/        # ソースダウンロードキャッシュ

BitBakeレシピ(.bb)の構造

# recipes-myapp/myapp/myapp_1.0.bb
SUMMARY = "My embedded application"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=abc123..."

# ソース取得
SRC_URI = "git://github.com/myorg/myapp.git;protocol=https;branch=main"
SRCREV = "a1b2c3d4e5f6..."

# 依存パッケージ
DEPENDS = "libgpiod openssl"
RDEPENDS:${PN} = "libgpiod"

# ビルド手順
inherit cmake

# インストール先
do_install() {
    install -d ${D}${bindir}
    install -m 0755 myapp ${D}${bindir}/
    install -d ${D}${sysconfdir}/myapp
    install -m 0644 config.json ${D}${sysconfdir}/myapp/
}

イメージレシピとfeaturesシステム

# recipes-core/images/myproduct-image.bb
SUMMARY = "My product image"

IMAGE_INSTALL:append = " \
    myapp \
    python3 \
    openssh \
    curl \
    libgpiod \
    "

IMAGE_FEATURES += "ssh-server-openssh"
IMAGE_FEATURES += "package-management"

# ルートFSのサイズ上限(MB)
IMAGE_ROOTFS_SIZE ?= "524288"  # 512MB

inherit core-image

主要な設定ファイル

# conf/local.conf(ローカルビルド設定)
MACHINE = "raspberrypi4-64"         # ターゲットボード
DISTRO = "poky"                      # ディストリビューション
BB_NUMBER_THREADS = "8"              # 並列ビルドスレッド数
PARALLEL_MAKE = "-j 8"              # makeの並列数
DL_DIR = "/opt/yocto/downloads"     # ダウンロードキャッシュ
SSTATE_DIR = "/opt/yocto/sstate"    # 共有状態キャッシュ
PACKAGE_CLASSES = "package_rpm"     # パッケージ形式

# conf/bblayers.conf(レイヤー設定)
BBLAYERS = " \
    /path/to/poky/meta \
    /path/to/poky/meta-poky \
    /path/to/poky/meta-yocto-bsp \
    /path/to/meta-raspberrypi \
    /path/to/meta-myproduct \
    "

動作原理

BitBakeの処理フロー

BitBakeはPythonで実装されたビルドエンジンで、レシピを解析して依存関係グラフを構築し、タスクを並列実行します:

1. レシピ解析(.bb / .bbappend ファイルを読み込み)
2. 依存関係解決(DEPENDS / RDEPENDS の解析)
3. タスクグラフ構築(do_fetch → do_unpack → do_patch → do_configure → do_compile → do_install → do_package)
4. 共有状態キャッシュ(sstate)確認(変更なければキャッシュを再利用)
5. タスク並列実行
6. パッケージ生成(.rpm / .deb / .ipk)
7. ルートFS組み立て
8. イメージファイル生成(.wic / .ext4 / squashfs等)

共有状態キャッシュ(sstate-cache)

Yoctoのビルドは時間がかかります(初回は数時間)。sstate-cacheはビルド中間成果物をキャッシュし、2回目以降の差分ビルドを劇的に高速化します。社内で共有sstate-cacheサーバーを立てることで、チーム全体のビルド時間を短縮できます。

レイヤー(Layer)とBSP

Yoctoのレシピはレイヤーに整理されています:

レイヤー種別命名例内容
BSP層meta-raspberrypi, meta-tiボード固有ドライバ・設定
ソフトウェア層meta-openembedded追加パッケージ(python等)
セキュリティ層meta-securitySELinux・AppArmor
製品固有層meta-mycompany自社アプリ・設定

用途・ユースケース

産業機器・量産品

Yoctoは複数の製品ライン・複数のボード向けに共通のレシピ基盤でLinuxイメージを管理するのに優れます。工場の制御装置・医療機器・計測器など、カーネルバージョンや含めるパッケージを厳密に管理する必要がある製品に使われます。

セキュリティ重視のシステム

Yoctoのmeta-securityレイヤーを使えばSELinux・AppArmor・フルディスク暗号化・セキュアブートを統合できます。コンプライアンス要件の厳しい医療・金融・防衛向けに適しています。

車載インフォテインメント

AGL(Automotive Grade Linux)プロジェクトはYoctoをベースにしており、車載インフォテインメントシステム(IVI)向けのディストリビューションを提供しています。

エッジAI機器

NVIDIA Jetson・Qualcomm Dragonboardなどの高性能SBCでAIアクセラレーターを活用するシステムでは、Yoctoでドライバ・ライブラリを含むカスタムイメージを構築します。

実装・開発のポイント

開発環境セットアップ

# Ubuntu 22.04 での Yocto セットアップ例
sudo apt-get install -y gcc git make python3 python3-pip \
    xz-utils diffutils patch chrpath file gawk wget

git clone -b kirkstone https://git.yoctoproject.org/git/poky
cd poky
source oe-init-build-env  # ビルド環境初期化(buildディレクトリへ移動)

# ビルド開始
bitbake core-image-minimal

devtoolによる開発

Yoctoにはdevtoolというアプリ開発専用ツールがあり、既存レシピに手を加えながら開発するワークフローをサポートします:

# 既存レシピを開発用ワークスペースに展開
devtool modify myapp

# ソースを編集・ビルド
cd workspace/sources/myapp
# ... 編集 ...
devtool build myapp

# ターゲットへデプロイ(デプロイサーバー経由)
devtool deploy-target myapp root@192.168.1.100

# 変更を元のレシピに反映
devtool finish myapp /path/to/meta-myproduct/

SDKの生成と利用

Yoctoで生成したSDKを使うと、Yocto外部でもクロスコンパイル環境を構築できます:

# SDK生成
bitbake myproduct-image -c populate_sdk

# SDK インストール(開発者が実行)
./tmp/deploy/sdk/poky-glibc-x86_64-myproduct-image-cortexa53-raspberrypi4-64-toolchain-4.0.sh

# SDK使用
source /opt/poky/4.0/environment-setup-cortexa53-poky-linux
cmake ..
make

他技術との比較

Yocto vs Buildroot

BuildrootはYoctoより学習コストが低く、小〜中規模プロジェクトに適しています。Yoctoはより柔軟で大規模プロジェクトや複数製品管理に向きますが、ビルド時間と習熟コストがかかります。

項目YoctoBuildroot
学習コスト高い低〜中
ビルド時間(初回)数時間1〜2時間
カスタマイズ性非常に高い高い
パッケージ数数千(OpenEmbedded経由)2000以上
複数製品管理レイヤーで体系的に管理可設定ファイルのコピー管理
企業サポート豊富(Mentor, Wind Riverなど)限定的
再現ビルドサポートあり基本的にサポートなし

関連用語

参考リンク