2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Yocto ProjectでRaspberry Pi 5向けの自作Linuxディストリビューションをビルドする

Last updated at Posted at 2024-12-26

組み込みLinuxの開発を、ミッドレンジのAIも実行可能で4.0TOPSの性能を誇る VIA Technologies社のシングルボードコンピュータ「VAB-5000 で推進しようと考えた際に、OSの選択肢に 「Yocto 4.0」 がありました。そういえばYoctoってしばらくビルドしてないなぁ...と思ったので、まずは安価に入手できる 「Raspberry Pi 5」に合わせたLinuxディストリビューションをYocto Projectを使ってビルドする 手順をまとめてみました。今回ターゲットに選択したのは、Raspberry Pi 5の8GBモデルです。

813Do1DbZmL.AC_SX679.jpg

参考にさせていただきました記事

今回は下記の記事を参考にさせていただきました。ありがとうございます。

Yocto 4.0.23 (kirkstone) on Raspberry Pi 5

本記事ではビルド環境となるOSのセットアップから、ビルド環境の構築、ビルド用コンフィグファイルの設定、実際のビルドと実行結果までをまとめました。Yocto Projectで生成できる Raspberry Pi 5向けLinuxディストリビューションのGUI版の起動はやや手間取りますので、本記事では、CUI版のビルドを紹介し、その後にGUI版のビルドと実行方法を解説します。 Yocto ProjectではCUI版で利用したビルドの中間成果物はGUI版のビルドにも利用できます。これにより、先にCUI版をビルドしておくとGUI版のビルド時間が短縮されますので、CUI->GUIと2回ビルドする流れであっても、あまり時間は浪費しないかと思います。

kirkstoneとRaspberry Pi 5は組み合わせてはいけないようです。
対応記事の方をご確認ください。

非推奨な組み合わせ:Yocto Project 4.0.23 × Raspberry Pi 5

対策記事:Yocto Project 5.0.5(scarthgap) × Raspberry Pi 5

整合性に関する問題を修正し、 Linux Kernel 6.xに対応したYocto Project 5.0.5(scarthgap)を利用してLinuxカーネルのビルド環境も含む開発環境を構築する方法 を以下をご確認ください。こちらが正規手順となります。

参考:組み込みAIで利用されるTensorflowに対応したLinuxディストリビューションを生成する方法

本手順を参考に、組み込みAIなどに利用されるTensorflowを含んだLinuxディストリビューションを作成する方法については、下記の記事で紹介しています。あわせて、ご参照ください。


さて、はじめていきましょう。


ビルド環境を構築する

まず、Ubuntu 22.04 LTSをベースとしたビルド環境を構築します。

Ubuntu 22.04 LTSをインストールする

まず、Yocto 4.0.23のSystem Requirementに示されているビルド環境を整備します。今回はUbuntu 22.04 LTSを選択しました。USBメモリにインストールイメージを書き込み、標準構成でOSをセットアップします。

Screenshot from 2024-12-25 21-03-23.png

OSを最新の状態にし、必要なパッケージをインストールする

OSをセットアップした後、下記のコマンドを実行して環境を整備します。

# 英語(LANG=C)でホームに含まれるディレクトリを再構築する
$ LANG=C xdg-user-dirs-gtk-update 
# 再起動後から利用されるようになる
$ reboot

# すべてのパッケージを最新に更新する
$ sudo apt update
$ sudo apt upgrade

# 日本語入力機能とエディタをインストールする
$ sudo apt install ibus-mozc vim
$ im-config -n ibus

# sshサーバーをインストールする
$ sudo apt install openssh-server
$ sudo systemctl start ssh
$ sudo systemctl enable ssh

Screenshot from 2024-12-25 20-40-53.png

ビルドに必要な依存パッケージをインストールする

Ubuntu 22.04 LTSへYocto Projectのビルドに必要とされるパッケージをインストールします。Yocto Projectのサイトに書かれている内容をそのまま実行すれば問題ありません。

Screenshot from 2024-12-25 21-04-08.png

# System Requirementsで指定されたパッケージをインストールする
$ sudo apt install build-essential chrpath cpio debianutils diffstat file gawk gcc git iputils-ping libacl1 liblz4-tool locales python3 python3-git python3-jinja2 python3-pexpect python3-pip python3-subunit socat texinfo unzip wget xz-utils zstd

