チュートリアル: Raspberry Pi イメージを使用した Azure Device Update for IoT Hub
Device Update for Azure IoT Hub では、イメージベース、パッケージベース、スクリプトベースの更新がサポートされています。 このチュートリアルでは、Raspberry Pi 3 B+ ボード上の Yocto イメージを使用して、エンドツーエンドのイメージベースの Device Update for IoT Hub の更新を実行します。
イメージ更新プログラムはデバイスの最終状態の信頼度を高め、パッケージやスクリプト ベースの更新プログラムの際と同じパッケージと依存関係の管理に関する課題を引き起こすことはありません。 運用前環境と運用環境の間でイメージ更新プログラムの結果をレプリケートし、A/B フェールオーバー モデルを簡単に導入することがより簡単になります。
このチュートリアルでは、次の作業を行いました。
- イメージ更新プログラムをダウンロードしてインストールします。
- IoT デバイスにタグを割り当てます。
- イメージ更新プログラムをインポートします。
- イメージ更新プログラムをデプロイします。
- 更新プログラムのデプロイ履歴を表示します。
前提条件
イメージ ファイルをダウンロードして抽出しデバイスを制御できる、ハードウェアにイーサネット経由で接続された Raspberry Pi 3 IoT ボード。
Note
このチュートリアルで取り上げるイメージ更新プログラムは、Raspberry Pi B3 ボードで検証されました。
デバイスを登録して、デバイス接続文字列を取得する
IoT ハブのデバイス レジストリにデバイスを追加し、IoT Hub がデバイスに対して生成する接続文字列を取得します。
- Azure portal で、Device Update インスタンスに関連付けられている IoT ハブ ページを開きます。
- 左側のナビゲーション ウィンドウで [デバイス管理]>[デバイス] の順に選択します。
- [デバイス] ページで [デバイスの追加] を選択します。
- [デバイス ID] にデバイスの名前を入力します。 [キーの自動生成] チェックボックスがオンになっていることを確認します。
- [保存] を選択します。 [デバイス] ページの一覧にデバイスが表示されます。
- [デバイス] ページで、登録したデバイスを選択します。
- [デバイス] ページで [接続文字列 (主キー)] の横にある [コピー] アイコンを選びます。 Device Update エージェントを構成するときに使うため、この "接続文字列" を保存します。
Note
このチュートリアルでは、デモンストレーション用に、デバイスの接続文字列を使用して IoT ハブの認証と接続を実施します。 運用環境のシナリオでは、モジュール ID と IoT ID サービスを使用してデバイスをプロビジョニングすることをお勧めします。 詳細については、「Device Update エージェントのプロビジョニング」を参照してください。
Raspberry Pi のセットアップ
Tutorial_RaspberryPi3.zip ファイル にはチュートリアルに必要なすべてのファイルが含まれています。 GitHub の Device Update リリース ページの最新リリースの [アセット] セクションからファイルをダウンロードして解凍します。
抽出された Tutorial_RaspberryPi3 フォルダーでは、Raspberry Pi ボードにフラッシュできる基本イメージは adu-base-image-raspberrypi3.wic です。 この基本イメージでは、3.4.4 リリースに基づく Yocto ビルドが使用されます。 イメージには Device Update エージェントと SWUpdate が含まれ、これにより Device Update のデュアル パーティション更新が有効になります。 Yocto レイヤーの詳細については、「Yocto Project を使用して Device Update エージェントによるカスタム Linux ベースのシステムを構築する」を参照してください。
Device Update を使用してインポートする更新ファイルは次のとおりです。
- SWUpdate ファイルの adu-update-image-raspberrypi3-1.2.0.swu
- カスタム SWUpdate スクリプトの example-a-b-update.sh
- マニフェストの EDS-ADUClient.yocto-update.1.2.0.importmanifest.json
bmaptool を使用した SD カードのフラッシュ
重要
Azure Device Update for IoT Hub ソフトウェアには、次のライセンス条項が適用されます。
エージェントを使用する前に、ライセンス条項を参照してください。 エージェントをインストールして使用すると、これらの条項に同意したものと見なされます。 ライセンス条項に同意しない場合は、Device Update エージェントを使用できません。
OS フラッシュ ツールを使用して、Raspberry Pi デバイスで使用する SD カードに Device Update 基本イメージをインストールします。 次の手順では、bmaptool
を使用して SD カードにフラッシュします。 <device>
プレースホルダーをデバイス名で置き換え、<path to image>
プレースホルダーをダウンロードしたイメージ ファイルへのパスで置き換えます。
bmap-tools
ユーティリティがない場合はインストールします。sudo apt-get install bmap-tools
/dev で SD カードのパス見つけます。 パスは /dev/sd* または /dev/mmcblk* のようになります。
dmesg
ユーティリティを使用すると、正しいパスを探しやすくなります。フラッシュする前に、マウントされているすべてのパーティションをマウント解除します。
sudo umount /dev/<device>
デバイスへの書き込みアクセス許可があることを確認します。
sudo chmod a+rw /dev/<device>
SD カードをフラッシュします。
sudo bmaptool copy <path to image> /dev/<device>
ヒント
より高速なフラッシュを行うには、bimap ファイルとイメージ ファイルをダウンロードして、同じディレクトリに置くことができます。
Raspberry Pi で Device Update エージェントを構成する
Raspberry Pi がネットワークに接続されていることを確認します。
PowerShell ウィンドウで次のコマンドを使用して、Raspberry Pi に Secure Shell (SSH) 接続します。
ssh raspberrypi3 -l root
Device Update の構成ファイルを作成する
Device Update の du-config.json と du-diagnostics-config.json の構成ファイルが同じデバイスに存在する必要があります。 ファイルを作成するには、Raspberry Pi にサインインしているターミナルで次のコマンドを実行します。
du-config.json ファイルを作成するか、編集用に開くには、次のコマンドを実行します。
nano /adu/du-config.json
エディターで du-config.json ファイルが開きます。 ファイルを作成中の場合は空です。 次のコードをコピーしてファイルに貼り付け、サンプルの値をデバイスに必要な構成で置き換えます。
connectionData
文字列の例を、デバイス登録手順でコピーしたデバイス接続文字列で置き換えます。{ "schemaVersion": "1.0", "aduShellTrustedUsers": [ "adu", "do" ], "manufacturer": "contoso", "model": "virtual-vacuum-v2", "agents": [ { "name": "main", "runas": "adu", "connectionSource": { "connectionType": "string", "connectionData": "HostName=<hub_name>.azure-devices.net;DeviceId=<device_id>;SharedAccessKey=<device_key>" }, "manufacturer": "contoso", "model": "virtual-vacuum-v2" } ] }
[Ctrl]+[X] を押してエディターを終了し、「y」 を入力して変更を保存します。
同様のコマンドを使用して、du-diagnostics-config.json ファイルを作成します。 ファイルを作成して開きます。
nano /adu/du-diagnostics-config.json
次の du-diagnostics-config.json コードをコピーしてファイルに貼り付けます。 値は既定の Device Update ログの場所であり、構成が既定値と異なる場合にのみ変更する必要があります。
{ "logComponents":[ { "componentName":"adu", "logPath":"/adu/logs/" }, { "componentName":"do", "logPath":"/var/log/deliveryoptimization-agent/" } ], "maxKilobytesToUploadPerLogPath":50 }
[Ctrl]+[X] を押してエディターを終了し、「y」 を入力して変更を保存します。
次のコマンドを使用して、/adu/ ディレクトリにあるファイルを表示します。 両方の構成ファイルが表示されます。
ls -la /adu/
次のコマンドを使用して、Device Update システム デーモンを再起動し、構成が適用されていることを確認します。
systemctl start deviceupdate-agent
次のコマンドを使用して、エージェントがライブ状態であることを確認します。
systemctl status deviceupdate-agent
状態は、ライブ状態として緑色で表示されます。
IoT Hub でデバイスに接続し、グループ タグを追加する
Device Update インスタンスの Azure portal の [IoT Hub] ページで、左側のナビゲーションから [デバイス管理] >[デバイス] の順に選択します。
[デバイス] ページでデバイスの名前を選択します。
[デバイス] ページの上部で [デバイス ツイン] を選択します。
[デバイス ツイン] ページで、デバイス ツインの
"properties"
セクションの"reported"
セクションで、デバイスの Linux カーネル バージョンを探します。Device Update から更新プログラムを受信していない新しいデバイスの場合、DeviceManagement:DeviceInformation:1.swVersion プロパティの値は、デバイスで実行されているファームウェアのバージョンを表します。 デバイスに更新プログラムが適用されると、AzureDeviceUpdateCore:ClientMetadata:4.installedUpdateId プロパティの値がファームウェアのバージョンを表します。
基本イメージと更新イメージのファイル名の形式は、"adu-イメージの種類-イメージ-マシン-バージョン番号.拡張子" です。<><><><> 更新プログラムをインポートするときに使用するバージョン番号に注意してください。
グループ タグを追加する
割り当てられたタグと互換性プロパティに基づいて、Device Update は自動的にデバイスをグループに整理します。 各デバイスは 1 つのグループにのみ属することができますが、グループには複数のサブグループを含めることができ、さまざまなデバイス クラスを並べ替えることができます。 タグとグループの詳細については、デバイス グループの管理に関する記事を参照してください。
デバイス ツインで既存の Device Update タグ値を null 値に設定して削除し、以下の新たな Device Update グループ タグに追加します。 Device Update エージェントでモジュール ID を使用している場合は、デバイス ツインではなくモジュール ID ツインにタグを追加します。
"tags": { "ADUGroup": "<CustomTagValue>" },
次のスクリーンショットは、タグを追加するファイル内の場所を示しています。
[保存] を選択します。
更新プログラムをインポートする
Device Update インスタンスの Azure portal の [IoT Hub] ページで、左側のナビゲーションから [デバイス管理]>[更新プログラム] の順に選択します。
[更新プログラム] ページで [新しい更新プログラムのインポート] を選択します。
[更新プログラムのインポート] ページで [ストレージ コンテナー から選択] を選択します。
[ストレージ アカウント] ページで、既存のストレージ アカウントを選ぶか、[ストレージ アカウント] を選んで新しいアカウントを作成します。
[コンテナー] ページで、既存のコンテナーを選ぶか、[コンテナー] を選んで新しいコンテナーを作成します。 コンテナーを使用して、インポート用の更新プログラム ファイルをステージングします。
ヒント
以前の更新プログラムから誤ってファイルをインポートしないように、更新プログラムをインポートするごとに新しいコンテナーを使用します。 新しいコンテナーを使用しない場合は、既存のコンテナーからファイルを削除します。
[コンテナー] ページで [アップロード] を選択します。 ダウンロードした Tutorial_RaspberryPi3 フォルダーから次の更新プログラム ファイルをドラッグ アンド ドロップするか、参照して選択します。
- adu-update-image-raspberrypi3-1.2.0.swu
- example-a-b-update.sh
- EDS-ADUClient.yocto-update.1.2.0.importmanifest.json
[アップロード] を選択します。 アップロードすると、ファイルがコンテナー ページに表示されます。
コンテナー ページで、インポートするファイルを確認して選択し、[選択] を選択します。
[更新プログラムのインポート] 画面で [更新プログラムのインポート] を選択します。
インポート プロセスが開始され、画面が [更新プログラム] セクションに切り替わります。 インポートが成功すると、[更新プログラム] タブに表示されます。インポート プロセスの詳細については、Device Update への更新プログラムのインポートに関する記事を参照してください。
デバイス グループを選択する
デバイスに適用したグループ タグを使用して、デバイス グループに更新プログラムをデプロイできます。 [更新プログラム] ページの上部にある [グループとデプロイ] タブを選択して、グループとデプロイの一覧と更新プログラムのコンプライアンス グラフを表示します。
更新プログラムのコンプライアンス チャートには、さまざまなコンプライアンス対応状態 (最新の更新状態、利用可能な新しい更新プログラムがある、更新プログラムのインストールが進行中) にあるデバイスの数が表示されます。 詳細については、「デバイス更新のコンプライアンス」を参照してください。
[グループ名] の下にこの IoT ハブに接続されているデバイスのすべてのデバイス グループと利用可能な更新プログラムの一覧が表示され、[状態] の下に更新プログラムを展開するためのリンクが表示されます。 グループのデバイス クラスの要件を満たしていないデバイスは、対応する無効なグループに表示されます。 タグとグループの詳細については、デバイス グループの管理に関する記事を参照してください。
このチュートリアルで設定したデバイスを含むデバイス グループと、グループ内のデバイスで使用できる更新プログラムが表示されます。 場合によっては、ページを更新する必要があります。 このビューからグループに最適な利用可能な更新プログラムをデプロイするには、グループの横にある [デプロイ] を選択します。
更新プログラムをデプロイする
[グループの詳細] ページで [現在のデプロイ] タブを選択し、[利用可能な更新プログラム] セクションで目的の更新プログラムの横にある [デプロイ] を選択します。 グループに最適な利用可能な更新プログラムには、[最適] の表示が付いています。
[デプロイの作成] ページで、デプロイを直ちに開始するか今後開始するようにスケジュールし、[作成] を選択します。
ヒント
既定の開始日時は、現在の時刻から 24 時間後です。 デプロイを早く開始したい場合は、異なる日時を選択します。
デプロイの詳細 で、状態 が アクティブ に変わります。 [利用可能な更新プログラム] で、選択した更新プログラムに [(展開中)] のマークが付きます。
[更新プログラム] ページでコンプライアンス チャートを表示して、更新が進行中であることを確認します。 デバイスが正常に更新されると、コンプライアンス チャートとデプロイの詳細がその状態を反映するように更新されます。
更新プログラムのデプロイ履歴を表示する
デプロイ履歴を表示するには以下の手順を実施します。
[グループの詳細] ページの上部にある [デプロイ履歴] タブを選択し、作成したデプロイの横にある [詳細] リンクを選択します。
[デプロイの詳細] ページで [更新] を選択して、最新の状態の詳細を表示します。
リソースをクリーンアップする
このチュートリアル用に作成したリソースは、不要になったら削除できます。
- Azure portal で、リソースが含まれるリソース グループに移動します。
- グループのすべてのリソースを削除する場合は、[リソース グループの削除] を選びます。
- リソースの一部のみを削除する場合は、チェック ボックスを使ってリソースを選んでから、[削除] を選びます。