とかげ備忘録

IT系の備忘録です。

YoctoでRaspberry Pi 4 64bitのOSイメージを作成する。(動作確認 未)

1.Yocto Project とは

(1)IoTって何?

IoT(Internet of Things)モノのインターネット。 私たちの身近にあるもの(車、自販機、家電製品など)が インターネットと紐づいている仕組みのことです。 モノが通信をしてくれるおかげで、
遠隔で冷蔵庫の中身をチェックできたり、
自販機のドリンクの在庫状況をチェックして、補充作業が効率的になっています。

(2)組込みボードって何?

この説明では、家電製品や、カーナビ、スマートメーターなどの中に入っている、
小型コンピュータのことをこう呼んでおきます。

(3)どんなボードがあるの?

電子工作分野では、
Arduinoや、Raspberry Piが有名でしょうか。
比較的に安価なので、学生さんにも手に入りやすく、
学習や遊びで使えると思います。

産業用だと、


社のボードなどがあります。

そんな各種ボードに対応したOSイメージを このツールひとつで、手軽に作れるというわけですね。

2.Raspberry Pi用のOSイメージを作ってみる

個人でラズパイを持っていない(笑)ので、とりあえず構築までの手順をやってみようと思います。

(1)作業の準備

仮想環境を作ってやります。

  • 環境、スペックなど
    • 容量:80GB  ←(大きい方が良いです)
    • CPU:corei5の2コア分  ←(性能が高い方が良いです)
    • メモリ:4GB ←(大きい方g(ry))

今回は、普段使っているノートPCからやったので、低スペックです。
ビルドはものすごく時間がかかるので、スペックは高い方がいいです。
(実際、上記のリソースを使ってビルドしたら、最小イメージで5時間くらいはかかったと思います。)

f:id:ttokage2233:20200120232356p:plain

  • VMware Workstation Player をダウンロード

https://www.vmware.com/jp/products/workstation-player/workstation-player-evaluation.html

  • Ubuntu16.04をダウンロード

OSはUbuntu16.04を使いました。
https://www.ubuntulinux.jp/News/ubuntu1604-ja-remix

(2)とりあえず、インストール

Ubuntu16.04をインストールしました。 この辺りは、画面の指示通りに進めていっただけなので、割愛します。

f:id:ttokage2233:20200120232524p:plain

(3)リファレンスマニュアルに沿ってYocto導入

下記URLの導入部分を読み、必要なパッケージをインストールします。
Yocto Project Reference Manual

$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \
     build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
     xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
     pylint3 xterm
$ sudo apt-get install make xsltproc docbook-utils fop dblatex xmlto

(4)Pokyのダウンロード

Yoctoで使われているビルドツールPokyをダウンロードします。

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

(リビジョン:ecbf203e34484731dcb6acc5e75df79cb86e55dc)

(5)ラズパイ用の必要パッケージをダウンロード

ラズパイのBSP(Board Support Package)

$ git clone https://github.com/agherzan/meta-raspberrypi.git

(リビジョン:e7c856ee7bcfd7878853b55310957f0b9a990fd2)


依存レイヤーのmeta-openembeddedを指定してみたら、
そのレイヤー直下に conf/layer.confが無いらしく、エラーとなりました。
バージョンが古いのだろうか・・・。
$ git clone git://git.openembedded.org/meta-openembedded
これが無くてもビルドは通りました。なのでスキップしておきます。

(6)Yoctoビルド環境の設定

$ source oe-init-build-env

ビルド用のディレクトリ(build)が作成され、 Yoctoビルド用の環境変数なども設定されます。

(7)bblayer.confの編集

先ほどダウンロードしたレイヤー(meta-***)の設定をします。

~/poky/build$ vi conf/bblayers.conf
-----------
~~
  /home/tasky/poky/meta-yocto-bsp \
  /home/tasky/poky/meta-raspberrypi \   ←追加
  "
~~
-----------

(8)local.confの編集

実際にOSイメージを使うターゲットボード(マシン名)を指定します。
マシン名は、各ボードのリファレンスマニュアルに書いてあれば、
すぐに指定できるのですが、見つからない場合は、レイヤー(meta-***)から探します。
docs/layer-contents.md の中身とか、
conf/以下のディレクトリあたりで・・・。

-----------
~/poky$ cd meta-raspberrypi/
~/poky/meta-raspberrypi$ ls conf/machine/
include               raspberrypi0-wifi.conf  raspberrypi3.conf
raspberrypi-cm.conf   raspberrypi0.conf       raspberrypi4-64.conf
raspberrypi-cm3.conf  raspberrypi2.conf       raspberrypi4.conf
raspberrypi.conf      raspberrypi3-64.conf
-----------

ありました。では、今回は raspberrypi4-64をお試しで指定してみます。

~/poky/build$ vi conf/local.conf
-----------
~~
MACHINE ?= "raspberrypi4-64"    ←追加
~~
BB_NUMBER_THREADS = '2'     ←ビルド時のスレッド指定(CPUがマルチコア対応なら2倍の数でよい)
PARALLEL_MAKE = '-j 2'      ←ビルド時に使うスレッドの最大数(CPUがマルチコア対応なら2倍の数でよい)
-----------


↑*スレッド指定の例
使用CPU(4コア、8スレッド)の場合、下記のようにしておくと、ビルドが早いです。
BB_NUMBER_THREADS = '8'
PARALLEL_MAKE = '-j 8'

(9)ビルド

今回は最小構成のOSイメージを作ります。

$ bitbake core-image-minimal

