概要

Yocto Projectは、組み込みLinuxシステムのカスタムディストリビューションを構築するためのオープンソースプロジェクトである。

Yocto Projectは、以下の主要なコンポーネントで構成される。

  • Poky
    Yocto Projectのリファレンスディストリビューションであり、ビルドシステムの基盤となる。
  • BitBake
    Pythonで実装されたタスク実行エンジンであり、レシピを解析してビルドタスクを実行する。
  • OpenEmbedded-Core
    基本的なレシピ、クラス、設定ファイルのコレクションである。



Yocto Projectの基本概念

ディレクトリ構成

~/yocto-project/
├── poky/                      # Yocto Project Poky
│   ├── meta/                  # OpenEmbedded-Core
│   ├── meta-poky/             # Pokyディストロ設定
│   └── meta-yocto-bsp/        # リファレンスBSP
├── meta-custom-distro/        # カスタムレイヤ
│   ├── conf/
│   │   ├── layer.conf         # レイヤ設定
│   │   ├── machine/           # マシン設定
│   │   └── distro/            # ディストロ設定
│   ├── recipes-core/          # コアレシピ
│   │   ├── images/            # イメージレシピ
│   │   ├── packagegroups/     # パッケージグループ
│   │   └── base-files/        # base-files拡張
│   ├── recipes-apps/          # アプリケーションレシピ
│   └── recipes-kernel/        # カーネル関連
└── build/                     # ビルドディレクトリ
    ├── conf/
    │   ├── local.conf         # ローカル設定
    │   └── bblayers.conf      # レイヤ設定
    └── tmp/
        └── deploy/
            ├── images/        # 生成イメージ
            └── sdk/           # SDK


レイヤの概念

レイヤは、関連するレシピ、設定、クラスをグループ化したものである。
レイヤを使用することで、機能の追加や変更を既存のコードベースに影響を与えずに行うことができる。

一般的なレイヤ構造は以下の通りである。

meta-layername/
├── conf/
│   └── layer.conf          # レイヤ設定ファイル
├── recipes-core/            # コアレシピ
├── recipes-kernel/          # カーネル関連レシピ
├── recipes-apps/            # アプリケーションレシピ
└── classes/                 # BitBakeクラス


レシピの構造

レシピ (.bbファイル) は、ソフトウェアパッケージのビルド方法を定義する。

主要な変数として以下がある。

  • DESCRIPTION
    パッケージの説明
  • LICENSE
    ライセンス種別
  • SRC_URI
    ソースコードの取得先
  • S
    ソースディレクトリ
  • do_compile
    コンパイル処理
  • do_install
    インストール処理


マシン設定とディストリビューション設定

マシン設定 (.conf) は、ターゲットハードウェアの特性 (CPU、メモリ、ペリフェラル等) を定義する。
ディストリビューション設定 (.conf) は、ディストリビューションの特性(パッケージマネージャ、init システム等)を定義する。


開発環境の構築

依存関係のパッケージのインストール

Yocto Projectを使用するには、以下に示すパッケージをインストールする。

# RHEL
## CRBリポジトリの有効化
## 開発に必要なパッケージはCodeReady Linux Builder (CRB) リポジトリに含まれているため
sudo subscription-manager repos --enable codeready-builder-for-rhel-10-$(arch)-rpms

## EPELリポジトリのインストール
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm

## 基本的な開発ツール
sudo dnf groupinstall "Development Tools"

## Yocto Project必須パッケージ
sudo dnf install git tar python3 python3-pip gcc gcc-c++ make wget curl \
                 chrpath diffstat texinfo cpio xz bzip2 gzip unzip \
                 patch perl perl-Data-Dumper perl-Thread-Queue perl-bignum \
                 glibc-devel glibc-devel.i686 libstdc++-devel libstdc++-devel.i686 \
                 zlib-devel zlib-devel.i686 SDL-devel xterm \
                 rpcgen libnsl2-devel rpcsvc-proto-devel \
                 socat screen tmux lz4 zstd hostname file which
 
