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