WEBサービス開発グループの堀です。
前回から随分と間が空いてしまいましたが、今回はYocto Projectのカスタマイズ方法についての紹介です。
カスタマイズ用にレシピ(メタデータ)を作成する方法もありますが、手軽にできるビルド用ディレクトリ配下にある「bblayers.conf」「local.conf」に追加したいパッケージなどを記述する方法でwifiやbluetoothが使用できるRaspberry Pi Zero W用のカスタムイメージを作成してみます。
ビルド環境を準備する
前回と同じ内容になりますが、Yocto本体とmeta-raspberrypiをgitで取ってきてビルド環境を準備します。10/26に新バージョンrocko(2.4)がリリースされていますが、引き続きpyroを使用します。(まだビルドがいくつか通らないところがあって様子を見ています)
1 2 3 4 5 6 |
$ mkdir rpi0 $ cd rpi0 $ git clone git://git.yoctoproject.org/poky.git -b pyro $ cd poky $ git clone git://git.yoctoproject.org/meta-raspberrypi -b pyro $ source oe-init-build-env ../build |
bblayers.confの編集してレイヤーを追加する
bblaysers.confのBBLAYERS変数に利用したいレシピのあるレイヤー(メタデータ)のパスを指定します。例えば前回追加したmeta-raspberrypi配下のrecipes-devtoolsは以下のようになっていて、meta-raspberrypiを指定することでGPIOを制御するライブラリwiringPiを追加することができるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
meta-raspberrypi/recipes-devtools/ ├── bcm2835 │ └── bcm2835_1.52.bb ├── pi-blaster │ ├── files │ │ └── remove-initscript-lsb-dependency.patch │ ├── pi-blaster_git.bb │ └── pi-blaster.inc ├── python │ ├── python-rtimu │ │ └── 0001-include-asm-ioctl.h-for-ioctl-define.patch │ ├── python-rtimu_git.bb │ ├── python-sense-hat_2.1.0.bb │ ├── rpi-gpio │ │ └── 0001-Remove-nested-functions.patch │ ├── rpi-gpio_0.6.2.bb │ ├── rpio │ │ └── 0001-include-sys-types.h-explicitly-for-getting-caddr_t-d.patch │ └── rpio_0.10.0.bb └── wiringPi ├── files │ └── 0001-Add-initial-cross-compile-support.patch └── wiringpi_git.bb |
レイヤーによっては依存関係のあるものがあり、別のレイヤーを一緒に追加する必要があったりしますので注意が必要です。レイヤーの追加には前回紹介したbitbake-layersコマンドを使用できますが、直接ファイルを編集しても問題ありません。(将来的には変わるかも?)
今回はmeta-openembeddedを取ってきてmeta-oe(各種ライブラリ)、meta-networking(ネットワーク関係) 、meta-perl(perl依存のものが結構あるので) 、meta-python(いろいろ実装用)を追加します。
1 2 3 4 |
$ cd poky $ git clone git://git.openembedded.org/meta-openembedded -b pyro $ cd ../build/conf $ vim bblayers.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf # changes incompatibly POKY_BBLAYERS_CONF_VERSION = "2" BBPATH = "${TOPDIR}" BBFILES ?= "" BBLAYERS ?= " \ /rpi0/poky/meta \ /rpi0/poky/meta-poky \ /rpi0/poky/meta-yocto-bsp \ /rpi0/poky/meta-openembedded/meta-oe \ /rpi0/poky/meta-openembedded/meta-networking \ /rpi0/poky/meta-openembedded/meta-perl \ /rpi0/poky/meta-openembedded/meta-python \ /rpi0/poky/meta-raspberrypi \ " |
local.confを編集して諸々追加する
local.confには追加したいコマンドやパッケージ、初期設定などを記述できるのですが、色々ありすぎて分かりにくくなっています。
まずは前回と同様に、meta-raspberrypiにあるRaspberry Pi Zero W用の定義名「raspberrypi0-wifi」を記述します。
1 |
MACHINE = "raspberrypi0-wifi" |
デバイスドライバなどハードウェア関連のものの追加はMACHINE_FEATURESに記述します。例えばwifiとbluetoothを利用したいときには以下のように記述します。先頭には必ず半角スペースを入れてください。MACHINE_FEATURESに記述できるものはyocto projectのマニュアルページで確認できます。
1 |
MACHINE_FEATURES_append = " wifi bluetooth" |
ディストリビューション(ソフトウェアパッケージの塊のような何か)の追加はDISTRO_FEATURESに記述します。例えばwifi関連のソフトウェア等を追加するときには以下のように記述します。DISTRO_FEATURESに記述できるものはYocto projectのマニュアルページで確認できます。
1 |
DISTRO_FEATURES_append = " wifi bluetooth" |
上記のwifiようにMACHINE_FEATURESとDISTRO_FEATURESに同じものを書く場合にはCOMBINED_FEATURESに書いて1つにまとめることもできます。
1 |
COMBINED_FEATURES_append = " wifi bluetooth" |
アプリ、コマンド、ライブラリなどの追加はIMAGE_INSTALLに記述します。
1 |
IMAGE_INSTALL_append = " connman connman-client usbutils sudo wiringpi" |
IMAGE_FEATURESというのもあり、こちらはリスト化された塊を指定することができるので、1つ1つ書いていく手間が省けます。例えばssh-server-opensshを記述するとssh、scp、ssh-keygenなどopenssh関連のコマンドがまとめて追加されます。IMAGE_FEATURESに記述できるものはYocto projectのマニュアルページで確認できます。
1 |
IMAGE_INSTALL_append = " ssh-server-openssh" |
以上を踏まえて、今回はwifi/bluetooth関係、usb関係、音声再生関係とGPIO制御関係を入れるために以下のように記述します。sshは最小構成の「ssh-server-dropbear」にしました。「linux-firmware-bcm43430」はwifi/bluetoothを利用するためのファームウェアです。
1 2 3 4 5 |
DISTRO_FEATURES_append = " bluez5" COMBINED_FEATURES_append = " alsa ext2 usbgadget usbhost wifi bluetooth" IMAGE_INSTALL_append = " linux-firmware-bcm43430 connman connman-client pulseaudio pulseaudio-server usbutils sudo wiringpi" IMAGE_FEATURES_append = " ssh-server-dropbear" |
local.confでpiユーザーを追加したりrootパスワードを変更したりする
基本的にrootではコンソールからもログインできない仕様(IMAGE_FEATURESにdebug-tweaksを追加すればrootでのパスワードなしログインに変更できる)ですので、ユーザーを追加しておく必要があります。
詳細は割愛しますが、local.confでユーザーやグループの追加、パスワード変更などが指定できる便利な方法がありますので、これを使用しておなじみのpiユーザの追加と、rootパスワードを適当なものに変更しておきます。(詳細はマニュアルページで説明されています。このINHERITを使った機能の継承はレシピ作りのときにとても役に立ちます)
1 2 |
INHERIT_append = " extrausers" EXTRA_USERS_PARAMS = "useradd -P raspberry pi;usermod -P mockingjay root;" |
あと小技ですが、以下のように記述することホスト名を変更することもできます。
1 |
hostname_pn-base-files = "yoctopi" |
local.confでsysvinitからsystemdに変更する
yoctoのプロセス管理はデフォルトでsysvinitになっていますが、systemdに変更することも可能です。詳細はマニュアルページをご確認ください。
最終的にlocal.confはこのような感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
DISTRO_FEATURES_append = " bluez5" COMBINED_FEATURES_append = " alsa ext2 usbgadget usbhost wifi bluetooth" IMAGE_INSTALL_append = " linux-firmware-bcm43430 connman connman-client pulseaudio pulseaudio-server usbutils sudo " IMAGE_FEATURES_append = " ssh-server-dropbear" #use systemd DISTRO_FEATURES_append = " systemd" VIRTUAL-RUNTIME_init_manager = "systemd" DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit" VIRTUAL-RUNTIME_initscripts = "" IMX_DEFAULT_DISTRO_FEATURES_append = " systemd" # host setup hostname_pn-base-files = "yoctopi" INHERIT_append = " extrausers" EXTRA_USERS_PARAMS = "useradd -P raspberry pi;usermod -P mockingjay root;" |
bitbakeでビルドする
前回と同様ですが、bitbakeコマンドでビルドします。引数で指定するターゲットは最小構成で何も入っていないrpi-hwup-imageにします。
1 2 |
$ cd build $ bitbake rpi-hwup-image |
失敗しなければ/build/tmp-glibc/deploy/images/raspberrypi0-wifi配下にイメージが作成されます。展開された状態で192MB、gzipで圧縮すると47MBになるイメージが完成しました。
1 2 3 |
$ ls -lh build/tmp-glibc/deploy/images/raspberrypi0-wifi/*rpi-sdimg -rw-r--r-- 2 yocto yocto 192M Nov 16 12:04 build/tmp-glibc/deploy/images/raspberrypi0-wifi/rpi-hwup-image-raspberrypi0-wifi-20171115170338.rootfs.rpi-sdimg lrwxrwxrwx 2 yocto yocto 64 Nov 16 12:04 build/tmp-glibc/deploy/images/raspberrypi0-wifi/rpi-hwup-image-raspberrypi0-wifi.rpi-sdimg -> rpi-hwup-image-raspberrypi0-wifi-20171115170338.rootfs.rpi-sdimg |
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制御の動作確認などは次回にしたいと思います。
小さいことはいいことだ