Yocto ProjectによるRaspberry Pi用のカスタムLinux作成

RaspberryPi向けの自分専用のカスタムLinuxイメージの作成に関する備忘録。

最小構成のLinuxに対して、機能をトッピングしてイメージを作成するプロジェクトらしい。

Yocto Project Quick Start

ビルド環境はUbuntu16.02LTSを使用する。
ちなみに、Windows10 Anniversary UpdateのWSL(Windows Subsystem for Linux)上では、ビルドできない
Yocto build fail #1291

自分の開発環境でもbitbakeコマンドが失敗する。上記では、inotify?がどうたらこうたらとあるが、次期の大型アップデートであるCreators Updateで対応済みとのこと。

Ubuntuビルド環境のセットアップ

まず、Ubuntu環境にビルドに必要なパッケージをインストールする

> sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev xterm

Pokyのインストール

Yocto Projectのpokyをリモートリポジトリからダウンロードする。このpokyは、Linuxをビルドするための各種ツール群だと思えばよい。

> git clone git://git.yoctoproject.org/poky

polyも日々更新されているので、最新が何になるかは、以下のURLから確認する。

Yocto Project Release

執筆時の最新Stableな最新ブランチはMortyなのでmortyブランチに切り替える。

> cd poky
> git checkout morty

pokyを導入した直後のディレクトリ構成は以下になる。

> ls -l
-rw-rw-r--  1 hoge hoge   515  3月 25 21:31 LICENSE
-rw-rw-r--  1 hoge hoge  2467  3月 25 21:31 README
-rw-rw-r--  1 hoge hoge 12832  3月 25 21:33 README.hardware
drwxrwxr-x  6 hoge hoge  4096  3月 25 21:31 bitbake
drwxrwxr-x 14 hoge hoge  4096  3月 25 21:33 documentation
drwxrwxr-x 20 hoge hoge  4096  3月 25 21:31 meta
drwxrwxr-x  5 hoge hoge  4096  3月 25 21:31 meta-poky
drwxrwxr-x  7 hoge hoge  4096  3月 25 21:33 meta-selftest
drwxrwxr-x  7 hoge hoge  4096  3月 25 21:31 meta-skeleton
drwxrwxr-x  3 hoge hoge  4096  3月 25 21:31 meta-yocto
drwxrwxr-x  8 hoge hoge  4096  3月 25 21:33 meta-yocto-bsp
-rwxrwxr-x  1 hoge hoge  2121  3月 25 21:31 oe-init-build-env
-rwxrwxr-x  1 hoge hoge  2559  3月 25 21:31 oe-init-build-env-memres
drwxrwxr-x  8 hoge hoge  4096  3月 25 21:33 scripts

フォルダ名が==meta-*==になっているものが、Linuxビルドするときのレシピになる。

Raspberry Pi向けレシピのインストール

pokyのみだと、最小構成のレシピしかないので、ここにRaspberryPi用のレシピを追加する。openembedded関連は、RaspberryPiレシピが依存しているようなので、追加でインストールしておく。

> cd poky
> git clone -b morty git://git.openembedded.org/openembedded-core
> git clone -b morty git://git.openembedded.org/meta-openembedded
> git clone -b morty git://git.yoctoproject.org/meta-raspberrypi

ビルド環境の設定

Pokyに含まれるoe-init-build-envシェルを使って、必要な環境変数等を設定する。第一引数に任意のビルドディレクトリ名を指定する。

> ./oe-init-build-env build_raspi

シェルを実行すると、自動的に指定した名前のフォルダと設定ファイルを作成する。

build_raspi
 └ conf
    ├ bblayers.conf
    ├ local.conf
    └ templateconf.cfg

レイヤーの追加

このままだと、クローンしたmeta-raspberrypiが設定に含まれていない。作成されたビルドディレクトリ直下で、以下のbitbake-layersコマンドでbblayers.confに設定を追加する。

