Raspberry Pi Zero W向けにYoctoをカスタマイズする

WEBサービス開発グループの堀です。
前回から随分と間が空いてしまいましたが、今回はYocto Projectのカスタマイズ方法についての紹介です。

カスタマイズ用にレシピ(メタデータ)を作成する方法もありますが、手軽にできるビルド用ディレクトリ配下にある「bblayers.conf」「local.conf」に追加したいパッケージなどを記述する方法でwifiやbluetoothが使用できるRaspberry Pi Zero W用のカスタムイメージを作成してみます。

ビルド環境を準備する

前回と同じ内容になりますが、Yocto本体とmeta-raspberrypiをgitで取ってきてビルド環境を準備します。10/26に新バージョンrocko(2.4)がリリースされていますが、引き続きpyroを使用します。(まだビルドがいくつか通らないところがあって様子を見ています)

bblayers.confの編集してレイヤーを追加する

bblaysers.confのBBLAYERS変数に利用したいレシピのあるレイヤー(メタデータ)のパスを指定します。例えば前回追加したmeta-raspberrypi配下のrecipes-devtoolsは以下のようになっていて、meta-raspberrypiを指定することでGPIOを制御するライブラリwiringPiを追加することができるようになります。

レイヤーによっては依存関係のあるものがあり、別のレイヤーを一緒に追加する必要があったりしますので注意が必要です。レイヤーの追加には前回紹介したbitbake-layersコマンドを使用できますが、直接ファイルを編集しても問題ありません。(将来的には変わるかも?)

今回はmeta-openembeddedを取ってきてmeta-oe(各種ライブラリ)、meta-networking(ネットワーク関係) 、meta-perl(perl依存のものが結構あるので) 、meta-python(いろいろ実装用)を追加します。

local.confを編集して諸々追加する

local.confには追加したいコマンドやパッケージ、初期設定などを記述できるのですが、色々ありすぎて分かりにくくなっています。

まずは前回と同様に、meta-raspberrypiにあるRaspberry Pi Zero W用の定義名「raspberrypi0-wifi」を記述します。

デバイスドライバなどハードウェア関連のものの追加はMACHINE_FEATURESに記述します。例えばwifiとbluetoothを利用したいときには以下のように記述します。先頭には必ず半角スペースを入れてください。MACHINE_FEATURESに記述できるものはyocto projectのマニュアルページで確認できます。

ディストリビューション(ソフトウェアパッケージの塊のような何か)の追加はDISTRO_FEATURESに記述します。例えばwifi関連のソフトウェア等を追加するときには以下のように記述します。DISTRO_FEATURESに記述できるものはYocto projectのマニュアルページで確認できます。

上記のwifiようにMACHINE_FEATURESとDISTRO_FEATURESに同じものを書く場合にはCOMBINED_FEATURESに書いて1つにまとめることもできます。

アプリ、コマンド、ライブラリなどの追加はIMAGE_INSTALLに記述します。

IMAGE_FEATURESというのもあり、こちらはリスト化された塊を指定することができるので、1つ1つ書いていく手間が省けます。例えばssh-server-opensshを記述するとssh、scp、ssh-keygenなどopenssh関連のコマンドがまとめて追加されます。IMAGE_FEATURESに記述できるものはYocto projectのマニュアルページで確認できます。

以上を踏まえて、今回はwifi/bluetooth関係、usb関係、音声再生関係とGPIO制御関係を入れるために以下のように記述します。sshは最小構成の「ssh-server-dropbear」にしました。「linux-firmware-bcm43430」はwifi/bluetoothを利用するためのファームウェアです。

local.confでpiユーザーを追加したりrootパスワードを変更したりする

基本的にrootではコンソールからもログインできない仕様(IMAGE_FEATURESにdebug-tweaksを追加すればrootでのパスワードなしログインに変更できる)ですので、ユーザーを追加しておく必要があります。

詳細は割愛しますが、local.confでユーザーやグループの追加、パスワード変更などが指定できる便利な方法がありますので、これを使用しておなじみのpiユーザの追加と、rootパスワードを適当なものに変更しておきます。(詳細はマニュアルページで説明されています。このINHERITを使った機能の継承はレシピ作りのときにとても役に立ちます)

あと小技ですが、以下のように記述することホスト名を変更することもできます。

local.confでsysvinitからsystemdに変更する

yoctoのプロセス管理はデフォルトでsysvinitになっていますが、systemdに変更することも可能です。詳細はマニュアルページをご確認ください。

最終的にlocal.confはこのような感じになります。

bitbakeでビルドする

前回と同様ですが、bitbakeコマンドでビルドします。引数で指定するターゲットは最小構成で何も入っていないrpi-hwup-imageにします。

失敗しなければ/build/tmp-glibc/deploy/images/raspberrypi0-wifi配下にイメージが作成されます。展開された状態で192MB、gzipで圧縮すると47MBになるイメージが完成しました。

Raspberry Pi Zero Wを用意する

Yoctoの動作確認だけなら箱から出したRaspberry Pi Zero WにイメージをコピーしたSDカード入れ、電源につないでHDMI経由でディスプレイにログインプロンプトが出るか確認するだけですが、ピンヘッダーを取り付けたり、カバーを取り付けたり、USB拡張ボードを取り付けたりするとより使いやすくなり、見た目もよくなります。

動作確認

Raspberry Pi Zero Wで無事にYoctoが起動したら、まずはwifiが接続できるか試してみるのがよいでしょう。wifi接続にはIMAGE_INSTALLで指定していたconnmanを使用しますが、 長くなってしまいましたのでwifiやbluetooth、wiringPiでのGPIO制御の動作確認などは次回にしたいと思います。

 小さいことはいいことだ