# SUSE
sudo zypper install git tar python3 python3-pip gcc gcc-c++ make wget \
                    chrpath diffstat texinfo cpio xz bzip2 gzip unzip \
                    patch perl perl-Data-Dumper perl-Thread-Queue \
                    glibc-devel glibc-devel-32bit libstdc++-devel \
                    libstdc++-devel-32bit zlib-devel zlib-devel-32bit \
                    SDL-devel xterm rpcgen libnsl-devel rpcsvc-proto-devel \
                    socat screen tmux


BitBakeの実行にはPythonの追加パッケージが必要である。

# RHEL
sudo dnf install python3-pexpect python3-jinja2 python3-subunit \
                 python3-pip python3-GitPython python3-distro

# SUSE
sudo zypper install python3-pexpect python3-Jinja2 python3-subunit \
                    python3-pip python3-GitPython python3-distro

# pipを使用した追加パッケージ (必要に応じて)
pip3 install --user kas


クロスコンパイル時に32ビットライブラリが必要になる場合がある。

# RHEL
sudo dnf install glibc.i686 libgcc.i686 libstdc++.i686 zlib.i686 \
                 ncurses-libs.i686 readline.i686

# SUSE
sudo zypper install glibc-32bit libgcc_s1-32bit libstdc++6-32bit \
                    libz1-32bit libncurses6-32bit libreadline8-32bit


ロケール設定の確認

ロケール設定が正しく行われているかどうかを確認する。

# en_US.UTF-8ロケールの生成確認
locale -a | grep en_US

# ロケールが存在しない場合は生成
sudo dnf install glibc-langpack-en

# 環境変数の設定
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8


上記の環境変数は、~/.profileファイル等に設定することを推奨する。

SELinuxの設定

SELinuxを使用している場合、ビルド中にSELinuxが問題を引き起こす場合があるため、必要に応じてPermissiveモードに設定する。

# 現在のSELinux状態の確認
getenforce

# 一時的にPermissiveモードに変更
sudo setenforce 0


恒久的に変更する場合は、/etc/selinux/config ファイルを編集する。

sudo vi /etc/selinux/config


# /etc/selinux/configファイル

SELINUX=permissive


※注意
本番環境ではSELinuxを無効化せず、適切なポリシーを設定することを推奨する。

ファイアウォールの設定

ビルド中にソースコードをダウンロードするため、ネットワークアクセスが必要である。

# ファイアウォールの状態確認
sudo firewall-cmd --state

# 必要に応じてHTTP/HTTPSを許可
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload


Gitの設定

Yoctoのビルドシステムでは、Gitの設定が必要である。

git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"


Pokyのダウンロード

作業ディレクトリを作成して、Pokyをダウンロードする。

mkdir -p ~/yocto-project
cd ~/yocto-project

# Scarthgap (LTS) ブランチを使用
git clone -b scarthgap git://git.yoctoproject.org/poky.git


ビルド環境の初期化

ビルド環境を初期化する。

cd ~/yocto-project/poky
source oe-init-build-env ../build


上記のコマンドを実行すると、buildディレクトリが作成され、自動的にそのディレクトリに移動する。


標準レイヤの構造分析

metaレイヤ

metaはOpenEmbedded-Coreレイヤであり、基本的なレシピとクラスが含まれる。

meta/
├── classes/                 # BitBakeクラス (base.bbclass、image.bbclass等)
├── conf/                    # 基本設定ファイル
│   ├── bitbake.conf         # BitBakeのグローバル設定
│   └── machine/             # 汎用マシン設定
├── recipes-core/            # init、busybox、base-files等
├── recipes-kernel/          # Linuxカーネル関連
└── recipes-support/         # サポートライブラリ


meta-pokyレイヤ

meta-pokyレイヤーはPokyディストリビューション固有の設定を含む。

meta-poky/
├── conf/
│   └── distro/
│       └── poky.conf        # Pokyディストロ設定
└── recipes-core/            # Poky固有のレシピ


meta-yocto-bspレイヤ

meta-yocto-bspレイヤーは、リファレンスBSP (Board Support Package) を提供する。

