ブログ

Armadillo Base OS:Hawkbitサーバーを用いてソフトウェアアップデートする方法

at_shinya.matsumoto
2022年11月1日 10時58分

本ブログはArmadillo Base OSに標準搭載されているSWUpdateで、Hwakbitサーバーを立ててUIベースでソフトウェアを
リモートアップデートする方法を紹介します。

HawkBitでのアップデートを非推奨に変更

HawkBitのWebUI廃止に伴い、今後アップデートに使用する事は非推奨と致します。
当社で配布する当コンテナはWeB UI搭載版のバージョンのまま配布を継続しますが、今後脆弱性などの対応が
出来ない事をご了承願います。
OSやコンテナのアップデート方法としてはArmadillo Twinまたは簡易Webサーバーでのアップデートを推奨致します。

SWUpdateとは

SWUpdateは、デバイス上で実行されるプログラムで、 ネットワーク/ストレージ経由でデバイスのソフトウェアを
更新することができます。Armadillo Base OSではSWUpdateを利用することで次のような機能を標準搭載しています。

主な機能

・アップデート機能             ・・・ローカル/リモート共に対応
・ロールバック機能             ・・・アップデート失敗時に前のバージョンに戻る機能
・ソフトウェアの圧縮、暗号化、署名付与   ・・・サイズ圧縮とセキュリティ対策
・ダウングレードの禁止           ・・・誤ったアップデートの実行を禁止

アップデート対象例

・OS全体
・ファイル単体(dtb、カーネル、スクリプト等)
・コンテナイメージ(差分アップデート可能)
・ブートローダー
・ファームウェア

リモートアップデートについて

Armadillo Base OSでは下記2つの方法でリモートアップデートする事が出来ます。

1.簡易サーバーを用いたリモートアップデート
  定期的にサーバーにファイルの有無を確認し、アップデート可能(※)な場合に実行

2.Hawkbitサーバーを用いたUIベースのリモートアップデート
  GUIで設定したArmadilloにアップデートを実行(個体別にアップデートの成功・失敗も確認可能)

本ブログでは2.Hawkbitサーバーを用いたGUIベースのリモートアップデートについて紹介します。
1.簡易サーバーを用いたリモートアップデートこちらのブログを参照下さい。

※アップデートが実行される条件はこちらのブログを参照下さい。
 この条件により同じアップデートは重複して実行されません。

《注意》
 リモートでのソフトウェアアップデートはArmadillo Base OS(ホスト側)がトリガーを出す事を推奨しています。
 コンテナ側をトリガーにした場合、コンテナが停止したりバグ等でトリガーを出せなくなった場合にアップデートが
 できなくなる事が考えられます。


以下、プロンプトは下記を意味します。
[armadillo]# :Armadillo Base OS(ホスト)
[container]# :コンテナ内
[PC]$     :その他LinuxPC

実施手順

本ブログでは以下の手順でLinuxPCにHawkbitサーバーを立てて、UIベースでArmadilloをアップデートする例を紹介します。
1.Dockerのインストール
2.Hawkbitサーバーの設置
3.UIでデバイスの登録
4.デバイスへの反映~サービスの有効化
5.アップデート実行

以下、Debian11をインストールした環境として説明します。

1.Dockerのインストール

アットマークテクノが配布するHwakbitサーバーはコンテナで展開出来る様に設計している為、Dockerをインストールします。
下記URLに従って、”Uninstall old versions”から”Install Docker Engine”までを実行します。
URL:https://docs.docker.com/engine/install/
※既に最新のDockerをインストール済みの方は飛ばして頂いて構いません。

インストールが終わったら下記を実行してdockerが動作する事を確認します。

[PC]$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:e18f0a777aefabe047a671ab3ec3eed05414477c951ab1a6f352a06974245fe7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
<以下略>

上記メッセージが出たら完了です。
作成されたコンテナとコンテナイメージは不要ですので削除しておきます。
このコンテナ名はランダムに命名されますので適宜変更下さい

コンテナの削除
[PC]$ sudo docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
6b4339570df9   hello-world   "/hello"   15 seconds ago   Exited (0) 14 seconds ago             pedantic_raman

[PC]$ sudo docker rm pedantic_raman
pedantic_raman

コンテナイメージの削除
[PC]$ sudo docker images
REPOSITORY                      TAG            IMAGE ID       CREATED         SIZE
hello-world                     latest         feb5d9fea6a5   13 months ago   13.3kB

[PC]$ sudo docker rmi hello-world

2.Hawkbitサーバーの設置

