☁️
ADU: チュートリアルのRaspberry Pi OSイメージ Deep Dive
チュートリアル: Raspberry Pi 3 B+ 参照イメージを使用した Device Update for Azure IoT HubのRaspberry Pi OSイメージ作成を詳しく調べています。
ソースはここ。
ビルドスクリプト
次のコマンドでOSイメージをビルドしています。
./scripts/build.sh -c -t $build_type -v $build_number --adu-src-uri $adu_src_uri --adu-git-branch $adu_git_branch --adu-git-commit $adu_git_commit --do-src-uri $do_src_uri --do-git-branch $do_git_branch --do-git-commit $do_git_commit --adu-delta-src-uri $adu_delta_src_uri --adu-delta-git-branch $adu_delta_git_branch --adu-delta-git-commit $adu_delta_git_commit -o $build_output_dir
引数はこちら。
-
-c
クリーンビルド。 -
-t $build_type
ビルドの種類。[Debug, Release, RelWithDebInfo, MinSizeRel] -v $build_number
-
--adu-src-uri $adu_src_uri --adu-git-branch $adu_git_branch --adu-git-commit $adu_git_commit
ADU clientのソース。gitsm://github.com/azure/iot-hub-device-update
GitHubを確認すると、Azure Device Update Agentのソースの模様。
meta-azure-device-update/recipes-azure-device-update/azure-device-update/azure-device-update_git.bbで使用しています。SRC_URI = "${ADU_SRC_URI};branch=${ADU_GIT_BRANCH}" SRCREV = "${ADU_GIT_COMMIT}"
-
--do-src-uri $do_src_uri --do-git-branch $do_git_branch --do-git-commit $do_git_commit
DO clientのソース。gitsm://github.com/microsoft/do-client
GitHubを確認すると、Delivery Optimization Clientだそうです。中身はAgent + SDK + Plug-ins。
meta-azure-device-update/recipes-azure-device-update/deliveryoptimization-agent/deliveryoptimization-agent_git.bbとmeta-azure-device-update/recipes-azure-device-update/deliveryoptimization-sdk/deliveryoptimization-sdk.bbで使用しています。SRC_URI = "${DO_SRC_URI};branch=${DO_GIT_BRANCH}" SRCREV = "${DO_GIT_COMMIT}"
-
--adu-delta-src-uri $adu_delta_src_uri --adu-delta-git-branch $adu_delta_git_branch --adu-delta-git-commit $adu_delta_git_commit
ADU Deltaのソース。gitsm://github.com/azure/iot-hub-device-update-delta
GitHubを確認すると、Azure Device Update Diffsを生成と適用するものだそうです。中身はDiff Generation + Delta Processor。
meta-iot-hub-device-update-delta/recipes-azure-device-update-diffs/azure-device-update-diffs/azure-device-update-diffs_git.bbで使用しています。SRC_URI = "${ADU_DELTA_SRC_URI};branch=${ADU_DELTA_GIT_BRANCH} \ file://0001-ADU-v1.0.0-Yocto-mininum-build.patch \ file://0002-Add-root-CMakeLists.txt.patch \ file://0003-Fix-io_utility-CMakeLists.txt.patch \ file://0004-Add-missing-header-in-zstd_decompression_reader.patch \ " SRCREV = "${ADU_DELTA_GIT_COMMIT}"
-
-o $build_output_dir
ビルドの出力ディレクトリ。
./scripts/build.sh内で重要なのはここ。
export MACHINE=raspberrypi3
export TEMPLATECONF=$ROOT_DIR/yocto/config-templates/$MACHINE
source $ROOT_DIR/yocto/poky/oe-init-build-env $BUILD_DIR
bitbake adu-update-image
テンプレートからビルド環境を構築して、bitbake adu-update-image
していることがわかります。
ビルドの成果物
adu-base-image-raspberrypi3.wic.gzとadu-update-image-raspberrypi3.swuの2つ。
- adu-update-image-raspberrypi3.swu
OSイメージ。Raspberry Pi Imagerなどを使ってmicroSDに書き込むことができる。 - adu-update-image-raspberrypi3.swu
アップデートファイル。SWUpdateのフォーマット。Azure Device Update for IoT Hubで自動配布する用。
adu-update-imageレシピ
ビルドスクリプトでbitbake adu-update-image
していますが、このadu-update-imageレシピはmeta-raspberrypi-aduに含まれていました。adu-update-image.bbです。
このレシピはswupdateを継承していて、生成したイメージをSWUpdateの形式(.swu)にしているようです。
inherit swupdate
adu-base-imageレシピ
adu-base-image.bbは.wic.gzを生成します。
ここがOSイメージを作成しているようです。
読み込んでいるレイヤー
bblayers.conf.sampleから、読み込んでいるレイヤーはこれです。
- git://git.yoctoproject.org/poky #honister
- meta
- meta-poky
- meta-yocto-bsp
- git://git.openembedded.org/meta-openembedded #honister
- meta-openembedded/meta-oe
- meta-openembedded/meta-multimedia
- meta-openembedded/meta-networking
- meta-openembedded/meta-python
- git://git.yoctoproject.org/meta-raspberrypi #honister
- meta-raspberrypi
-
https://github.com/sbabic/meta-swupdate #honister
- meta-swupdate
-
http://github.com/azure/meta-iot-hub-device-update-delta #main
- meta-iot-hub-device-update-delta
-
http://github.com/azure/meta-azure-device-update #main
- meta-azure-device-update
-
http://github.com/azure/meta-raspberrypi-adu #main
- meta-raspberrypi-adu
最後のmeta-raspberrypi-aduが、Raspberry Pi向けAzure Device Updateのレイヤーのようです。
まとめ
- レイヤーは大きく5つに分類できる。
- poky, meta-openembedded ... 基本のOSイメージ
- meta-raspberrypi ... ラズパイ
- meta-swupdate ... SWUpdate
- meta-azure-device-update, meta-iot-hub-device-update-delta ... Azure Device Update (Azure提供)
- meta-raspberrypi-adu ... ラズパイでAzure Device Update (Azure提供)
- adu-base-image.bbでOSイメージを作って、adu-update-image.bbでアップデートファイル(SWUpdate)を作る。
- ビルドスクリプト./scripts/build.shにイメージに含むコンポーネント(ADU client, DO client, ADU Delta)のコミット番号を指定する。
Appendix
各レイヤーのYocto Projectサポート
各レイヤーのサポートレベルはこちら。https://wiki.yoctoproject.org/wiki/Releases から抜粋。
Codename | Yocto Project Version | Support Level |
---|---|---|
Nanbield | 4.3 | 7months(2024/5) |
Kirkstone | 4.0 | LTS(-2026/4) |
Honister | 3.4 | EOL |
レイヤーのブランチを確認するとKirkstone用のものは用意されているっぽい。
Layer | Honister | Kirkstone | Nanbield |
---|---|---|---|
poky | Available | Available | Available |
meta-openembedded | Available | Available | Available |
meta-raspberrypi | Available | Available | Available |
meta-swupdate | Available | Available | Available |
meta-iot-hub-device-update-delta | Available | Available | |
meta-azure-device-update | Available | Available | |
meta-raspberrypi-adu | Available | Available |
ADU client, DO client, ADU deltaのコミット
- ADU client
- in build.sh
- main
- 33554d29476eab2447234528c8aed186e2b6423d (2022/11/2)
- example
- develop
- e099aaca0ad2b8849de24a13b1aa8e3ddf009251 (2022/12/15)
- latest release of GitHub
- 1.1.0
- 350a551dd9d3f5639eddceb75ef5b10e834865fe (3 weeks ago)
- default of GitHub
- develop
- 45f7f604b26229c70ecad758aa60ec4449eb67c6 (2 weeks ago)
- in build.sh
- DO client
- in build.sh
- main
- b61de2d347c8032562056b18f90ec710e531baf8 (2022/10/29)
- example
- main
- b61de2d347c8032562056b18f90ec710e531baf8 (2022/10/29)
- latest release of GitHub
- v1.1.0
- d71ade6f692dd8bc319ec3228c956517e9b29292 (2023/9/8)
- default of GitHub
- develop
- ae40325c7696d275e26452d6aae61c95997810b4 (3 hours ago)
- in build.sh
- ADU delta
- in build.sh
- main
- 57efe4360f52b297ae54323271c530239fb1d1c7 (2022/9/10)
- example
- main
- b581e92458f458969b427051a2ac5d18d3528dc6 (2022/10/8)
- latest tag of GitHub
- 1.0.1
- dc4a2feb5396b251a978eaa51dd35ed6624fe7fc (2022/10/12)
- default of GitHub
- main
- 77a120d03a8033126b22edd1667820e59bcf3f81 (2023/1/24)
- in build.sh
Discussion