> cd build_raspi
> ../bitbake/bin/bitbake-layers add-layer ../meta-yocto
../bitbake/bin/bitbake-layers add-layer ../meta-raspberrypi

bblayers.confの中身は以下のとおり

# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
  /home2/work/poky/meta \
  /home2/work/poky/meta-poky \
  /home2/work/poky/meta-yocto \
  /home2/work/poky/meta-yocto-bsp \
  /home2/work/poky/meta-raspberrypi \
  "

ビルド設定

local.confファイルの設定について、とりあえずモデル名だけ設定しておく。
meta-raspberrypiのメモを見ると、モデルに合わせた名称がある(RaspberryPi Zero Wはまだない)今回は、WifiやBluetoothドライバが含まれているであろうRaspberryPi3向けのイメージを作成してみる。

ほかにはビルド時間を軽減するためにスレッド数()を定義する。基本的にはコア数x2程度を設定する。クアッドコアのCPUを使用しているので、8に設定してみた。

あと、ダウンロードしたソースパッケージを再利用(ほかのビルドでも利用する)する場合は、DL_DIRを別のディレクトリにしたほうが無駄がDLが発生しなくなる。

> vi build_raspi/conf/local.conf

# This sets the default machine to be qemux86 if no other machine is selected:
MACHINE ??= "raspberrypi2"

BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"

DL_DIR ?= "/home2/work/poky/poky-downloads"

RaspberryPi用のイメージビルド

bitbakeコマンドでビルドを実行する。注意点として、bitbakeコマンド群があるパスが環境変数PATHに含まれていないと、途中でエラーになるので設定しておく。

raspberrypi向けのオプションは、2種類

  • rpi-basic-image -- 起動時にスプラッシュスクリーンが表示される。
  • rpi-hwup-image -- スクリーンなし。こっちの方が起動が早い?
> export PATH=<インストールパス>/poly/bitbake/bin:$PATH
> cd build_raspi
> bitbake rpi-basic-image
:
No currently running tasks (2123 of 2124)  99% |##################################################
NOTE: Tasks Summary: Attempted 2124 tasks of which
 9 didn't need to be rerun and all succeeded.

Summary: There was 1 WARNING message shown.

ビルドが完了すると、ビルドフォルダ直下のtmpディレクトリ以下にsdimgイメージが作成される。

> cd ./tmp/deploy/images/raspberrypi3
> ls -l *sdimg
-rw-r--r-- 2 hoge hoge 125829120  3月 25 20:18 rpi-hwup-image-raspberrypi3-20170325100942.rootfs.rpi-sdimg
lrwxrwxrwx 2 hoge hoge        59  3月 25 20:18 rpi-hwup-image-raspberrypi3.rpi-sdimg -> rpi-hwup-image-raspberryp
i3-20170325100942.rootfs.rpi-sdimg

SDカードへの書き込み

  • MAC OSXの場合

SDカードを本体に挿した後、どのデバイスで認識したかを確認してマウントを解除する。容量から==/dev/disk3==とわかる。

> diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +249.8 GB   disk1
                                 Logical Volume on disk0s2
                                 DD1FC4A6-7450-4632-9200-70E12D81B231
                                 Unencrypted
/dev/disk2 (disk image):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        +4.4 GB     disk2
   1:             Windows_FAT_32 boot                    66.1 MB    disk2s1
   2:                      Linux                         4.3 GB     disk2s2
/dev/disk3 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *8.0 GB     disk3
   1:             Windows_FAT_32 raspberrypi             41.9 MB    disk3s1
   2:                      Linux                         641.7 MB   disk3s2

> diskutil unmountDisk /dev/disk3
Unmount of all volumes on disk3 was successful

書き込みは以下で成功している。disk3の前にrをつけると早くなるらしい。

> sudo dd bs=4m if=./rpi-hwup-image-raspberrypi3.rpi-sdimg of=/dev/rdisk3