本ブログは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サーバの立ち上げ~アップデートが完了です。