☁️

ADU: RasPi3BのオレオレOSイメージアップデート

2024/01/26に公開

はじめに

公式ドキュメントに、Raspberry Pi 3 B+のOSイメージアップデートのチュートリアルがあります。

https://learn.microsoft.com/ja-jp/azure/iot-hub-device-update/device-update-raspberry-pi

解説記事はこちら。

https://zenn.dev/matsujirushi/articles/9086189661e52e

OSイメージがアップデートできたかどうかをAzureポータル画面で確認しましたが、実際のデバイス上で確認したわけではないので、なんだかモヤモヤ。

そこで、新たにチュートリアル用にOSイメージとアップデートファイル2つを作成して、デバイスでアップデートが反映されているか確認できるようにしました。

1. 必要なもの

本家チュートリアルと一緒です。→これ

2. Azureリソースを作成

本家チュートリアルと一緒です。→これ

3. デバイスを登録

本家チュートリアルと一緒です。→これ

4. Raspberry Piをセットアップ

4-1. OSイメージを書き込む

OSイメージはGitHubのリリースページにあるmatsujirushi.satellite-v1.zipに含まれています。

https://github.com/matsujirushi/iot-hub-device-update-yocto/releases

このzipファイル内にあるadu-base-image-raspberrypi3-0.1.0.wic.gzがOSイメージです。これをマイクロSDに書き込みます。

書き込んだマイクロSDをRaspberry Piに差して起動すると、Yocto Project(Poky)が起動します。起動後はネットワークからSSHでターミナルにrootユーザー(パスワードなし)で接続できます。

初期OSイメージには、matsujirushiappというアプリケーションのv0.1.0が仕込んであります。起動するとバージョン番号をターミナルに表示します。確認しておきましょう。

4-2. Deivce Update Agentを設定

Raspberry Piの /adu/du-diagnostics-config.json/adu/du-config.json を設定します。

/adu/du-diagnostics-config.jsonはロギングの設定です。下記をコピペします。

/adu/du-diagnostics-config.json
{
   "logComponents":[
      {
         "componentName":"adu",
         "logPath":"/adu/logs/"
      },
      {
         "componentName":"do",
         "logPath":"/var/log/deliveryoptimization-agent/"
      }
   ],
   "maxKilobytesToUploadPerLogPath":50
}

/adu/du-config.jsonにはデバイスの製造会社や製品名とともにデバイスの接続文字列を設定します。connectionDataの値にAzure IoT Hubに登録したデバイスの接続文字列を書きます。

/adu/du-config.json
{
   "schemaVersion": "1.0",
   "aduShellTrustedUsers": [
      "adu",
      "do"
   ],
   "manufacturer": "matsujirushi",
   "model": "satellite-v1",
   "agents": [
      {
      "name": "main",
      "runas": "adu",
      "connectionSource": {
         "connectionType": "string",
         "connectionData": ""
      },
      "manufacturer": "matsujirushi",
      "model": "satellite-v1"
      }
   ]
}

5. Azure IoT HubとDevice Update Agentの接続確認

Device Update AgentがAzure IoT Hubと接続、通信できると、Azure IoT Hubのデバイスのデバイスツインに、Device Update Agentの情報が書き込まれます。具体的には、properties.reported.deviceInformation.manufacturermatsujirushiproperties.reported.deviceInformation.modelsatellite-v1と書かれていれば正常です。

6. インポート

6-1. インポートを開始

本家チュートリアルと一緒です。→これ

6-2. Azure Storage Containerを選択

本家チュートリアルと一緒です。→これ

6-3. 6-4. アップデートファイルをAzure Device Update for IoT Hubへインポート

アップデートファイルをAzure Storage Containerへアップロードします。アップロードするファイルは「4-1. OSイメージを書き込む」のmatsujirushi.satellite-v1.zipに含まれています。
そして、Azure Storage ContainerにあるアップデートファイルをAzure Device Update for IoT Hubにインポートします。

6-5. インポートが完了するまで待つ

「更新プログラムのインポート」を実行すると、ほぼ確実に「更新プログラムのインポートを監視しているときに問題が発生しました」というエラーが発生します。何十回と試していますが、すべてエラーが発生しました。

実際はバックグラウンドでインポート作業を開始しているので、エラーは無視して大丈夫です。インポート作業が完了したかどうかはインポート履歴の表示で確認できます。状態が成功になれば完了です(3分程度)。


6-6. Azure Storage Containerを削除

本家チュートリアルと一緒です。→これ

7. デプロイ

本家チュートリアルと一緒です。→これ

デプロイが完了したかどうかは現在の更新プログラムで確認できます。成功が1になれば完了です(3分程度)。インストール済みの更新プログラムが0.1.1になります。

アップデートファイルv0.1.1には、matsujirushiappというアプリケーションのv0.1.1が仕込んであります。起動するとバージョン番号をターミナルに表示します。

まとめ

何度も何度も何度も環境構築してアップデートした結果、いくつか気づいたことがありました。

  • du-diagnostics-config.json → du-config.json の順に作ったほうが良いみたい。(意味合い的にもそうですね)
  • du-config.jsonを一度保存すると、あとから書き換えてもAzure Device Update Agentに反映されない模様。そのときはAgentを再起動。
  • 更新プログラムのインポートは必ずエラーが出る。経過はインポート履歴で確認する。
  • 同じデバイス、同じアップデートファイルでもう一度試すときは環境をしっかりクリーンナップ。
    • Azure IoT Hubデバイスを削除
    • 更新プログラムを削除
    • グループにデプロイした更新プログラム ←これ、気づきにくい

(差分だけ書いて、残りは別記事へリンクにしたので読みにくい記事になってしまった。記事へのアクセス数が多いようなら、あらためて綺麗に書き直したいと思う。)

参考

Discussion