32blogby StudioMitsu
yocto9 min read

YoctoでRaspberry PiカスタムLinuxをビルドする

YoctoでRaspberry Pi 3/4向けカスタムLinuxをビルドする。meta-raspberrypi設定からSD書き込み、Wi-Fi・GPIO設定まで。

yoctoembedded-linuxraspberry-piscarthgap
目次

Raspberry PiにオリジナルのLinuxを入れたい。Raspbianではなく、完全にカスタマイズしたOSを作りたい——。

この記事では、Yocto Scarthgap 5.0 LTSを使ってRaspberry Pi向けのカスタムLinuxイメージをビルドし、実機で起動するまでの手順を解説する。meta-raspberrypiの設定からSDカードへの書き込み、Wi-Fi・SSH・GPIOの設定まで一通りカバーする。

必要なもの

  • ビルド用PC :Ubuntu 22.04/24.04、メモリ16GB以上、ディスク200GB以上
  • Raspberry Pi 3 または 4
  • microSDカード :16GB以上(Class 10推奨)
  • SDカードリーダー
  • HDMIモニター + キーボード (動作確認用)

レイヤーのダウンロードとビルド環境の初期化

bash
# 作業ディレクトリを作成
mkdir -p ~/yocto && cd ~/yocto

# Pokyをダウンロード(scarthgap = LTSブランチ)
git clone -b scarthgap git://git.yoctoproject.org/poky

# meta-raspberrypiをダウンロード
git clone -b scarthgap git://git.yoctoproject.org/meta-raspberrypi

# meta-openembeddedをダウンロード(依存関係)
git clone -b scarthgap git://git.openembedded.org/meta-openembedded

3つのリポジトリすべて同じブランチ(scarthgap)を使うのがポイントだ。バージョンが混在すると互換性エラーが発生する。

bash
# ビルド環境を初期化
cd ~/yocto/poky
source oe-init-build-env build-rpi

レイヤーを追加

bash
# meta-oeを追加(meta-raspberrypiの依存)
bitbake-layers add-layer ../../meta-openembedded/meta-oe

# meta-pythonを追加(Pythonを使う場合)
bitbake-layers add-layer ../../meta-openembedded/meta-python

# meta-networkingを追加(ネットワーク機能を使う場合)
bitbake-layers add-layer ../../meta-openembedded/meta-networking

# meta-raspberrypiを追加
bitbake-layers add-layer ../../meta-raspberrypi

# レイヤー一覧を確認
bitbake-layers show-layers

local.confの設定

conf/local.conf を編集して、Raspberry Pi向けの設定を行う。

text
# ターゲットマシンを指定
MACHINE = "raspberrypi4-64"

# ビルドの並列数(CPUコア数に合わせて調整)
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"

# SDカードイメージを生成(wic形式)
IMAGE_FSTYPES = "wic.bz2 wic.bmap"

# GPU メモリ割り当て(MB)
GPU_MEM = "64"

# シリアルコンソールを有効化(デバッグ用)
ENABLE_UART = "1"

# SSH を有効化(Dropbear)
IMAGE_FEATURES += "ssh-server-dropbear"

# root ログインを許可(開発用。本番では無効化すること)
EXTRA_IMAGE_FEATURES += "debug-tweaks"

# U-Bootブートローダーを使用
RPI_USE_U_BOOT = "1"

Raspberry Piのマシン設定一覧

MACHINE設定対応モデルアーキテクチャ
raspberrypi5Raspberry Pi 564bit (aarch64)
raspberrypi4-64Raspberry Pi 464bit (aarch64)
raspberrypi4Raspberry Pi 432bit (armhf)
raspberrypi3-64Raspberry Pi 364bit (aarch64)
raspberrypi3Raspberry Pi 332bit (armhf)
raspberrypi2Raspberry Pi 232bit (armhf)
raspberrypi0-2w-64Raspberry Pi Zero 2 W64bit (aarch64)

最近のRaspberry Piは64bitモデルを選ぶのがおすすめだ。Raspberry Pi 5を使う場合はU-Bootの問題があるため、RPi5専用ガイドを参照してほしい。

イメージをビルドする

bash
# 最小構成のイメージをビルド
bitbake core-image-minimal

# または、基本ツールを含むイメージ
bitbake core-image-base

# ビルド時間の目安(初回)
# - 8コア/32GB RAM: 約1.5〜2時間
# - 4コア/16GB RAM: 約3〜4時間

ビルド完了後の確認

bash
ls tmp/deploy/images/raspberrypi4-64/

core-image-minimal-raspberrypi4-64.wic.bz2      # SDカードイメージ(圧縮)
core-image-minimal-raspberrypi4-64.wic.bmap     # 高速書き込み用マップ
Image                                            # カーネルイメージ
bcm2711-rpi-4-b.dtb                             # デバイスツリー