# localeにen_US.utf8を追加する
$ locale --all-locales | grep en_US.utf8
# en_US.utf8
$ sudo locale-gen en_US.UTF-8
# Generating locales (this might take a while)...
#   en_US.UTF-8... done
# Generation complete.

Raspberry Pi 5向けのLinuxディストリビューションをビルドするために必要なソースコードを入手する

以上でビルド環境は整いました。次に、Yocto ProjectでLinuxディストリビューションをビルドするために必要なソースコードとビルド用スクリプトを入手しましょう。

Yocto Project 4.0.23 をダウンロードする

今回はYocto Projectの安定版である Yocto 4.0.23(kirkstone) を利用します。まずビルドに備えて作業ディレクトリを作成してください。

####
# 作業ディレクトリを作成して、移動する
$ mkdir -p ~/yocto-work-2024_v1 
$ cd ~/yocto-work-2024_v1 

作成後、gitからソースコードとビルド環境一式である pokyを取得 します。これは git clone でリポジトリを取得した後に git checkout で4.0.23のタグであるkirkstoneに切り替えることで入手できます。

Screenshot from 2024-12-25 21-13-22.png

####
# yocto本体を取得する
$ cd ~/yocto-work-2024_v1
$ pwd
# /home/shino/yocto-work-2024_v1
$ git clone git://git.yoctoproject.org/poky
$ cd ./poky
$ git checkout -b kirkstone refs/tags/kirkstone-4.0.23
# Switched to a new branch 'kirkstone'

Raspberry Pi 5対応のBSP(meta-raspberrypi)をダウンロードする

続いて、Yoctoにより生成するLinuxディストリビューションをRaspberry Pi 5上で実行できるようにするために必要な Raspberry Pi 5対応のBSP(Board Support Package) を取得します。こちらも git clone でリポジトリを取得した後に git checkout で4.0.23のタグであるkirkstoneに切り替えることで入手できます。

Screenshot from 2024-12-25 21-17-12.png

####
# Raspberry Pi 5向けのBSPを取得する
## BSP = board support package
$ cd ~/yocto-work-2024_v1/poky
$ pwd
# /home/shino/yocto-work-2024_v1/poky
$ git clone git://git.yoctoproject.org/meta-raspberrypi
$ cd ./meta-raspberrypi
$ git checkout -b kirkstone origin/kirkstone
# Branch 'kirkstone' set up to track remote branch 'kirkstone' from 'origin'.
# Switched to a new branch 'kirkstone'

OpenEmbeddedをダウンロードする

次に、Linuxディストリビューションを構成する基本的なソフトウェアパッケージである OpenEmbedded を取得します。こちらも同様です。git clone でリポジトリを取得した後に git checkout で4.0.23のタグであるkirkstoneに切り替えることで入手できます。

Screenshot from 2024-12-25 21-21-03.png

####
# OpenEmbeddedを取得する
$ cd ~/yocto-work-2024_v1/poky
$ pwd
# /home/shino/yocto-work-2024_v1/poky
$ git clone git://git.openembedded.org/meta-openembedded
$ cd meta-openembedded
$ git checkout -b kirkstone origin/kirkstone
# Branch 'kirkstone' set up to track remote branch 'kirkstone' from 'origin'.
# Switched to a new branch 'kirkstone'

Linuxディストリビューションをビルドするための準備をする

必要なソースコードが揃いましたので、ビルド準備を進めていきましょう。

ビルドの準備を開始する

以上で必要なパッケージは揃いましたので、ビルドを始めていきます。まず、 oe-init-build-env スクリプトを実行して、ビルドに必要なコマンドへのパスを設定し、ビルド用ディレクトリを作成します。こちらのスクリプトを実行すると、 Yoctoのビルドで使えるターゲットの種類が表示されます。今回はオーソドックスな「core-image-minimal(CUI)」と「core-image-sato(GUI)」を利用 します。

####
# ビルドディレクトリと設定ファイルの生成
$ cd ~/yocto-work-2024_v1/poky
$ pwd
# /home/shino/yocto-work-2024_v1/poky
$ source oe-init-build-env my-build

Screenshot from 2024-12-25 21-24-21.png

ビルド対象にBSPとOpenEmbeddedのLayerを追加する

先の手順で入手した Raspberry Pi用のBSP「mera-raspberrypi」OpenEmbeddedにより提供されるパッケージ「meta-oe」「meta-python」「meta-multimedia」「meta-networking」 がLinuxディストリビューションに追加されるよう設定ファイルを変更します。設定ファイルを変更するには 「bitbake-layers add-layer」コマンド を使います。これを実行することにより「./conf/bblayers.conf」にレイヤーが挿入されます。

