2021 年 09 月 17 日
Raspberry Pi3 で EMLinux(Yocto ベース 組込み専用 OS)を動かしてみよう
Pi3 とは
Raspberry Pi(ラズベリー パイ)は、ARM プロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。日本語では略称としてラズパイとも呼ばれる。(Wikipedia より)
Pi3 はラズパイのうち、第 3 世代のボードのことをこう呼びます。Pi3 ボードだけでは電源もないので、これに電源・ストレージメディア(SD カード)・ケース(ファン付き)・OS 焼きこみツールなどをつけて、今すぐ使えるセットがネット通販で 1 万円ぐらいで販売されています。
最も簡単な使い方は「Raspberry Pi OS」をダウンロードして、セットについている焼きこみツールでストレージメディアに書き込み、ラズパイボードの SD スロットに差し込んで、電源を投入すると起動します。
今回の検証では、Yocto ベースの OS として組込み Linux OS「EMLinux」を採用しデバイスとして「Raspberry Pi 3 Model B+」を使ってカスタマイズ可能なラズパイベースの試験機作成を目標にしています。
EMLinux(Yocto ベース OS)とは
サイバートラストが提供している組込み向け OS「EMLinux」は Yocto ツールを使って OS をビルド(イメージ作成)していきます。サイバートラスト EMLinux のホームページから「EMLinux 無償評価版」をダウンロードすると、Yocto のレシピ(ビルド手順)とともに「EMLinux x.x ユーザマニュアル」が提供されますので、「Qemu イメージの作成」の章を参考にイメージを作成して行きます。
構築手順は以下の通りです。
- 母艦の用意
- EMLinux の入手
- EMLinux のビルド
- ラズパイ起動モジュールの入手
- 起動設定ファイルの用意
- ブートメディアの準備
- イメージのコピー
- 起動&確認
1. 母艦の用意
母艦(組込み機器では、イメージをビルドする機材を母艦と言います)の環境として、ubuntu18.04(※)が必要です。ubuntu は仮想環境でも問題ありませんが、SD にイメージを書き込むときに ubuntu から直接 SD ドライブをマウントする必要があります。また、ubuntu の環境からインターネットが参照できるよう設定してください。EMLinux のビルドは結構ストレージ容量を必要とします。ちなみに私の母艦でイメージを1つビルドした状態の実測で約 40GB を消費しています。
- EMLinux の 8 月版リリースでは、母艦の環境として、ubuntu20.04 が使用可能となっています。
2. EMLinux の入手
EMLinux は以下のページより評価版を入手して下さい。
https://www.cybertrust.co.jp/iot/emlinux.html
EMLinux の無償評価版は最新版の 6 ヶ月前のバージョンになっており、そのリリースから最新版までに行われた各種の修正は反映されていません。
- 最新版をお求めの場合は、有償の開発用 SDK、短期サブスクリプション、年間サブスクリプションをご購入ください。
3.EMLinux のビルド
EMLinux のビルド(イメージ作成)は Yocto を用いて行います。ダウンロードファイルの展開からビルドは以下の通りです。
- 以降の作業は EMLinux 2021 年 1 月版を使用しています。イメージのビルドは基本、ユーザマニュアルを参考にして実行します。
- ラズパイ用のイメージ作成については、ソースディレクトリ解凍後の下記ファイルも参考にしてください。
emlinux-2.2-202101/repos/meta-emlinux/doc/raspberrypi3.md
ダウンロードした「EMLinux」を解凍し展開します。
$ unzip EMLinux_2.2-202101.zip
$ tar zxf EMLinux_2.2-202101/source/emlinux-2.2-202101.tar.gz
$ cd emlinux-2.2-202101
source コマンドで設定スクリプトを実行します。2 番目の引数は任意の作業ディレクトリ名です。
必要なディレクトリが作成されて、ビルドに必要なレシピやソースが展開されます。展開後、作業ディレクトリに移動して完了します。
$ source setup-emlinux build
ターゲットがラズパイであることを設定して、bitbake コマンドでビルドが開始します。
$ echo 'MACHINE = "raspberrypi3-64"' >> conf/local.conf
$ bitbake core-image-minimal
ビルド中いくつか「WARNING」が表示されますが、代替えサイトを探しに行くときのメッセージがほとんどで、基本的には「ERROR」が表示されていなければ問題ありません。
このように「running tasks」が表示されていれば、ビルドは継続しています。ビルドは CPU のコア数、CPU の速度、ストレージの速度、ネットワークの速度により 2 時間から 6 時間程度時間がかかります。
Currently 2 running tasks (183 of 2748) 6% |####
0: binutils-cross-aarch64-2.31.1-r0 do_compile - 361s (pid 8096)
1: linux-libc-headers-base-gitAUTOINC+d0a2919cfb-r0 do_fetch (pid ・・・
ビルドが完了したときの確認は、以下の通りです。なお、何かの問題で途中で処理が中断していても「ビルド手順」の source コマンドからやり直せば、続きからはじまります。
NOTE: Tasks Summary: Attempted 2748 tasks of which 1519 didn't need to be rerun and all succeeded.
- 「didn't need to be rerun and all succeeded.」は、. ビルドの再実行が必要ないことを示しています。この状態で再実行してもすぐに完了します。
ビルドイメージは source コマンドで指定した(今回は「build」で指定)ディレクトリ配下に生成されます。
$ ls emlinux-2.2-202101/build/tmp-glibc/deploy/images/raspberrypi3-64
:
Image--git0+d0a2919cfb-r0-raspberrypi3-64-20210629002756.bin
bcm2837-rpi-3-b--git0+d0a2919cfb-r0-raspberrypi3-64-20210629002756.dtb
bcm2837-rpi-3-b-plus--git0+d0a2919cfb-r0-raspberrypi3-64-20210629002756.dtb
core-image-minimal-raspberrypi3-64-20210629002756.rootfs.manifest
core-image-minimal-raspberrypi3-64-20210629002756.rootfs.tar.gz
core-image-minimal-raspberrypi3-64-20210629002756.testdata.json
modules--git0+d0a2919cfb-r0-raspberrypi3-64-20210629002756.tgz
u-boot-raspberrypi3-64-2019.01-r0.bin
- 「Image--git0+d0a2919cfb-r0-raspberrypi3-64-20210629002756.bin」は、カーネルイメージ:「Image」のリンクからコピーできます。
- 「bcm2837-rpi-3-b--git0+d0a2919cfb-r0-raspberrypi3-64-20210629002756.dtb」は、ドライバイメージ:「bcm2837-rpi-3-b-plus.dtb」のリンクからコピーできます。
- 「bcm2837-rpi-3-b-plus--git0+d0a2919cfb-r0-raspberrypi3-64-20210629002756.dtb」は、ルートファイルイメージ:「core-image-minimal-raspberrypi3-64.tar.gz」のリンクからコピーできます。
- 「core-image-minimal-raspberrypi3-64-20210629002756.testdata.json」は、u-boot イメージ:「u-boot.bin」のリンクからコピーできます。
4.ラズパイ起動モジュールの用意
ラズパイの標準ブートモジュールを GitHub から入手します。GitHub にユーザ登録をしてから、以下からダウンロードしてください。
https://github.com/raspberrypi/firmware
ページに入り[Code ▼]ボタンのプルダウンボックスから一番下の Download ZIP を選択して、一括ダウンロードして解凍してください。
zip ファイルを解凍すると、firmware-master というディレクトリが作成されます。ここで必要なファイルは以下のファイルです。
ラズパイの初期起動モジュール
firmware-master/boot/bootcode.bin
ラズパイの初期起動ドライバ
firmware-master/boot/start.elf
5.起動設定ファイルの用意
ラズパイ起動用の設定ファイルを用意し config.txt で保存します。設定ファイルの中身は以下です。
[all]
boot_delay=1
kernel=u-boot.bin
# Put the RPi3 into 64 bit mode
arm_control=0x200
- 「kernel=u-boot.bin」で、EMLinux ビルド時に作成された u-boot イメージを指定します。
- 「arm_control=0x200」で、64bit カーネルで動かすことを指定します。
u-boot 起動用の設定ファイルを用意します。設定ファイル(boot.cmd の名前で保存します)の中身は以下です。
fatload mmc 0 ${kernel_addr_r} Image
fatload mmc 0 ${fdt_addr_r} bcm2837-rpi-3-b-plus.dtb
setenv bootargs dwc_otg.lpm_enable=0 earlyprintk root=/dev/mmcblk0p2 rootfstype=ext4 rootwait
booti ${kernel_addr_r} - ${fdt_addr_r}
- 「fatload mmc 0 ${kernel_addr_r} Image」で、EMLinux ビルド時に作成された kernel イメージ名を指定します。
- 「fatload mmc 0 ${fdt_addr_r} bcm2837-rpi-3-b-plus.dtb」で、EMLinux ビルド時に作成された ドライバイメージ名を指定します。
- 「root=/dev/mmcblk0p2 rootfstype=ext4 rootwait」で、EMLinux のルートファイルの場所を指定します。
このファイルは以下のコマンドでイメージを作成して、使用します。
sudo mkimage -C none -A arm64 -T script -d ./boot.cmd ./boot.scr
boot.scr を使用します。
6.ブートメディアの準備
ラズパイは SD カードからブート(起動)します。SD カードにブート用のパーティションと Linux 用のパーティションを作成します。SD カードを母艦の SD デバイスにマウントし、マウントポイント確認します。以下は「/dev/mmcblk1」に SD カードがマウントされた時のコマンドです。
- SD カードにパーティションが残っている場合は削除してから以下を実行してください。
$ sudo sudo parted /dev/mmcblk1 mkpart primary fat32 1024KiB 256MiB
$ sudo sudo parted /dev/mmcblk1 mkpart primary ext4 256MiB 16GiB
$ sudo mkfs.vfat -n rpi -F32 /dev/mmcblk1p1
$ sudo mkfs.ext4 -L rootfs /dev/mmcblk1p2
上記のコマンドで SD カードは図のようにフォーマットされます。パーティションのサイズや名前は変更可能ですがフォーマットはそれぞれ vfat と ext4 に設定してください。
7.イメージのコピー
ここまでに用意したイメージを SD カードにコピーします。
$ sudo mkdir /mnt/rpi
$ sudo mkdir /mnt/rootfs
$ sudo mount /dev/mmcblk1p1 /mnt/rpi
$ sudo mount /dev/mmcblk1p2 /mnt/rootfs
$ sudo cp firmware-master/boot/start.elf /mnt/rpi/.
$ sudo cp firmware-master/boot/bootcode.bin /mnt/rpi/.
$ sudo cp config.txt /mnt/rpi/.
$ sudo cp boot.scr /mnt/rpi/.
$ sudo cp emlinux-2.2-202101/... 中略 .../Image /mnt/rpi/.
$ sudo cp emlinux-2.2-202101/... 中略 .../bcm2837-rpi-3-b-plus.dtb /mnt/rpi/.
$ sudo cp emlinux-2.2-202101/... 中略 .../u-boot.bin /mnt/rpi/.
$ sudo tar xvzf emlinux-2.2-202101/... 中略 .../core-image-minimal-raspberrypi3-64.tar.gz -C /mnt/rootfs/.
8.起動&動作確認
コピーが完了した SD カードをラズパイに差し込み電源を入れて起動します。ラズパイは HDMI 出力が可能なので、モニタを接続しておいてください。モニターにログインプロンプトが表示されれば動作確認完了です。
root ユーザがパスワード無しでログイン可能になります。
ログイン後「init 0」コマンドでシャットダウンしてから電源を OFF にしてください。
黄色い LED が点滅すると起動中です。赤い LED は電源が入っていることを示しています。
最後に
今回はラズパイに、ラズパイ以外から提供されている OS をインストールする手順を紹介しました。なるべくシンプルにするために、極力不要なモジュールを導入しないようにしています。次回は、ネットワーク機器などを使えるようにする方法も紹介します。
最後に今回のラズパイのブートシーケンスの概念図を紹介しておきます。厳密には起動、読み込みが一部異なりますが、おおむねこの順番で起動が進みます。