Armadilloフォーラム

swu ファイルによるダウングレードが動かない

mita

2025年1月29日 11時14分

==========
製品型番: Armadillo-IoT G4 AGX4500-C00D0
Debian/ABOS バージョン: 3.18.2-at.1
カーネルバージョン: 5.10.186-0-at
3G/LTE モジュール情報 (Debian のみ):なし
その他:なし
==========

お世話になっております。美多と申します。

desc ファイルに swdesc_option install_if=different オプションを付けることにより、swu ファイルによるダウングレードを試したのですが、以下のエラーが発生して失敗しました。

[INFO ] : SWUPDATE running :  [main] : Running on AGX4500 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//enc.zst.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...
swupdate_image_write failed: Broken pipe
[ERROR] : SWUPDATE failed [0] ERROR : SWUpdate *failed* !

手順は以下の通りです。(すべて install_if=different あり)

- バージョン 1 をインストール
- バージョン 2 をインストール
- バージョン 1 をインストール(失敗)

この現象は、https://armadillo.atmark-techno.com/forum/armadillo/23407 で報告されている問題と同じだと思います。

一方、以下の手順ではダウングレードに成功しました。

- バージョン 1 をインストール
- バージョン 2 をインストール
- バージョン 3 をインストール
- バージョン 1 をインストール(成功)

これについて質問です。

1. 製品マニュアルには install_if=different オプションを付けることにより、ダウングレードすることができる旨の記載がありますが、上記のエラーは swupdate の不具合であるという認識でよろしいでしょうか
2. バージョン 3 (中間バージョン)を挟むとダウングレードできましたが、この方法を回避策としても問題ないでしょうか
3. 中間バージョンを挟む方法で問題ない場合、手順を減らしたいので、USB メモリに中間バージョンとダウングレード対象バージョンの 2 つを格納することでまとめてダウングレードしたいのですが、マニュアルに実行順の規則についての記載が見つかりませんでした。USB メモリに複数の swu ファイルがある場合のインストール順は決まっていますか(ファイル名のアルファベット順?)

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

コメント

at_dominique.m…

2025年1月29日 13時02分

mitaさん

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

> この現象は、https://armadillo.atmark-techno.com/forum/armadillo/23407 で報告されている問題と同じだと思います。

はい、http で「インストールが成功しましたが再起動してみたら起動できなくて戻って、再びインストールされてしまう」問題の回避です。
(USB でもループしますが、USB の場合は USB メモリを抜けばいいので、リモート環境の様な問題にはなりません)

質問の返事から回答させていただきます:

> 1. 製品マニュアルには install_if=different オプションを付けることにより、ダウングレードすることができる旨の記載がありますが、上記のエラーは swupdate の不具合であるという認識でよろしいでしょうか

確かにマニュアルに書いてませんですね…お手数をお掛けして申し訳ございませんで設計どおりです。
(せめて https://armadillo.atmark-techno.com/faq/swupdate-troubleshooting-abos に書いたつもりですが、こちらにも何もないですね…)

今後のアップデートで両方に記載していきます。

> 2. バージョン 3 (中間バージョン)を挟むとダウングレードできましたが、この方法を回避策としても問題ないでしょうか

中間バージョンを破産で(少し時間かかってしまう以外に)問題ありません。

> 3. 中間バージョンを挟む方法で問題ない場合、手順を減らしたいので、USB メモリに中間バージョンとダウングレード対象バージョンの 2 つを格納することでまとめてダウングレードしたいのですが、マニュアルに実行順の規則についての記載が見つかりませんでした。USB メモリに複数の swu ファイルがある場合のインストール順は決まっていますか(ファイル名のアルファベット順?)

ファイル名のアルファベット順で合ってます。
何かの理由で失敗すると次がインストールされますので、その想定で一つの USB メモリを使えます。

これからは独り言なので、無視していただいても構いません。
まず、install-if=different ですが、セキュリティ意識で考えるとあまりいいオプションではありません。イメージの証明に期限がありませんので、USB メモリをなくしたりだれかが古いイメージをコピーしておいたり、数年後現状のバージョンに脆弱性がでてきたらダウングレードできてしまうととても攻撃しやすくなります。
こちらのエラーで失敗するということは本当に rollback の目的でインストールしたいと思いますので(例えば技術者にアップデートのイメージを提供して、アップデート後に何か問題あった場合に戻れる様にしたい)、別の SWU で rollback をさせるのではなく別の方法で rollback 機能を直接に利用した方がいいかもしれません (製品のインタフェースとして難しいかもしれません…)

また、SWU 構築時にこのチェックをスキップするオプションがあると思ってましたが、影響の大きい「FORCE_VERSION」しかないですね(こちらのオプションもマニュアルにありませんが、本当に使ってほしくないオプションです)… ATDE の /usr/share/mkswu/scripts/pre_init.sh を直接に編集すればできますが…
デフォルトの動作はこのままにしたいですが、今後のアップデートに何かのオプションを足すかもしれませんが、すぐできる他の回避方法としては:
* 3 の成功する swu ではなく、失敗する swu (例えば desc ファイルに「swdesc_command false」) の swu でもいいです。こういう swu をインストールすると B面が利用不可能になりますので、rollback扱いされなくなるはずです。
(一応の注意点としては、USB メモリをさした状態で再起動するとまたインストールされますので、インストール後にも rollback不可能になります)
* rollback を本当に使わないのであれば /etc/local.d/no_rollback.start 等に「fw_setenv upgrade_available」で起動が成功した場合に rollback を無効化すると最初から失敗した swu と同じ状態になりますので、こちらのエラーはもう発生しません。

よろしくお願いします。

マルティネ様
ご回答ありがとうございました。
提示した方法で回避する方向で検討しようと思います。