# 直前のコマンドにより作業ディレクトリがビルド用に切り替わる
$ pwd
# /home/shino/yocto-work-2024_v1/poky/my-build

# 生成された設定ファイルを確認
$ ls conf/
# bblayers.conf  
# local.conf  
# templateconf.cfg

# ビルド対象にRaspberry Pi 5 GUI向けのレイヤーを追加する
$ bitbake-layers add-layer ../meta-raspberrypi/
$ bitbake-layers add-layer ../meta-openembedded/meta-oe/
$ bitbake-layers add-layer ../meta-openembedded/meta-python/
$ bitbake-layers add-layer ../meta-openembedded/meta-multimedia/
$ bitbake-layers add-layer ../meta-openembedded/meta-networking/

# 設定ファイルにレイヤーが追加されていることを確認する
$ grep /home/shino ./conf/bblayers.conf 
  /home/shino/yocto-work-2024_v1/poky/meta \
  /home/shino/yocto-work-2024_v1/poky/meta-poky \
  /home/shino/yocto-work-2024_v1/poky/meta-yocto-bsp \
  /home/shino/yocto-work-2024_v1/poky/meta-raspberrypi \
  /home/shino/yocto-work-2024_v1/poky/meta-openembedded/meta-oe \
  /home/shino/yocto-work-2024_v1/poky/meta-openembedded/meta-python \
  /home/shino/yocto-work-2024_v1/poky/meta-openembedded/meta-multimedia \
  /home/shino/yocto-work-2024_v1/poky/meta-openembedded/meta-networking \

local.confでMACHINEにraspberrypi5を設定する

今回はビルドターゲットにRaspberry Pi 5を使いますので、 「./conf/local.conf」内でビルド対象のアーキテクチャ(ボード種別)を示す「MACHINE」指定子に「rapsberrypi5」を指定します。 ここのMACHINE名にはBSPであるmeta-raspberrypiのサイトに記載されているMachinesを指定できます。

Screenshot from 2024-12-25 21-36-33.png

# ビルド対象のアーキテクチャを選択する
## qemux86-64 を raspberrypi5 へと変更
$ vi conf/local.conf 
# ...
# This sets the default machine to be qemux86-64 if no other machine is selected:
MACHINE ??= "raspberrypi5"
#MACHINE ??= "qemux86-64"
# ...
# 変更して保存する

CUI版のLinuxディストリビューションをビルドする

Build (bitbake)

早速CUI構成のLinuxディストリビューションをビルドしてみましょう。このビルドは非常に簡単で、 bitbakeコマンドに先のターゲットの種類である「core-image-minimal」を指定 するだけです。ビルドでは3000~6000パッケージのダウンロードとコンパイルが行われます。完了までしばらくお待ちください。

###
# Yoctoでディストリビューションをビルドする
$ bitbake core-image-minimal
# ...
# NOTE: Executing Tasks
# NOTE: Tasks Summary: Attempted 6654 tasks of which 0 didn't need to be rerun and all succeeded.
$ 

Screenshot from 2024-12-26 07-06-48.png

デプロイするイメージを入手する

ビルドに成功するとビルドディレクトリの「./tmp/deploy/images/raspberrypi5」以下にRaspberry Pi 5の起動用micro-SDカードへ書き込むためのイメージが 「wic.bz2」形式で保存されます。wic形式はmicro-SD上に構築するパーティション情報を含んでいます。

####
# 生成されたイメージを確認する
# ※これをRaspberry Pi 5のmicro-SDカードへ書き込む
$ pwd
# /home/shino/yocto-work-2024_v1/poky/my-build
$ cd ./tmp/deploy/images/raspberrypi5
# ...
$ pwd
# /home/shino/yocto-work-2024_v1/poky/my-build/tmp/deploy/images/raspberrypi5

# wic.bz2のイメージが生成されています
$ ls *.bz2
# core-image-minimal-raspberrypi5-20241225215527.rootfs.tar.bz2
# core-image-minimal-raspberrypi5-20241225215527.rootfs.wic.bz2
# core-image-minimal-raspberrypi5.tar.bz2
# core-image-minimal-raspberrypi5.wic.bz2

micro-SD書き込みツールを取得し、OSイメージをインストールする