dockerをインストールしましたら、hawkbit用のコンテナを作成します。
ArmadilloサイトからHawkbit docker-composeコンテナをダウンロードします。(以下はG4の例)
 ・各製品ページ->ソフトウェアダウンロード->Armadillo-IoT ゲートウェイ G4 開発用ツール
  ※リンクを右クリックしてURLをコピーすると楽です。

Hawkbit docker-composeコンテナをダウンロード~展開(バージョンは適宜修正)
[PC]$ wget https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-g4/tool/hawkbit-compose-[version].tar.xz
[PC]$ tar xf hawkbit-compose-[version].tar.xz
[PC]$ cd hawkbit-compose-[version]

スクリプトを実行
[PC]$ ./setup_container.sh  //docker-compose,htpasswdをインストールするようなメッセージが出た場合はインストール
HawkBit admin user name [admin]    //user nameを入力
Password for user xxxx:
Confirm password: 
Extra admin user name (empty to stop):   //追加user nameを入力(空の場合は追加しない)
Create hawkBit device user? (for autoregistration) [Y/n]   //後述する自動デバイス登録をする場合はYと入力
Password for user device:
Confirm password:
Create hawkBit mkswu user? (for automated image upload) [Y/n]   //swuイメージの自動アップロード設定
Allow user to handle rollouts? (trigger installation requests) [Y/n]   //上記で設定した全ユーザーに実行権限付与設定
Password for user mkswu: 
Confirm password: 
Setup TLS reverse proxy? [N/y] N //TLSは本ブログでは使用しない為、Nと入力

Setup finished! Use docker-compose now to manage the containers
or run /home/atmark/hawkbit-compose/setup_container.sh again to change configuration.
Start hawkBit containers? [Y/n]     //hawkbitコンテナを立ち上げ確認</b>
Creating network "hawkbit-compose_default" with the default driver
Pulling mysql (mysql:5.7)...
5.7: Pulling from library/mysql
<以下省略>

以上でdocker-composeコンテナが立ち上がりました。
下記コマンドで確認できます。(STATUSがUp~で起動中)

[PC]$ sudo docker ps -a
CONTAINER ID   IMAGE                                        COMMAND                  CREATED          STATUS          PORTS                    NAMES
f5a8155ddf05   mysql:5.7                                    "docker-entrypoint.sâ¦"   31 seconds ago   Up 29 seconds   3306/tcp, 33060/tcp      hawkbit-compose_mysql_1
730bf5f29531   hawkbit/hawkbit-update-server:latest-mysql   "java -jar hawkbit-uâ¦"   31 seconds ago   Up 29 seconds   0.0.0.0:8080->8080/tcp   hawkbit-compose_hawkbit_1

3.UIでデバイスの登録

ブラウザでhawkbitサーバーにアクセスします。
下記IPアドレスはLinuxマシン(仮想含む)のIPアドレスになります。
URL:http://<IPアドレス>:8080  ※本ブログではTLS無し

ブラウザが立ち上がると、先ほど登録したユーザーIDとパスワードを入力してSign inします。

Sign inすると下記TOPページが立ち上がります。ここでデバイス登録を行います。
デバイス登録する方法は下記2つの方法があります。

1.ブラウザでデバイスを登録する方法
  メリット:IDとnameが各デバイスに任意の名前で設定可能
  デメリット:多台数登録時には時間が掛かる

2.SWUpdateでデバイスを自動登録する方法
  メリット:SWUpdateを実行する事で簡単に登録が完了する
  デメリット:IDとnameがデフォルトではArmadillo+シリアル番号で登録される

1.ブラウザでデバイス登録する方法

ブラウザでデバイスを登録する場合は、DeploymentのTargetsから登録します。

次にデバイス固有のController IDと、name、Descriptionを設定し、SAVEします。

SAVEすると下記の様にhawkbit側での登録が完了します。下記の赤い四角で囲ったController IDとtokenは次で使用します。
以上でデバイス1台分のhawkbit側の設定が完了です。

次にHawkbitで登録したController IDとArmadilloを紐づけます。
Armadillo Base OSの/etc/swupdate.cfgでサーバーURLとController ID、tokenを書き換えます。
最後にhawkbitサービスを有効にします。これで10分間隔でサーバーアクセスし、アップデート指示を待つ状態になります。

swupdate.cfgの編集
[armadillo]# vi /etc/swupdate.cfg
<中略>
suricatta: {
  url = "http://<hawkbitサーバーのIP>:8080"; 
  tenant = "default";
  id = "<hawkbitで登録したController ID>";
  targettoken = "<hawkbitで登録した際のtoken>";
  cafile = "/etc/ssl/certs/ca-certificates.crt";
}

swupdate.cfgの永続化
[armadillo]# persist_file /etc/swupdate.cfg
hawkbitサービスの有効化
[armadillo]# rc-update add swupdate-hawkbit default

