「Yoctoのレイヤーって結局何?」
「meta-xxxというディレクトリがたくさんあって意味がわからない」
「Raspberry Pi用のBSPレイヤーを追加したい」
Yocto Projectを使いこなす上で最も重要な概念が「レイヤー」です。この記事では、レイヤーの仕組みを図解で解説し、実際にカスタムレイヤーを作成する手順を紹介します。
📌 この記事の前提条件
- Yoctoの基本(BitBake、レシピ)を理解している
- Pokyでcore-image-minimalのビルドが成功している
→ まだの方は「Yocto入門ガイド」を先にお読みください。
📚 この記事でわかること
- レイヤーとは何か、なぜ必要なのか
- レイヤーの種類(BSP、ディストリビューション、ソフトウェア)
- カスタムレイヤーの作成手順
- 外部レイヤー(meta-raspberrypi等)の追加方法
- layer.confとbblayers.confの設定
Yoctoレイヤーとは?【図解】
レイヤー(Layer)とは、関連するレシピ・設定・パッチをまとめた「モジュール」です。
Yoctoのビルドシステムは、複数のレイヤーを積み重ねる(Stack)ことで動作します。これにより、ベースを壊さずにカスタマイズできます。
🔧 レイヤーの積み重ね構造

⚠️ 上のレイヤーは下のレイヤーを「上書き」できます。同じレシピがある場合、上が優先されます。
なぜレイヤーが必要なのか?
- 再利用性:同じレイヤーを複数プロジェクトで使い回せる
- 保守性:アップストリームとの分離。Pokyをアップデートしても自分の変更が消えない
- コラボレーション:チームで分担しやすい。BSP担当・アプリ担当など
- バージョン管理:レイヤーごとにGitリポジトリを分けられる
レイヤーの種類
| 種類 | 目的 | 例 |
|---|---|---|
| BSPレイヤー | 特定ハードウェア向けの設定 | meta-raspberrypi, meta-ti, meta-intel |
| ディストリビューションレイヤー | ディストリビューション設定 | meta-poky, meta-angstrom |
| ソフトウェアレイヤー | 追加パッケージ群 | meta-openembedded, meta-qt5 |
| カスタムレイヤー | プロジェクト固有のレシピ | meta-mylayer, meta-mycompany |
レイヤーのディレクトリ構造
すべてのレイヤーは同じ基本構造を持っています。
meta-mylayer/ ├── conf/ │ └── layer.conf # レイヤーの設定ファイル(必須) ├── COPYING.MIT # ライセンスファイル ├── README # レイヤーの説明 ├── recipes-bsp/ # BSP関連レシピ ├── recipes-core/ # コア機能のレシピ ├── recipes-example/ # サンプルレシピ │ └── myapp/ │ ├── myapp_1.0.bb │ └── files/ ├── recipes-kernel/ # カーネル関連 ├── recipes-graphics/ # グラフィック関連 └── classes/ # 共通クラス(.bbclass)
layer.confの中身
conf/layer.confはレイヤーの「身分証明書」です。
# conf/layer.conf
# レイヤーの設定を追加
BBPATH .= ":${LAYERDIR}"
# レシピを検索するパス(*は任意の階層)
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"
# レシピの重複を許可するパターン
BBFILE_COLLECTIONS += "meta-mylayer"
BBFILE_PATTERN_meta-mylayer = "^${LAYERDIR}/"
# レイヤーの優先度(高いほど優先)
BBFILE_PRIORITY_meta-mylayer = "6"
# レイヤーの互換性(対応するYoctoバージョン)
LAYERSERIES_COMPAT_meta-mylayer = "scarthgap styhead"
# 依存レイヤー(このレイヤーが必要とする他のレイヤー)
LAYERDEPENDS_meta-mylayer = "core"
【実践1】カスタムレイヤーを作成する
方法1: bitbake-layersコマンドを使う(推奨)
# ビルド環境に入る $ cd ~/yocto/poky $ source oe-init-build-env build # 新しいレイヤーを作成 $ cd .. $ bitbake-layers create-layer meta-myproject # 作成されたファイルを確認 $ ls meta-myproject/ conf COPYING.MIT README recipes-example $ cat meta-myproject/conf/layer.conf # layer.confの内容が表示される
方法2: 手動で作成する
# ディレクトリ構造を作成
$ mkdir -p meta-myproject/conf
$ mkdir -p meta-myproject/recipes-example/myapp
# layer.confを作成
$ cat > meta-myproject/conf/layer.conf << 'EOF'
BBPATH .= ":${LAYERDIR}"
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"
BBFILE_COLLECTIONS += "meta-myproject"
BBFILE_PATTERN_meta-myproject = "^${LAYERDIR}/"
BBFILE_PRIORITY_meta-myproject = "6"
LAYERSERIES_COMPAT_meta-myproject = "scarthgap styhead"
EOF
【実践2】レイヤーをビルドに追加する
bblayers.confの編集
# 方法1: コマンドで追加(推奨) $ cd ~/yocto/poky $ source oe-init-build-env build $ bitbake-layers add-layer ../meta-myproject # 方法2: 直接編集 $ nano conf/bblayers.conf
conf/bblayers.confの例:
# conf/bblayers.conf BBLAYERS ?= " \ /home/user/yocto/poky/meta \ /home/user/yocto/poky/meta-poky \ /home/user/yocto/poky/meta-yocto-bsp \ /home/user/yocto/meta-myproject \ "
レイヤーの確認・削除
# 現在のレイヤー一覧 $ bitbake-layers show-layers layer path priority ========================================================================== meta /home/user/yocto/poky/meta 5 meta-poky /home/user/yocto/poky/meta-poky 5 meta-yocto-bsp /home/user/yocto/poky/meta-yocto-bsp 5 meta-myproject /home/user/yocto/meta-myproject 6 # レイヤーを削除 $ bitbake-layers remove-layer meta-myproject
【実践3】外部BSPレイヤーを追加する
Raspberry Pi用のBSPレイヤー「meta-raspberrypi」を追加する例です。
Step 1: レイヤーをダウンロード
# Pokyと同じディレクトリにクローン $ cd ~/yocto $ git clone -b styhead git://git.yoctoproject.org/meta-raspberrypi # meta-openembeddedも必要(依存関係) $ git clone -b styhead git://git.openembedded.org/meta-openembedded
Step 2: レイヤーを追加
$ cd ~/yocto/poky $ source oe-init-build-env build # meta-oe(meta-openembeddedの一部)を追加 $ bitbake-layers add-layer ../meta-openembedded/meta-oe # meta-raspberrypiを追加 $ bitbake-layers add-layer ../meta-raspberrypi # 確認 $ bitbake-layers show-layers
Step 3: ターゲットマシンを設定
# conf/local.confを編集 $ nano conf/local.conf # MACHINEを変更 MACHINE = "raspberrypi4-64" # 利用可能なマシン一覧 # raspberrypi - Raspberry Pi 1 # raspberrypi2 - Raspberry Pi 2 # raspberrypi3 - Raspberry Pi 3 # raspberrypi3-64 - Raspberry Pi 3 (64bit) # raspberrypi4 - Raspberry Pi 4 # raspberrypi4-64 - Raspberry Pi 4 (64bit) # raspberrypi5 - Raspberry Pi 5
OpenEmbedded Layer Index
公開されているレイヤーは「OpenEmbedded Layer Index」で検索できます。
🔍 レイヤー検索サイト
ここで「raspberrypi」「qt5」「nodejs」など検索すると、対応レイヤーが見つかります。
便利な公式レイヤー一覧
| レイヤー名 | 用途 |
|---|---|
meta-raspberrypi | Raspberry Pi向けBSP |
meta-ti | Texas Instruments向けBSP |
meta-intel | Intel向けBSP |
meta-openembedded | 追加パッケージ(Python, Networking等) |
meta-qt5 / meta-qt6 | Qt5/Qt6 GUI |
meta-virtualization | Docker, LXC等 |
.bbappendでレシピをカスタマイズする
既存のレシピを変更したい場合、元のファイルを編集せずに.bbappendを使います。
# 例:busyboxにパッチを当てる
# meta-mylayer/recipes-core/busybox/busybox_%.bbappend
# パッチファイルを追加
FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
SRC_URI += "file://my-fix.patch"
# 設定を追加
EXTRA_OECONF += "--enable-feature-x"
ポイント:%はワイルドカードで、任意のバージョンにマッチします。
よくあるエラーと解決方法
❌ エラー: Layer ‘xxx’ is not compatible
ERROR: Layer xxx is not compatible with the current version
原因:LAYERSERIES_COMPATが現在のYoctoバージョンと一致しない
解決:layer.confのLAYERSERIES_COMPATを更新
❌ エラー: Layer depends on ‘xxx’
ERROR: Layer xxx depends on layer xxx
原因:依存レイヤーが追加されていない
解決:依存レイヤーを先に追加する
まとめ:レイヤー管理のベストプラクティス
- ✅ 自作レシピは必ずカスタムレイヤーに置く(Pokyを直接編集しない)
- ✅ 既存レシピの変更は.bbappendを使う
- ✅ レイヤー名は「meta-」で始める(慣習)
- ✅ LAYERSERIES_COMPATを適切に設定する
- ✅ レイヤーごとにGitリポジトリを分ける(チーム開発時)


コメント