(とても時間がかかる)
(本来なら、ガチガチの高スぺPCを使います(笑))

(10)成果物の確認

うまくビルドができていれば、
ビルドディレクトリ(build)から
tmp/deploy/images/(マシン名) に、作成されているはずです。

実際の確認画面
----------
~/poky/build$ ls tmp/deploy/images/raspberrypi4-64/
Image
Image-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.bin
Image-raspberrypi4-64.bin
at86rf233-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
at86rf233-raspberrypi4-64.dtbo
at86rf233.dtbo
bcm2711-rpi-4-b-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtb
bcm2711-rpi-4-b-raspberrypi4-64.dtb
bcm2711-rpi-4-b.dtb
bcm2835-bootfiles
core-image-minimal-raspberrypi4-64-20200119105629.rootfs.ext3
core-image-minimal-raspberrypi4-64-20200119105629.rootfs.manifest
core-image-minimal-raspberrypi4-64-20200119105629.rootfs.rpi-sdimg
core-image-minimal-raspberrypi4-64-20200119105629.rootfs.tar.bz2
core-image-minimal-raspberrypi4-64-20200119105629.testdata.json
core-image-minimal-raspberrypi4-64.ext3
core-image-minimal-raspberrypi4-64.manifest
core-image-minimal-raspberrypi4-64.rpi-sdimg
core-image-minimal-raspberrypi4-64.tar.bz2
core-image-minimal-raspberrypi4-64.testdata.json
dwc2-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
dwc2-raspberrypi4-64.dtbo
dwc2.dtbo
gpio-key-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
gpio-key-raspberrypi4-64.dtbo
gpio-key.dtbo
hifiberry-amp-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
hifiberry-amp-raspberrypi4-64.dtbo
hifiberry-amp.dtbo
hifiberry-dac-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
hifiberry-dac-raspberrypi4-64.dtbo
hifiberry-dac.dtbo
hifiberry-dacplus-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
hifiberry-dacplus-raspberrypi4-64.dtbo
hifiberry-dacplus.dtbo
hifiberry-digi-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
hifiberry-digi-raspberrypi4-64.dtbo
hifiberry-digi.dtbo
i2c-rtc-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
i2c-rtc-raspberrypi4-64.dtbo
i2c-rtc.dtbo
iqaudio-dac-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
iqaudio-dac-raspberrypi4-64.dtbo
iqaudio-dac.dtbo
iqaudio-dacplus-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
iqaudio-dacplus-raspberrypi4-64.dtbo
iqaudio-dacplus.dtbo
mcp2515-can0-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
mcp2515-can0-raspberrypi4-64.dtbo
mcp2515-can0.dtbo
modules-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.tgz
modules-raspberrypi4-64.tgz
pi3-disable-bt-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
pi3-disable-bt-raspberrypi4-64.dtbo
pi3-disable-bt.dtbo
pi3-miniuart-bt-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
pi3-miniuart-bt-raspberrypi4-64.dtbo
pi3-miniuart-bt.dtbo
pitft22-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
pitft22-raspberrypi4-64.dtbo
pitft22.dtbo
pitft28-capacitive-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
pitft28-capacitive-raspberrypi4-64.dtbo
pitft28-capacitive.dtbo
pitft28-resistive-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
pitft28-resistive-raspberrypi4-64.dtbo
pitft28-resistive.dtbo
pitft35-resistive-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
pitft35-resistive-raspberrypi4-64.dtbo
pitft35-resistive.dtbo
pps-gpio-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
pps-gpio-raspberrypi4-64.dtbo
pps-gpio.dtbo
rpi-ft5406-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
rpi-ft5406-raspberrypi4-64.dtbo
rpi-ft5406.dtbo
rpi-poe-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
rpi-poe-raspberrypi4-64.dtbo
rpi-poe.dtbo
vc4-fkms-v3d-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
vc4-fkms-v3d-raspberrypi4-64.dtbo
vc4-fkms-v3d.dtbo
vc4-kms-v3d-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
vc4-kms-v3d-raspberrypi4-64.dtbo
vc4-kms-v3d.dtbo
w1-gpio-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
w1-gpio-pullup-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-64-20200119105629.dtbo
w1-gpio-pullup-raspberrypi4-64.dtbo
w1-gpio-pullup.dtbo
w1-gpio-raspberrypi4-64.dtbo
w1-gpio.dtbo
----------

生成されていました。

(11)ブート用SDカードの作成(動作未確認)

動作確認ができないため、以下エアプです。
参考程度にしてもらえればと思います。

出来上がったOSイメージを、SDカードに書き込みます。

  • SDカードの確認 SDカード挿入後
$ dmesg | tail
$ mount

などのコマンドでSDカードが認識されているか確認します。
(SDカード認識例:/dev/sdb)

(もしマウントされていたら、アンマウントしておきます)

$ sudo umount /dev/sdb*
  • OSイメージの書き込み
~/poky/build/$ cd tmp/deploy/images/raspberrypi4-64
$ sudo dd if=core-image-minimal-raspberrypi4-64.rpi-sdimg of=/dev/sdb bs=1M

3.まとめ

Yoctoはカスタムlinuxが作れるツールです。
全体のOSイメージの構築の流れを紹介しました。

4.参考URL

  • Yoctoリファレンスマニュアル

https://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html

  • ラズパイBSP

https://git.yoctoproject.org/cgit/cgit.cgi/meta-raspberrypi/about/

  • Yoctoのクイックスタートガイド

https://www.yoctoproject.org/docs/2.4.2/yocto-project-qs/yocto-project-qs.html