Armadilloフォーラム

swuファイルによるコンテナイメージのバージョンダウン

kirihara

2024年12月12日 20時25分

swuファイルによりバージョンダウンが以下のエラーにより失敗します。
何か解決策はありますでしょうか。

[INFO ] : SWUPDATE running :  [main] : Running on iot-a6e Revision at1
[INFO ] : SWUPDATE started :  Software Update started !
[INFO ] : SWUPDATE running :  [install_single_image] : Installing pre_script
[ERROR] : SWUPDATE failed [0] ERROR : ----------------------------------------------
[ERROR] : SWUPDATE failed [0] ERROR : /!\ Update looks like it already had been installed but rolled back, failing on purpose.
[ERROR] : SWUPDATE failed [0] ERROR : /!\ Set SW_ALLOW_ROLLBACK=1 environment variable to force installing anyway.
[ERROR] : SWUPDATE failed [0] ERROR : ----------------------------------------------
[ERROR] : SWUPDATE failed [0] ERROR : Command failed: sh $1 /var/tmp/scripts_pre.sh
[ERROR] : SWUPDATE failed [0] ERROR : Error streaming enc.zst.scripts_pre.sh
[ERROR] : SWUPDATE failed [1] Image invalid or corrupted. Not installing ...
[INFO ] : No SWUPDATE running :  Waiting for requests...
[ERROR] : SWUPDATE failed [0] ERROR : SWUpdate *failed* !

やろうとしていることとしては、
コンテナイメージ(app_cnt)とコンテナ設定ファイル(app_cnt.conf)を更新するためのswuファイルを作成し、swupdateを実行します。
その際に、コンテナイメージを更新するためのapp_cnt.tarファイルは、差分で作成しています。

podman_partial_image -b app:1.0.2.27 -o app_img.tar app:1.0.0.2.47

バージョンアップ(1.0.2.27 → 1.0.2.47)のtarファイルによるswupdateは問題なくできるのですが、
バージョンダウン(1.0.2.47 → 1.0.2.27)で差分のtarファイルを作って、swu実行すると上記のエラーで失敗します。

swuのdecsファイルは以下の通りです。

swdesc_option component=app_cnt
swdesc_option version=1.0.2.27
swdesc_option install_if=different
SW_ALLOW_ROLLBACK=1
 
swdesc_embed_container "app_img.tar" 
swdesc_files --extra-os --dest /etc/atmark/containers/ "app_cnt.conf"
 
swdesc_option POST_ACTION=reboot

(4行目のSW_ALLOW_ROLLBACK=1は、上記のエラーが出たので試しに入れてみたのですが、同じ結果でした。)

以上、よろしくお願いします。

==========
製品型番:AG6271
Debian/ABOSバージョン:base_os 3.19.1-at.4
カーネルバージョン:Kernel 5.10.218-0-at on an armv7l (/dev/ttymxc2)
3G/LTE モジュール情報 (Debianのみ):
その他:
==========

コメント

at_dominique.m…

2024年12月13日 10時23分

kiriharaさん

お世話になっています、
マルティネです。

> [ERROR] : SWUPDATE failed [0] ERROR : /!\ Update looks like it already had been installed but rolled back, failing on purpose.
> [ERROR] : SWUPDATE failed [0] ERROR : /!\ Set SW_ALLOW_ROLLBACK=1 environment variable to force installing anyway.

こちらのエラーについて説明します。

すでに把握していると思いますが、インストールの仕組みとして A/B アップデートと言って別のパーティションにインストールしてからアップデート先に切り替えます。
(その切り替えの段階でなにか問題あった場合に前のバージョンに戻れますし、インストール中になにかあれば現状のバージョンに影響がないことを保証するためです)

今回のエラーは、インストール先にすでにいまインストールしようとしているバージョンがあるためインストールをあえて失敗させています。
そういう仕組みがなければ、USB等の自動インストールで「インストールが成功したが起動できなかった等で戻った」場合に繰り返しインストールしなおすことになりますので、そうならないようにエラーしています。

> (4行目のSW_ALLOW_ROLLBACK=1は、上記のエラーが出たので試しに入れてみたのですが、同じ結果でした。)

大変分かりにくいですが、こちらの変数は swupdate を実行する際の環境変数で、desc ファイルに設定できません。

対策としては:
* 手動で試す分だけでしたら、エラーメッセージどおりに「export SW_ALLOW_ROLLBACK=1」を行ったあとに「swupdate -i ...」等で swu イメージをインストールしていただければインストールされます。
* また、この状態で、swu 内容は同じ場合は「abos-ctrl rollback --allow-downgrade --reboot」等でも前のバージョンに戻ることはできます。
* (理想な話になりますのでこちらの案を無視していただいても問題ありません
 アプリケーションの動作確認ができる場合は起動時にコンテナが正常に動いてることを確認して、「abos-ctrl rollback-clone」で対面を更新するかロールバックを判断してればその問題はそもそも発生しませんが、なかなかそこまで開発するケースは少ないと思いますし、弊社の案内としてそこまで推奨してないですね…
* リモートでの操作であれば swdesc_option version の分を compare=higher だけにしていただくように推奨しています。
なにかの理由(不具合など)でダウングレードが必要な場合に、それでも一時的にバージョンを仕方なく上げる形になります。
理由はいくつかありますが、compare=different の SWU イメージが漏れた場合に比較的に簡単な古いバージョンを戻すことができるようになりますので、悪意に狙われた場合に古いバージョンをインストールして脆弱性し放題な状態にできてしまいます。
今のバージョン(1.0.2.27) ではやりづらいですが、バージョンを semver式に変更していただければ豊かに記載できるようになります(例えば、1.0.2-47 から 1.0.2-47.revert.27 へ更新できます)
どのみち、差分でアップデートを配布そうていの仕組みでしたらその 1.0.2.47 以外のバージョンからインストールできない状態ですので、そういう運用に問題ないと思われます。

本件はマニュアルにも https://armadillo.atmark-techno.com/faq/swupdate-troubleshooting-abos にも記載ないので、お手数をおかけして申し訳ございません。
これから更新しようと思います。

なにか疑問や質問あれば遠慮なく聞いてください。

よろしくお願いします。