SDカードに書き込む

bmaptoolを使う(推奨・高速)

bmaptoolはYoctoが生成する .bmap ファイルを使って、空きブロックをスキップしながら書き込む。ddより大幅に高速だ。

bash
# bmaptoolをインストール
sudo apt install bmap-tools

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

# bmaptoolで書き込み(/dev/sdXは実際のデバイス名に置き換え)
cd tmp/deploy/images/raspberrypi4-64/
sudo bmaptool copy core-image-minimal-raspberrypi4-64.wic.bz2 /dev/sdX

sync

ddを使う(従来方式)

bash
bzcat core-image-minimal-raspberrypi4-64.wic.bz2 | sudo dd of=/dev/sdX bs=4M status=progress
sync

Raspberry Piで起動する

  1. SDカードをRaspberry Piに挿入
  2. HDMIモニターとキーボードを接続
  3. 電源を接続して起動
  4. ログインプロンプトが表示されたら root でログイン(パスワードなし)
text
Poky (Yocto Project Reference Distro) 5.0 raspberrypi4-64 ttyAMA0

raspberrypi4-64 login: root

root@raspberrypi4-64:~# uname -a
Linux raspberrypi4-64 6.6.x-yocto-standard #1 SMP ... aarch64 GNU/Linux

root@raspberrypi4-64:~# cat /etc/os-release
NAME="Poky (Yocto Project Reference Distro)"
VERSION="5.0 (scarthgap)"

Wi-Fi・SSH・GPIOの設定

Wi-Fiを有効化する

conf/local.conf に以下を追加する:

text
IMAGE_INSTALL:append = " linux-firmware-rpidistro-bcm43455 wpa-supplicant"

linux-firmware-rpidistro-bcm43455 はRaspberry Pi 4のWi-Fiチップ(BCM43455)用ファームウェアだ。Raspberry Pi 5のWi-Fiチップは異なるため、RPi5専用ガイドを参照してほしい。

wpa_supplicantの設定ファイルを用意すれば、起動時に自動接続できる。

SSHでリモートログイン

IMAGE_FEATURES += "ssh-server-dropbear" を設定済みなら、SSHが有効だ。

bash
# IPアドレスを確認(有線LAN接続の場合)
root@raspberrypi4-64:~# ip addr show eth0

# 別のPCからSSH接続
ssh root@192.168.1.xxx

実際の開発では、HDMIモニターは起動確認だけに使って、以後はSSHで操作するのが効率的だ。

GPIOを操作する

text
# GPIOツールを追加(local.confに追記)
IMAGE_INSTALL:append = " libgpiod libgpiod-tools"

再ビルド後、GPIO操作が可能になる:

bash
root@raspberrypi4-64:~# gpioinfo
root@raspberrypi4-64:~# gpioset -c gpiochip0 17=1   # GPIO17をHIGHに
root@raspberrypi4-64:~# gpioget -c gpiochip0 27      # GPIO27を読み取り

よくあるトラブルと解決方法

画面が真っ暗、起動しない

原因: HDMIの出力設定が合っていない。

解決: conf/local.conf に以下を追加。

text
HDMI_FORCE_HOTPLUG = "1"
HDMI_GROUP = "2"
HDMI_MODE = "82"

Kernel panic - not syncing

原因: カーネルとルートファイルシステムの不整合。

解決: イメージを再ビルドし、SDカードに書き直す。

No such file or directory: wic.bz2

原因: IMAGE_FSTYPES にwicが含まれていない。

解決: conf/local.conf に以下を追加。

text
IMAGE_FSTYPES = "wic.bz2 wic.bmap"

INCOMPATIBLE_LICENSE エラー

text
ERROR: xxx has incompatible license

原因: 商用ライセンスが必要なパッケージが含まれている。

解決: local.conf にライセンスを許可する設定を追加。

text
LICENSE_FLAGS_ACCEPTED = "commercial"

まとめ

この記事では、Yocto Scarthgap 5.0 LTSでRaspberry Pi向けのカスタムLinuxをビルドする手順を解説した。

  • meta-raspberrypi レイヤー でRaspberry Piをサポート
  • MACHINE設定 でターゲットモデルを指定
  • wic形式 でSDカードイメージを生成
  • bmaptool で高速にSDカードに書き込み

これで、Raspbianとは異なる完全にカスタマイズされたLinuxをRaspberry Piで動かせるようになった。IoTプロダクトのプロトタイプから量産品まで、同じYoctoの仕組みが使える。

以下もおすすめだ。

PRRaspberry Pi 5 8GBAmazonで見る
PRMastering Embedded Linux Development 4th Ed (2024)Amazonで見る
PREmbedded Linux Development Using Yocto Project 3rd Ed (2023)Amazonで見る