2.SWUpdateでデバイスを自動登録する方法

SWUpdateで登録する方法は、ATDEの~/mkswu/example/(もしくは/usr/share/mkswu/examples)の
hawkbit_register.descとhawkbit_register.shを使用します。

アップデート用のディレクトリ(名前は任意)を作成し、必要なファイルをコピー
[ATDE]# mkdir update_hawkbit && cd update_hawkbit
[ATDE]# cp ~/mkswu/example/hawkbit* .

hawkbit_register.shを編集
[ATDE]# vi hawkbit_register.sh
#!/bin/sh

# Script configuration: edit this!
HAWKBIT_USER=<hawkbitの設定を行ったuser nameを指定>
HAWKBIT_PASSWORD=<hawkbitの設定を行ったuser passwordを指定>
HAWKBIT_URL=http://<サーバーIP>:8080   //TLS使用しない場合の例
HAWKBIT_TENANT=default
<以下略:TLS使用する場合はマニュアル参照>

mkswuコマンドでswuイメージを作成
[ATDE]# mkswu hawkbit_register.desc
[ATDE]# ls hawkbit_register.swu
hawkbit_register.swu

上記hawkbit_register.swuをUSBメモリやSDカードのTOP階層に入れて、起動中のArmadilloに挿入すると
アップデートが始まります。20-30秒程でリブートが掛かればhawkbit側にデバイスが登録され、armadillo側の
/etc/swupdate.cfgにサーバーURLとController ID、tokenが記載された状態になります。

この時のhawkbitに登録されるController IDとnameはArmadillo+シリアルナンバーとなります。
例えば後のFilterで仕向け先などで変更したい場合、以下でnameを変更したり、Descriptonを追加する事が可能です。

Descriptionを追加する例
[ATDE]# vi hawkbit_register.sh
<中略>
# register a device name for us
register_device() {
	CONTROLLER_ID="armadillo-$DEVICE_ID${REGISTER_RETRY:+-$REGISTER_RETRY}"
	curl $CURLOPT -u "$HAWKBIT_LOGIN" -X POST "${HAWKBIT_URL}/rest/v1/targets" \
		-H 'Content-Type: application/json' -d '[{
			"controllerId": "'"$CONTROLLER_ID"'",
			"name": "Armadillo '"$DEVICE_ID${REGISTER_RETRY:+ ($REGISTER_RETRY)}"'",
                        "description": "<任意の文字列>"
		}]' -o curlout \
		|| error "Could not send request to $HAWKBIT_URL"
<以下略>

以上でSWUpdateでの自動デバイス登録が完了となります。
また、スクリプト内で”rc-update add swupdate-hawkbit default”を実行しておりますので、10分間隔でhawkbit
サーバーにアクセスし、アップデート指示を待つ状態になっています。

4.アップデートの準備~実行

デバイスの登録が完了しましたら、下記手順でアップデートの準備及びアップデートを実行します。

アップデート手順
1.アップデートするデバイスを決める(Target Filters)
2.アップデートファイルをアップロード(Upload)
3.アップデート名の決定とアップデートファイルの紐づけ(Distributions)
4.アップデート実行(Rollout)

1.アップデートするデバイスを決める(Target Filters)

Target Filtersをクリックし、下記図の番号順に設定します。

2.アップデートファイルをアップロード(Upload)

Uploadをクリックし、Software Moduleの右側にある”+”を選択します。
Create new Software Module画面が表示されますので、下記例の様に入力します。

Software Moduleが登録されましたら、アップデートしたいSWUイメージを右下の赤枠にドラッグしてアップロードします。

3.アップデート名の決定とアップデートファイルの紐づけ(Distributions)

Distributionsをクリックし、Distributions ManagementのDistributionsの右側にある”+”を選択します。
Create new Distribution画面が表示されますので、下記例の様に入力します。

最後にUploadで作成したSoftware Moduleを今回作成したDistributionにドラッグします。

4.アップデート実行(Rollout)

Rolloutをクリックし、Rolloutsの右側にある”+”を選択します。
Create new Roolout画面が表示されますので、下記の例の様に入力します。

《備考》
  Action typeの設定
  ・Forced/Soft:設定したら10分以内にアップデート実行
  ・Download Only:ダウンロードのみ
  ・Time Forced:日時指定

  Start type
  ・Manual:手動実行
  ・Auto:自動実行
  ・Scheduled:日時指定

Create new RooloutをSAVEしてアップデートを実行すると、順次Armadillo側からアクセス開始し、アップデートされます。
黄色がアクセス待ち、緑がアップデート完了となります。

以上で、hawkbitサーバの立ち上げ~アップデートが完了です。


開発手順・TIPS集のTOPに戻る