概要
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-security | SELinux・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はより柔軟で大規模プロジェクトや複数製品管理に向きますが、ビルド時間と習熟コストがかかります。
| 項目 | Yocto | Buildroot |
|---|---|---|
| 学習コスト | 高い | 低〜中 |
| ビルド時間(初回) | 数時間 | 1〜2時間 |
| カスタマイズ性 | 非常に高い | 高い |
| パッケージ数 | 数千(OpenEmbedded経由) | 2000以上 |
| 複数製品管理 | レイヤーで体系的に管理可 | 設定ファイルのコピー管理 |
| 企業サポート | 豊富(Mentor, Wind Riverなど) | 限定的 |
| 再現ビルド | サポートあり | 基本的にサポートなし |