meta-yocto-bsp/
├── conf/
│   └── machine/
│       ├── beaglebone-yocto.conf
│       └── genericarm64.conf
└── recipes-kernel/                # BSP固有のカーネル設定



カスタムレイヤの作成

レイヤディレクトリの作成

カスタムディストリビューション用のレイヤを作成する。

cd ~/yocto-project
mkdir -p meta-custom-distro/conf
mkdir -p meta-custom-distro/recipes-core/images
mkdir -p meta-custom-distro/recipes-core/packagegroups
mkdir -p meta-custom-distro/recipes-apps
mkdir -p meta-custom-distro/recipes-kernel/linux


layer.confの作成

レイヤ設定ファイルを作成する。

vi ~/yocto-project/meta-custom-distro/conf/layer.conf


# レイヤ設定ファイル
# meta-custom-distro レイヤ

# レシピとアペンドファイルの収集パターン
BBPATH .= ":${LAYERDIR}"

BBFILES += " \
    ${LAYERDIR}/recipes-*/*/*.bb \
    ${LAYERDIR}/recipes-*/*/*.bbappend \
"

BBFILE_COLLECTIONS += "meta-custom-distro"
BBFILE_PATTERN_meta-custom-distro = "^${LAYERDIR}/"

# レイヤの優先度(数値が大きいほど優先)
BBFILE_PRIORITY_meta-custom-distro = "7"

# 互換性のあるYoctoバージョン
LAYERCOMPAT_meta-custom-distro = "scarthgap"

# レイヤの依存関係
LAYERDEPENDS_meta-custom-distro = "core"


ビルド設定へのレイヤ追加

bblayers.confにカスタムレイヤを追加する。

vi ~/yocto-project/build/conf/bblayers.conf


BBLAYERS ?= " \
    /home/user/yocto-project/poky/meta \
    /home/user/yocto-project/poky/meta-poky \
    /home/user/yocto-project/poky/meta-yocto-bsp \
    /home/user/yocto-project/meta-custom-distro \
"


または、bitbake-layersコマンドを使用する。

cd ~/yocto-project/build
bitbake-layers add-layer ../meta-custom-distro


BitBakeコマンド

  • bitbake <image-name>
    イメージのビルド
  • bitbake -c <task> <recipe>
    特定タスクの実行
  • bitbake -e <recipe>
    レシピの変数展開を表示
  • bitbake -g <recipe>
    依存関係グラフの生成
  • bitbake-layers show-layers
    レイヤ一覧の表示
  • bitbake-layers show-recipes
    レシピ一覧の表示
  • bitbake -s
    利用可能なレシピの表示



カスタムマシン設定の作成

例えば、Cortex-A53向けのカスタムマシン設定を行う場合を示す。

マシン設定ディレクトリの作成

任意のアーキテクチャ向けのカスタムマシン設定を作成する。

mkdir -p ~/yocto-project/meta-custom-distro/conf/machine
vi ~/yocto-project/meta-custom-distro/conf/machine/custom-cortexa53.conf


マシン設定ファイルの内容

# custom-cortexa53.conf
# Cortex-A53ベースのカスタムマシン設定

# マシンの説明
#@TYPE: Machine
#@NAME: Custom Cortex-A53 Machine
#@DESCRIPTION: Custom machine configuration for Cortex-A53 based boards

# 汎用ARM64設定をインクルード
require conf/machine/include/arm/armv8a/tune-cortexa53.inc

# マシン固有の設定
MACHINE_FEATURES = "usbhost vfat ext2 screen alsa"

# カーネル設定
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
KERNEL_IMAGETYPE = "Image"
KERNEL_DEVICETREE = ""

# ブートローダー設定
PREFERRED_PROVIDER_virtual/bootloader ?= "u-boot"
UBOOT_MACHINE = "qemu_arm64_defconfig"

# シリアルコンソール設定
SERIAL_CONSOLES = "115200;ttyAMA0"

# ルートファイルシステム設定
IMAGE_FSTYPES = "tar.gz ext4 wic"
WKS_FILE = "sdimage-bootpart.wks"