最後に、micro-SDカードへの書き込みツールである 「bmap-tools」 をインストールし、これを使って先のmicro-SDカード向けのイメージを 「bmaptool copy」 コマンドでRaspberry Pi 5ブート用のmicro-SDカードへ書き込みます。書き込む前にmicro-SDカードのパーティションがマウントされたままにならないよう umount しておいてください。下記のコマンドにより実行できます。sdXの部分は環境に合わせて選択してください。

###
# micro-SDカードへ書き込むツールをインストールする
$ sudo apt install -y bmap-tools

# micro-SDカードをumountする
$ sudo umount /dev/sdX1
$ sudo umount /dev/sdX2

# イメージをmicro-SDカードへ書き込む
$ sudo bmaptool copy ./core-image-minimal-raspberrypi5-20241225215527.rootfs.wic.bz2 /dev/sdX

####
# micro-SDカードをRaspberry Pi 5に差し込んで起動する
####

書き込み完了後、micro-SDカードをRaspberry Pi 5に挿入し、電源スイッチを投入することで、下記のように Yocto Projectにより生成した自作のLinuxディストリビューションが起動します。

WIN_20241226_07_00_12_Pro.jpg

GUIを持ったLinuxディストリビューションをビルドする

次にGUIを備えたLinuxディストリビューションをビルドして、実行してみましょう。 本来ならば、この作業はbitbakeにcore-image-satoを指定するだけでGUIを備えたLinuxディストリビューションを生成できるのですが、Raspberry Pi 5の環境では下記のエラーメッセージによりGUIが起動しません。 Raspberry Pi 5の場合はビルドして生成されたOSイメージをmicro-SDカードへ書き込んだ後に、Raspberry Pi 5のルートディレクトリ以下に設定ファイルをひとつ追加する必要あります。

X11の起動に失敗する (No screens found(EE))

Yocto ProjectでBSPにRaspberry Pi 5を選択し、core-image-satoでビルドしたOSイメージをそのまま起動すると起動中にハングアップします。 ハングアップしたOSは「Ctrl+Alt+F1」でCUIにログインでき、原因を確認できるのですが、私の環境では下記のエラーが発生していました。

「(EE) Failed to load module "fbdev" (module dose not exist, 0)」
「(EE) No device detected」
「(EE) No screens found(EE)」
「(EE) Please consult the The X.Org Fundation support」
「(EE) Please also check the log file at "/var/log/Xorg.0.log" for additional information」

WIN_20241226_08_01_01_Pro.jpg


そこで、下記の手順によりGUIを備えたRaspberry Pi 5向けのLinuxディストリビューションをビルドします。 CUI版と異なる点は、ビルドし、micro-SDカードにOSイメージを書き込んだ後に、micro-SDカード上に生成されたパーティション内へひとつ設定ファイルを作成する点 です。

# 作業ディレクトリは ./poky/my-build ※前回使ったもの
$ pwd
# /home/shino/yocto-work-2024_v1/poky/my-build

# GUI付きのLinuxディストリビューションをbitbakeする
$ bitbake core-image-sato
# ...
# NOTE: Executing Tasks
# NOTE: Tasks Summary: Attempted 6654 tasks of which 6654 didn't need to be rerun and all succeeded.

# ビルド成果物を確認する
$ cd ./tmp/deploy/images/raspberrypi5/
$ pwd
# /home/shino/yocto-work-2024_v1/poky/my-build/tmp/deploy/images/raspberrypi5

# micro-SDカードをビルド環境に接続する
# micro-SDカードをumountする(sdXは実際のデバイスにあわせてください)
$ sudo umount /dev/sdX1
$ sudo umount /dev/sdX2

# OSイメージをmicro-SDカードへ書き込む(sdXは実際のデバイスにあわせてください)
$ sudo bmaptool copy ./core-image-sato-raspberrypi5-20241225230217.rootfs.wic.bz2 /dev/sdX

# OSにGUIに関する設定ファイルを追加する(sdXは実際のデバイスにあわせてください)
$ sudo mount /dev/sdX2 /mnt/

# /etc/X11/xorg.conf.dディレクトリを追加する
$ sudo mkdir -p /mnt/etc/X11/xorg.conf.d/

# GUIに関する設定ファイルを追加する
## -->> https://github.com/agherzan/meta-raspberrypi/issues/1312
$ sudo vim /mnt/etc/X11/xorg.conf.d/99-vc4.conf
# 以下を記入する
Section "OutputClass"
  Identifier "vc4"
  MatchDriver "vc4"
  Driver "modesetting"
  Option "PrimaryGPU" "true"
