ブログ

Armadillo-IoT G4:簡易Webサーバーでソフトウェアをリモートアップデートする方法

at_shinya.matsumoto
2022年8月4日 10時30分

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

SWUpdateとは

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

主な機能

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

アップデート対象例

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

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

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

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

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

本ブログでは1.簡易サーバーを用いたリモートアップデートについて紹介します。

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

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


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

実施手順

本ブログではコンテナとコンテナイメージをアップデートする例として紹介します。

自動でのリモートアップデート実施手順
1.アップデート前後のコンテナ動作説明
2.アップデートファイルの作成
3.swupdate-urlの設定
4.アップデート確認

1.アップデート前後のコンテナ動作説明

アップデートされている事が分かる簡単なコンテナを作成し、アップデートしてみます。

コンテナの処理内容
・アップデート前のコンテナ:スクリプトでecho "test container ver1"を実行してコンテナ終了
・アップデート後のコンテナ:スクリプトでecho "test container ver2"を実行してコンテナ終了

出力結果は直接コンソールには出ませんので、"podman logs コンテナ名"で確認し、アップデートを確認します。
※podman logsコマンドは実行エラーなども表示されますのでデバッグ時もご活用ください。

現在のコンテナイメージ
[armadillo]# podman images
REPOSITORY                      TAG         IMAGE ID      CREATED         SIZE        R/O
localhost/test_container_image  v1.0        ec8563d69b6a  21 minutes ago  123 MB      true
 
コンフィグファイルの作成
[armadillo]# vi /etc/atmark/containers/test_container.conf
set_image localhost/test_container_image:v1.0
set_command ./root/test.sh
 
コンテナ動作確認
[armadillo]# podman_start test_container
Starting 'test_container'
1418aee44ec8d8bcd99e051da4a722aa3cf68042826f09a0daea4452a52e3603
[armadillo]# podman logs test_container
test container ver1

上記で”test container ver1”が出力されている事が分かります。
このコンテナを定期リモートアップデートで入れ替えます。

2.アップデートファイルの作成

アップデートするファイルを準備します。

アップデートするコンテナイメージはスクリプトのechoの内容を"test container ver2"に
変更した、test_container_image:v2.0を作成し、アーカイブとしてt_c_image_v2.tarを
USBメモリに保存します。後にATDEで使用します。

イメージを作成(過程は割愛)
[armadillo]# podman images
REPOSITORY                      TAG         IMAGE ID      CREATED       SIZE        R/O
localhost/test_container_image  v2.0        fc4b1b5852cb  21 minutes ago  123 MB      false    //←作成したイメージ
localhost/test_container_image  v1.0        ec8563d69b6a  31 hours ago  123 MB      true
 
イメージのアーカイブ保存(sda1は適宜調整)
[armadillo]# mount /dev/sda1 /mnt
[armadillo]# podman save -o /mnt/t_c_image_v2.tar localhost/test_container_image:v2.0
[armadillo]# umount /mnt


次にコンフィグファイルのイメージ名を下記の様に変更します。
コンフィグファイルの書式は製品マニュアルまたはこちらのブログを参照下さい。
変更したコンフィグファイルもATDEで使用する為、USBメモリ等にコピーしておきます。

コンフィグファイル変更(イメージのタグのみ変更)
[armadillo]# vi /etc/atmark/containers/test_container.conf 
set_image localhost/test_container_image:v2.0
set_command ./root/test.sh


次にswuイメージ作成用のdescファイルを作成します。 descファイル作成の書式はこちら、または製品マニュアルを作成下さい。
ATDEの"/usr/share/mkswu/examples/"にもサンプルがありますので参考にしてください。
今回はupdate.descファイルを下記の様に作成しました。このupdate.descファイルからswuファイルを作成します。
※descファイル名はサーバーアクセス時のファイルパスに含まれる為、毎回同じ名前とします。

[ATDE]# cat update.desc
#コンテナイメージ設定(swuファイルに組み込み)
swdesc_embed_container "t_c_image_v2.tar" \
        --version test_container_demo 1
 
#confファイルの設置
swdesc_files --version extra_os.test_container_demo 1 \
        --dest /etc/atmark/containers \
        "test_container.conf"


最後にswuイメージを作成します。
事前に作成したコンテナイメージのアーカイブやコンフィグファイルをdescファイルと同じ階層に
配置しておきます。(ディレクトリ+日付などでディレクトリ管理すると分かりやすいです)

[ATDE]# ls
t_c_image_v2.tar  test_container.conf  update.desc
[ATDE]# mkswu update.desc
[ATDE]# ls update.swu
update.swu


以上でswuイメージファイル作成は完了です。
swuファイルをWebサーバーにアップロードしておきます。

3.swupdate-urlの設定

以下の順にswupdate-urlの設定を行います。

swupdate-urlサービスを有効にする
[armadillo]# rc-update add swupdate-url
 
アクセスするURLを設定する(ファイル名まで設定)
[armadillo]# echo https://server/update.swu > /etc/swupdate.watch
 
アクセスする周期、時間、ランダムディレイを設定する(設定内容は下記で解説)
ここでは毎日15時~21時の間にアップデートを実行する設定
[armadillo]# echo 'schedule="15 tomorrow"' > /etc/conf.d/swupdate-url
[armadillo]# echo 'rdelay="21600"' >> /etc/conf.d/swupdate-url 
 
各種ファイルを永続化する
[armadillo]# persist_file /etc/swupdate.watch /etc/conf.d/swupdate-url


"schedule"に代入する日時はdate -d "xxxxx"コマンドで設定可能なものを設定する事が出来ます。
設定した時間になると、再度自動的に次の日程が設定されます。
例) ※0時は0時~23時まで設定可能
 毎日0時:0 tomorrow
 隔日0時:0 2 days
 毎週0時:0 next week
 隔週0時:0 2 weeks
 毎月0時:0 next month
 隔月0時:0 2 months
 毎週月曜日0時:0 next monday
 隔週月曜日0時:0 2 monday

"rdelay"はサーバーアクセスが集中しない様にランダムにディレイを必要に応じて設けます。
設定単位は秒で、"rdelay"が21600で0~6時間の間、1800で0~30分の間でランダムに設定されます。

4.アップデート実行確認

設定した時刻になるとアップデートが自動で始まります。
アップデートが完了して再起動したら、アップデートした内容を改めて確認します。
ここでは入れ替えたコンテナイメージ、コンフィグファイル、コンテナ動作の確認をします。

コンテナイメージを確認(タグがv2.0に変わっている)
[armadillo]# podman images
REPOSITORY                      TAG         IMAGE ID      CREATED       SIZE        R/O
localhost/test_container_image  v2.0        fc4b1b5852cb  30 hours ago  123 MB      true
 
コンテナイメージを確認(タグがv2.0に変わっている)
[armadillo]# cat /etc/atmark/containers/test_container.conf
set_image localhost/test_container_image:v2.0
set_command ./root/test.sh
 
コンテナの動作確認(既に自動起動して動作完了している為、標準出力ログを確認)
[armadillo]# podman logs test_container
test container ver2


アップデートした項目全て問題無い事を確認したら、最後にアップデートログも確認し、エラー等が無い事を
確認します。Armadillo Base OSのバージョン"v3.16.2-at.5"からは次回アップデート予定時刻もログに出力されます。

ログの確認(tail -n 20などは適宜調整)
[armadillo]# grep swupdate /var/log/messages | tail -n 20


以上で簡易webサーバーを使用したアップデートは完了です。