# QEMU設定(エミュレーション用)
MACHINE_EXTRA_RRECOMMENDS += "kernel-modules"

# イメージオーバーヘッド設定
IMAGE_ROOTFS_EXTRA_SPACE = "262144"


local.confでのマシン指定

ビルド設定でカスタムマシンを指定する。

vi ~/yocto-project/build/conf/local.conf


# カスタムマシンを使用
MACHINE = "custom-cortexa53"



カスタムディストリビューション設定の作成

ディストリビューション設定ディレクトリの作成

カスタムディストリビューション設定を作成する。

mkdir -p ~/yocto-project/meta-custom-distro/conf/distro
vi ~/yocto-project/meta-custom-distro/conf/distro/custom-embedded.conf


ディストリビューション設定ファイルの内容

# custom-embedded.conf
# カスタム組み込みLinuxディストリビューション設定

# Pokyディストロ設定をベースとする
require conf/distro/poky.conf

# ディストリビューション名とバージョン
DISTRO = "custom-embedded"
DISTRO_NAME = "Custom Embedded Linux"
DISTRO_VERSION = "1.0.0"
DISTRO_CODENAME = "stable"

# メンテナ情報
MAINTAINER = "Your Name <your.email@example.com>"

# ディストリビューション機能
DISTRO_FEATURES = "acl argp ext2 ipv4 ipv6 largefile usbhost wifi \
                   systemd usrmerge"

# systemdを使用
DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"
VIRTUAL-RUNTIME_init_manager = "systemd"
VIRTUAL-RUNTIME_initscripts = "systemd-compat-units"

# パッケージマネージャ設定
PACKAGE_CLASSES = "package_rpm"

# SDKの設定
SDK_VENDOR = "-customsdk"
SDK_VERSION = "${DISTRO_VERSION}"
SDK_NAME = "${DISTRO}-${TCLIBC}-${SDKMACHINE}-${IMAGE_BASENAME}-${TUNE_PKGARCH}-${MACHINE}"

# ビルド最適化
INHERIT += "rm_work"

# ライセンス許可設定
LICENSE_FLAGS_ACCEPTED = "commercial"


local.confでのディストリビューション指定

ビルド設定でカスタムディストリビューションを指定する。

vi ~/yocto-project/build/conf/local.conf


# カスタムディストリビューションを使用
DISTRO = "custom-embedded"



カスタムレシピの作成

アプリケーションレシピの作成

サンプルアプリケーションのレシピを作成する。

mkdir -p ~/yocto-project/meta-custom-distro/recipes-apps/hello-custom/files
vi ~/yocto-project/meta-custom-distro/recipes-apps/hello-custom/hello-custom_1.0.bb


# hello-custom_1.0.bb
# サンプルアプリケーションレシピ

SUMMARY = "Custom Hello World Application"
DESCRIPTION = "A simple hello world application for the custom distribution"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://hello-custom.c \
           file://Makefile"

S = "${WORKDIR}"

do_compile() {
   oe_runmake
}

do_install() {
   install -d ${D}${bindir}
   install -m 0755 hello-custom ${D}${bindir}/
}


ソースコードの作成

hello-custom.cを作成する。

vi ~/yocto-project/meta-custom-distro/recipes-apps/hello-custom/files/hello-custom.c


 #include <stdio.h>
 
 int main(int argc, char *argv[])
 {
    printf("Hello from Custom Embedded Linux!\n");
    printf("Build Date: %s %s\n", __DATE__, __TIME__);
    return 0;
 }


Makefileを作成する。

vi ~/yocto-project/meta-custom-distro/recipes-apps/hello-custom/files/Makefile


 CC ?= gcc
 CFLAGS ?= -Wall -O2
 
 all: hello-custom
 
 hello-custom: hello-custom.c
 	$(CC) $(CFLAGS) -o $@ $<
 
 clean:
 	rm -f hello-custom


base-filesのbbappend作成

base-filesを拡張して、カスタムシステム情報を追加する。

mkdir -p ~/yocto-project/meta-custom-distro/recipes-core/base-files
vi ~/yocto-project/meta-custom-distro/recipes-core/base-files/base-files_%.bbappend