EndSection

# 書き込みが終わったらmicro-SDカードをumnountする
$ sudo umount /mnt

####
# micro-SDカードをRaspberry Pi 5に差し込んで起動する
####

この問題は下記のフォーラムで確認されていました。

OSが起動すると、下記のようなGUIを確認することができます。

WIN_20241226_08_12_36_Pro.jpg

OpenGLを備えたcore-image-westonベースのLinuxディストリビューションをビルドする

bitbakeのGUI向けビルドオプションには「core-image-sato」の他に「core-image-weston」があります。こちらのほうがOpenGLを入っていたりとグラフィクスがリッチです。 ビルドにはまず、「./conf/local.conf」に下記のように「DISTRO_FEATURE:append」と「DISTRO_FEATURE:remove」の設定項目を追記 し、その後、「bitbake core-image-weston」 を実行してください。下記のようなデスクトップを備えたLinuxディストリビューションをビルドすることができます。

WIN_20241226_11_26_55_Pro.jpg

参考にさせていただきましたサイト

$ vi conf/local.conf
# ...
DISTRO ?= "poky"
# As an example of a subclass there is a "bleeding" edge policy configuration
# where many versions are set to the absolute latest code from the upstream 
# source control systems. This is just mentioned here as an example, its not
# useful to most new users.
# DISTRO ?= "poky-bleeding"

DISTRO_FEATURES:append = " wayland opengl"
DISTRO_FEATURES:remove = " x11"
MACHINE_FEATURES += "vc4graphics"
# 上記の3行をDISTRO指定子の後に追加する

#...
## 保存する

# Linuxディストリビューションをビルドする
$ bitbake core-image-weston
# ...
# NOTE: Executing Tasks
# NOTE: Tasks Summary: Attempted 6654 tasks of which 6654 didn't need to be rerun and all succeeded.

Screenshot from 2024-12-26 11-08-22.png

bitbake後、以下の手順でmicro-SDにOSイメージを書き込みます。イメージを書き込んだmicro-SDカードでRaspberry Pi 5を起動すると、core-image-satoよりも少しリッチなGUI付きLinuxディストリビューションを利用することができます (※本構成はX11を利用していないため、先に挙げたX11に関する追加の設定ファイルを作る必要はありません)

# ビルド成果物を確認する
$ cd ./tmp/deploy/images/raspberrypi5/
$ pwd
# /home/shino/yocto-work-2024_v1/poky/my-build/tmp/deploy/images/raspberrypi5

# micro-SDカードをビルド環境に接続する
# micro-SDカードをumountする(sdXは実際のデバイスにあわせてください)
$ sudo umount /dev/sdX1
$ sudo umount /dev/sdX2

# OSイメージをmicro-SDカードへ書き込む(sdXは実際のデバイスにあわせてください)
$ sudo bmaptool copy ./core-image-weston-raspberrypi5-20241226020102.rootfs.wic.bz2 /dev/sdX

####
# micro-SDカードをRaspberry Pi 5に差し込んで起動する
####

以下のように、少し見慣れたGUIが起動します。

WIN_20241226_11_26_55_Pro.jpg


以上が、Raspberry Pi 5向けのLinuxディストリビューションをYocto Projectを使って生成する手順となります。 Yocto Projectにより生成したLinuxディストリビューションは、DebianベースのRaspbian OSに比べてフットプリントが小さいため、非常に軽量で、リソースの浪費を防ぐことができます。 是非、みなさまの開発にお役立てください。


補足:今回使わなかったRaspberry Pi Imager

今回の手順では使いませんでしたが、Raspberry PiのOSイメージをmicro-SDカードへと書き込むRaspberry Pi Imagerは、下記の手順でインストールすることができます。apt周りに少々準備が必要だったので、参考として掲載しておきます。

###
# rpi-imagerをインストールする
## 先にapt-getの依存関係を整理しておく
$ sudo apt-get update
$ sudo apt --fix-broken install
$ sudo dpkg --configure -a
$ sudo apt-get clean
## rpi-imagerをインストールする
$ sudo apt install rpi-imager
# Reading package lists... Done
# Building dependency tree... Done
# Reading state information... Done
# rpi-imager is already the newest version (1.8.5).
# 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.


以上です。ありがとうございました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?