meta-raspberrypiでbitbakeして作成されるイメージがいつの間にかrpi-sdimg
からwic.bz2
になっている。
イメージを書き込む手順もdd
やEtcher
からbmaptool
になっている。
dunfellのブランチを使用して、最近の手順で試しにラズパイ4を動かしてみる。
構築手順
作成するディレクトリツリーは下記のようなイメージ。
. ├── build ├── downloads └── layers ├── meta-raspberrypi └── poky
ソース取得
必要なメタデータを一式ダウンロードする。
$ mkdir -p rpi-dunfell/layers $ cd rpi-dunfell/layers $ git clone git://git.yoctoproject.org/poky.git -b dunfell $ git clone git://git.yoctoproject.org/meta-raspberrypi -b dunfell $ cd ../
環境変数設定
bitbakeの実行に必要な環境変数を設定する。
$ source layers/poky/oe-init-build-env build
自動的にビルドディレクトリに移動される。 これで、bitbake関連のツールが使用可能になる。
レイヤ追加
meta-raspberryをbitbakeの対象に追加する。
$ bitbake-layers add-layer ../layers/meta-raspberrypi
local.confの修正
MACHINEをraspberrypi4
に設定し、UARTを有効化する。
OSSのソースコード格納するdownloads
の位置も変更する。また、INITもsystemdに変更する。
MACHINE = "raspberrypi4" DL_DIR ?= "${TOPDIR}/../downloads" # enable uart ENABLE_UART = "1" # systemd DISTRO_FEATURES_append = " systemd pam" VIRTUAL-RUNTIME_init_manager = "systemd" DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit" VIRTUAL-RUNTIME_initscripts = "" # connman IMAGE_INSTALL_append = " connman \ connman-client \ "
ビルド
core-image-baseをビルドする。
$ bitbake core-image-base
書き込み
tmp/deploy/images/raspberrypi4
にcore-image-base-raspberrypi4.wic.bz2
が生成されるのでこれをbmaptool
で書き込む。
$ sudo bmaptool copy core-image-base-raspberrypi4.wic.bz2 /dev/sdX
/dev/sdX
は環境に応じて適宜読み替える。
bmaptoolコマンドについて
bmaptoolコマンドがインストールされてない場合、Ubuntuではbmaptool
はaptでインストールできる。
$ sudo apt install bmap-tools
bmaptoolで書き込む場合、bitbakeで一緒に生成されるcore-image-base-raspberrypi4.wic.bmap
がイメージファイルと同じディレクトリに存在すると、
このブロックマップ情報により書き込みが最適化される。
bitbakeでbmapファイルを生成するにはIMAGE_FSTYPES
にwic.bmap
を設定する。
meta-raspberrypiではデフォルトで設定されている。これは下記のコマンドで確認できる。
$ bitbake core-image-base -e | grep '^IMAGE_FSTYPES=' IMAGE_FSTYPES="tar.bz2 ext3 wic.bz2 wic.bmap"
bmapファイルが存在しない場合はbmaptool copy --nomap
オプションで使用しない方法や、
イメージファイルからbmaptool create
で生成したりする方法もある。
その場合、bitbakeで生成されたbmapを使用したときほど書き込みに係る時間は短縮されない。
また、wicファイルはddコマンドでも書き込みできるがbunzip2などで伸張する必要があるし、 書き込み時間はbmapを使用しない場合とほぼ同じとなる。
そのため、イメージを他の場所に移動する場合などはbitbakeで生成されたbmapファイルとセットで管理するとよさそう。
時間比較
bitbakeで生成されたbmapを使用するケース。
$ sudo bmaptool copy core-image-base-raspberrypi4.wic.bz2 /dev/sda bmaptool: info: copying time: 13.7s, copying speed 10.5 MiB/sec
bmapファイルを使用しないケース
$ sudo bmaptool copy --nobmap core-image-base-raspberrypi4.wic.bz2 /dev/sda bmaptool: info: copying time: 22.4s, copying speed 11.8 MiB/sec
ddコマンドで書き込むケース
$ sudo dd if=./core-image-base-raspberrypi4.wic of=/dev/sda bs=100M 276824064 bytes (277 MB, 264 MiB) copied, 21.9507 s, 12.6 MB/s
これらをまとめると次のようになる。
コマンド | 時間(秒) | 速度(MiB/s) |
---|---|---|
bmaptool(bmapあり) | 13.7 | 10.5 |
bmaptool(bmapなし) | 22.4 | 11.8 |
dd*1 | 21.9 | 12.0*2 |
bmapなしのケースとddがほぼ同等。bmapありのケースで約半分の時間となっている。
この結果の原因としては、書き込み速度自体はほぼ変わらない(というかddのほうが速度は出ている)が、 ブロックマップ情報が適切に定義されて不要な書き込みをしないためと推測している。
まとめ
最近(dunfell以降かな)のmeta-raspberrypiではイメージの出力形式もwic.bz2
になっており、
書き込みにもbmaptool
が推奨されるようになっていた。
rpi-sdimgと比較してもbz2で圧縮されている分、イメージファイルのサイズも小さくなっている。 適切なbmapファイルを使用してbmaptoolで書き込む場合、ddよりも高速に書き込めるということがわかった。