# base-files_%.bbappend
# base-filesレシピの拡張

FILESEXTRAPATHS:prepend := "${THISDIR}/files:"

do_install:append() {
    # カスタムissueファイルを作成
    echo "Custom Embedded Linux ${DISTRO_VERSION}" > ${D}${sysconfdir}/issue
    echo "Kernel \r on \m" >> ${D}${sysconfdir}/issue
    echo "" >> ${D}${sysconfdir}/issue
    
    # /etc/os-releaseをカスタマイズ
    echo 'NAME="${DISTRO_NAME}"' > ${D}${sysconfdir}/os-release
    echo 'VERSION="${DISTRO_VERSION}"' >> ${D}${sysconfdir}/os-release
    echo 'ID=custom-embedded' >> ${D}${sysconfdir}/os-release
    echo 'VERSION_ID="${DISTRO_VERSION}"' >> ${D}${sysconfdir}/os-release
    echo 'PRETTY_NAME="${DISTRO_NAME} ${DISTRO_VERSION}"' >> ${D}${sysconfdir}/os-release
}


カーネル設定のbbappend作成

カーネル設定をカスタマイズするbbappendを作成する。

mkdir -p ~/yocto-project/meta-custom-distro/recipes-kernel/linux/files
vi ~/yocto-project/meta-custom-distro/recipes-kernel/linux/linux-yocto_%.bbappend


# linux-yocto_%.bbappend
# カーネル設定の拡張

FILESEXTRAPATHS:prepend := "${THISDIR}/files:"

SRC_URI += "file://custom-kernel.cfg"

# カーネル設定フラグメント
KERNEL_CONFIG_FRAGMENTS += "${WORKDIR}/custom-kernel.cfg"


カーネル設定フラグメントを作成する。

vi ~/yocto-project/meta-custom-distro/recipes-kernel/linux/files/custom-kernel.cfg


# カスタムカーネル設定
CONFIG_LOCALVERSION="-custom"
CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_PREEMPT=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_CGROUPS=y
CONFIG_NAMESPACES=y


パッケージグループの作成

基本パッケージグループを作成する。

vi ~/yocto-project/meta-custom-distro/recipes-core/packagegroups/packagegroup-custom-base.bb


# packagegroup-custom-base.bb
# 基本パッケージグループ

SUMMARY = "Custom Base Package Group"
DESCRIPTION = "Essential packages for the custom embedded distribution"

inherit packagegroup

RDEPENDS:${PN} = " \
    base-files \
    base-passwd \
    busybox \
    sysvinit-inittab \
    systemd \
    systemd-compat-units \
    udev \
    util-linux \
    e2fsprogs \
    dosfstools \
    iproute2 \
    openssh \
    openssl \
    ca-certificates \
"


開発用パッケージグループを作成する。

vi ~/yocto-project/meta-custom-distro/recipes-core/packagegroups/packagegroup-custom-dev.bb


# packagegroup-custom-dev.bb
# 開発用パッケージグループ

SUMMARY = "Custom Development Package Group"
DESCRIPTION = "Development and debugging tools"

inherit packagegroup

RDEPENDS:${PN} = " \
    gdb \
    strace \
    ltrace \
    tcpdump \
    iperf3 \
    htop \
    nano \
    vim \
    git \
    cmake \
    make \
    gcc \
    g++ \
    binutils \
    python3 \
    python3-pip \
"



カスタムイメージの作成

最小イメージの作成

最小構成のイメージレシピを作成する。

vi ~/yocto-project/meta-custom-distro/recipes-core/images/custom-image-minimal.bb


# custom-image-minimal.bb
# 最小構成イメージ

SUMMARY = "Custom Minimal Image"
DESCRIPTION = "A minimal image for the custom embedded distribution"
LICENSE = "MIT"

inherit core-image

IMAGE_FEATURES += "ssh-server-openssh"

IMAGE_INSTALL = " \
    packagegroup-core-boot \
    packagegroup-custom-base \
    hello-custom \
    kernel-modules \
"

# ルートファイルシステムサイズ
IMAGE_ROOTFS_SIZE ?= "262144"
IMAGE_ROOTFS_EXTRA_SPACE = "131072"

# デフォルトロケール
IMAGE_LINGUAS = "en-us"


開発用イメージの作成

開発ツールを含むイメージレシピを作成する。

vi ~/yocto-project/meta-custom-distro/recipes-core/images/custom-image-dev.bb


# custom-image-dev.bb
# 開発用イメージ

SUMMARY = "Custom Development Image"
DESCRIPTION = "A development image with debugging tools"
LICENSE = "MIT"

# 最小イメージをベースとする
require custom-image-minimal.bb

IMAGE_FEATURES += "debug-tweaks dev-pkgs dbg-pkgs tools-debug tools-sdk"

IMAGE_INSTALL += " \
    packagegroup-custom-dev \
    packagegroup-core-buildessential \
"

# 開発用に追加のスペースを確保
IMAGE_ROOTFS_EXTRA_SPACE = "524288"


本番用イメージの作成

本番環境向けのイメージレシピを作成する。

vi ~/yocto-project/meta-custom-distro/recipes-core/images/custom-image-production.bb


# custom-image-production.bb
# 本番用イメージ

SUMMARY = "Custom Production Image"
DESCRIPTION = "A production-ready image with security hardening"
LICENSE = "MIT"

# 最小イメージをベースとする
require custom-image-minimal.bb

# セキュリティ強化
IMAGE_FEATURES:remove = "debug-tweaks"
IMAGE_FEATURES += "read-only-rootfs"

# 追加パッケージ
IMAGE_INSTALL += " \
    watchdog \
    logrotate \
"

# 本番用の最適化
EXTRA_IMAGE_FEATURES = ""

# パスワード設定を強制
INHERIT += "extrausers"
EXTRA_USERS_PARAMS = "usermod -P 'rootpassword' root;"



ビルドの実行と確認

ビルドの開始

イメージをビルドする。

cd ~/yocto-project/build
source ../poky/oe-init-build-env .

# 最小イメージのビルド
bitbake custom-image-minimal


ビルドの監視

ビルド状況を監視する方法は以下の通りである。

# 別ターミナルでログを監視
tail -f ~/yocto-project/build/tmp/log/cooker/custom-cortexa53/console-latest.log

# ビルドタスクの確認
bitbake -g custom-image-minimal
cat pn-buildlist


ビルド成果物の確認

ビルドが完了すると、以下のディレクトリに成果物が生成される。

ls -la ~/yocto-project/build/tmp/deploy/images/custom-cortexa53/


主な成果物は以下の通りである。

custom-image-minimal-custom-cortexa53.tar.gz    : ルートファイルシステム (tar.gz)
custom-image-minimal-custom-cortexa53.ext4      : ルートファイルシステム (ext4)
custom-image-minimal-custom-cortexa53.wic       : ブート可能なディスクイメージ
Image                                           : Linuxカーネルイメージ
modules-custom-cortexa53.tgz                    : カーネルモジュール



一般的なビルドエラーと対処法

do_fetchエラー

ソースコードのダウンロードに失敗した場合は、以下に示す事柄を確認する。

# ネットワーク接続の確認
ping git.yoctoproject.org

# プロキシ設定の確認(必要な場合)
export HTTP_PROXY="http://proxy.example.com:8080"
export HTTPS_PROXY="http://proxy.example.com:8080"


do_compileエラー

コンパイルエラーの場合は、ログファイルを確認する。

# エラーログの確認
cat ~/yocto-project/build/tmp/work/*/package-name/*/temp/log.do_compile

# 依存関係の確認
bitbake -e package-name | grep ^DEPENDS


ディスク容量不足

ビルドには大量のディスク容量が必要である。(最低50[GB]を推奨する)

# ディスク使用量の確認
df -h ~/yocto-project

# 不要なビルド成果物の削除
bitbake -c cleanall package-name



デプロイメントとテスト

QEMUでのテスト

QEMUを使用してイメージをテストする。

cd ~/yocto-project/build
runqemu custom-cortexa53 nographic


QEMUを終了する場合は、[Ctrl] + [A]キーを押下した後、[X]キーを押下する。

WICイメージの書き込み

WICイメージをSDカードに書き込む。

# SDカードデバイスの確認
lsblk

# イメージの書き込み
# sdXは実際のデバイス名に置換すること
sudo dd if=~/yocto-project/build/tmp/deploy/images/custom-cortexa53/custom-image-minimal-custom-cortexa53.wic \
        of=/dev/sdX bs=4M status=progress conv=fsync

sync


※注意
ddコマンドは誤ったデバイスを指定するとデータが失われるため、デバイス名を十分に確認すること。

NFSブートの設定

開発時にはNFSブートを使用すると便利である。

ホストPCでNFSサーバを設定する。

# NFSサーバのインストール
sudo zypper install nfs-kernel-server


エクスポート設定を行う。

sudo vi /etc/exports


/home/<ユーザ名>/yocto-project/build/tmp/deploy/images/custom-cortexa53/custom-image-minimal-custom-cortexa53-*.rootfs *(rw,no_root_squash,no_subtree_check)


NFSサーバを起動する。

sudo systemctl enable nfs-server
sudo systemctl start nfs-server
sudo exportfs -a


SDKの生成

クロスコンパイル用のSDKを生成する。

bitbake custom-image-minimal -c populate_sdk


SDKは以下のディレクトリに生成される。

ls ~/yocto-project/build/tmp/deploy/sdk/


SDKのインストールと使用方法は以下の通りである。

# SDKのインストール
./poky-glibc-x86_64-custom-image-minimal-cortexa53-custom-cortexa53-toolchain-*.sh

# 環境のセットアップ
source /opt/poky/*/environment-setup-cortexa53-poky-linux

# クロスコンパイルの確認
$CC --version
$CC -o hello hello.c



保守とアップデート

バージョン管理

カスタムレイヤをGitで管理することを推奨する。

cd ~/yocto-project/meta-custom-distro
git init
git add .
git commit -m "Initial commit of custom distribution layer"


タグを使用してリリースを管理する。

git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0


Yoctoバージョンのアップグレード

Yoctoの新しいLTSバージョンにアップグレードする手順は以下の通りである。

cd ~/yocto-project/poky
git fetch --all
git checkout scarthgap  # または新しいLTSブランチ

# カスタムレイヤのLAYERCOMPATを更新
vi ~/yocto-project/meta-custom-distro/conf/layer.conf


LAYERCOMPAT_meta-custom-distro = "scarthgap"  # 新しいバージョンに更新


セキュリティアップデート

CVE (脆弱性) チェックを有効にする。

vi ~/yocto-project/build/conf/local.conf


# CVEチェックを有効化
INHERIT += "cve-check"


CVEレポートを生成する。

bitbake custom-image-minimal -c cve_check

# レポートの確認
cat ~/yocto-project/build/tmp/deploy/cve/custom-image-minimal-cve.txt


ドキュメントの整備

以下に示すドキュメントを整備することを推奨する。

# レイヤのREADME
vi ~/yocto-project/meta-custom-distro/README.md


# meta-custom-distro

## 概要
Custom Embedded Linux ディストリビューション用のYoctoレイヤ

## 対応Yoctoバージョン
- Scarthgap (LTS)

## 依存レイヤ
- poky/meta
- poky/meta-poky
- poky/meta-yocto-bsp

## 使用方法
1. ビルド環境の初期化
   source poky/oe-init-build-env build

2. レイヤの追加
   bitbake-layers add-layer ../meta-custom-distro

3. local.confの設定
   MACHINE = "custom-cortexa53"
   DISTRO = "custom-embedded"

4. ビルドの実行
   bitbake custom-image-minimal

## 含まれるレシピ
- custom-image-minimal : 最小構成イメージ
- custom-image-dev : 開発用イメージ
- custom-image-production : 本番用イメージ
- hello-custom : サンプルアプリケーション
- packagegroup-custom-base : 基本パッケージグループ
- packagegroup-custom-dev : 開発用パッケージグループ

## ライセンス
MIT License



参考情報