Armadilloフォーラム

ABOS Web REST APIを使ってコンテナからソフトウェア更新を行う際のエラー

tmygt

2024年2月22日 16時21分

お世話になっております。
ABOS Web REST APIのソフトウェア更新機能をコンテナから実行しています。
POST "/api/swu/install/upload" を使い、コンテナからファイルをアップロードしています。

podman-strage --disk の状態で更新を試したところ、下記のようなwarningが出ており、更新に失敗します。

# curl -k -F swu=@"/data/update.swu" https://127.0.0.1:58080/api/swu/install/upload -u atmark:XXXXXXXXXX
(中略)
{"stdout":"[WARN ] : SWUPDATE running :  [read_lines_notify] : ----------------------------------------------\n"}
{"stdout":"[WARN ] : SWUPDATE running :  [read_lines_notify] : WARNING: Persistent storage is used for podman, stopping all containers before updating\n"}
{"stdout":"[WARN ] : SWUPDATE running :  [read_lines_notify] : ----------------------------------------------\n"}

tmpfsモードでは下記のように表示されて、更新できました。

# curl -k -F swu=@"/data/update.swu" https://127.0.0.1:58080/api/swu/install/upload -u atmark:XXXXXXXXXX
(中略)
{"stdout":"[INFO ] : SWUPDATE running :  [read_lines_notify] : swupdate waiting until external reboot\n"}
{"exit_signal":9}

質問が2点あります。

1. コンテナからREST APIを使って更新する場合、tmpfsモードであることが必須でしょうか?
本番環境ではtmpfsにするので問題ないのですが、この挙動が想定通りかを確認させてください。
もし想定通りの場合、ドキュメントに記載があると嬉しいです。

2. "exit_signal":9 での終了は正常終了とみなしてよいでしょうか?
自動リブートを無効にしているからかもしれませんが、ドキュメントの実行例では {"exit_code":0} が返ってきているようなので、これが正常終了なのか知りたいです。

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

コメント

at_dominique.m…

2024年2月22日 17時22分

tmygtさん

マルティネです。

> 1. コンテナからREST APIを使って更新する場合、tmpfsモードであることが必須でしょうか?
> 本番環境ではtmpfsにするので問題ないのですが、この挙動が想定通りかを確認させてください。
> もし想定通りの場合、ドキュメントに記載があると嬉しいです。

ワーニングがでたところで失敗しないはずですが、ここで送っていただいたログの後に他の出力がありますでしょうか?
また、REST API 経由で他のログがなければ「grep -i swupdate /var/log/messages」も確認していただければ幸いです。

(最新のバージョンで確認してますが、この点に関しては特に変更なかったはずです)

> 2. "exit_signal":9 での終了は正常終了とみなしてよいでしょうか?
> 自動リブートを無効にしているからかもしれませんが、ドキュメントの実行例では {"exit_code":0} が返ってきているようなので、これが正常終了なのか知りたいです。

バージョン 1.2.2 (最新)の更新で

{"exit_signal":9}

から

{"stderr":"Killed\n"}
{"exit_code":0}

として表示されるように変更が入りました。

この出力自体に問題がなく、「swupdate waiting until external reboot」メッセージが表示された時点で成功していますのでそこは無視していいです。

ただし、1.2.2 前のバージョンで複数の swupdate を同時にトリガーすると、二つのアップデートプロセスがお互いの邪魔になって失敗してしまいます。後でリトライすればまた成功しますが、abos-web 経由でアップデートを行う予定でしたらアップデートした方がいいかもしれません。

よろしくお願いします。

tmygt

2024年2月22日 17時38分

マルティネさん

コメントありがとうございます。
まずエラーコードについては、ABOSを更新して試してみます。

> ワーニングがでたところで失敗しないはずですが、ここで送っていただいたログの後に他の出力がありますでしょうか?
> また、REST API 経由で他のログがなければ「grep -i swupdate /var/log/messages」も確認していただければ幸いです。

これ以降のログはありません。messagesを取得したので下記に記載します。(grepではなく、messageから目視で抜き出したので、漏れがありそうであれば教えてください。)

Feb 22 15:37:51 armadillo user.info swupdate: START Software Update started !
Feb 22 15:37:53 armadillo user.info swupdate: RUN [install_single_image] : Installing pre_script
Feb 22 15:37:53 armadillo user.info swupdate: RUN [read_lines_notify] : Skipping install of component base_os 3.18.5-at.8 (has 3.18.5-at.8)
Feb 22 15:37:53 armadillo user.info swupdate: RUN [read_lines_notify] : Skipping install of component boot 2020.4-at21 (has 2020.4-at21)
Feb 22 15:37:53 armadillo user.info swupdate: RUN [read_lines_notify] : Skipping install of component cyd-debug 0.0.2-dev.2 (has 0.0.2-dev.2)
Feb 22 15:37:53 armadillo user.info swupdate: RUN [read_lines_notify] : Skipping install of component extra_os.cyd-debug 0.0.2-dev.2 (has 0.0.2-dev.2)
Feb 22 15:37:54 armadillo user.info swupdate: RUN [read_lines_notify] : No base os update: copying current os over
Feb 22 15:37:58 armadillo user.warn swupdate: RUN [read_lines_notify] : ----------------------------------------------
Feb 22 15:37:58 armadillo user.warn swupdate: RUN [read_lines_notify] : WARNING: Persistent storage is used for podman, stopping all containers before updating
Feb 22 15:37:58 armadillo user.warn swupdate: RUN [read_lines_notify] : ----------------------------------------------
Feb 22 15:38:08 armadillo user.info swupdate: RUN [read_lines_notify] : Command 'command podman stop -a' output:
Feb 22 15:38:08 armadillo user.info swupdate: RUN [read_lines_notify] : time="2024-02-22T15:38:08+09:00" level=warning msg="StopSignal SIGTERM failed to stop container device-app in 10 seconds, resorting to SIGKILL"
Feb 22 15:38:08 armadillo user.info swupdate: RUN [read_lines_notify] : 97f18d79ca0a77e461b1c741c606c0425b5818fd4e8a31613ef6d945bfd64841
Feb 22 15:38:08 armadillo user.info swupdate: RUN [read_lines_notify] : 3566e6b9263f2dd4c0348e66853b6653b6f0198b3cd73ce6a5ab146f185e1bc7
Feb 22 15:38:08 armadillo user.info swupdate: RUN [read_lines_notify] : 8151a51e902086d25313e7dc03257d0f45d3e67a1e1e2ca396c544fc836d5296
Feb 22 15:38:08 armadillo user.info swupdate: RUN [read_lines_notify] : Command 'command podman rm -a -f' output:
Feb 22 15:38:08 armadillo user.info swupdate: RUN [read_lines_notify] : 8151a51e902086d25313e7dc03257d0f45d3e67a1e1e2ca396c544fc836d5296
Feb 22 15:38:08 armadillo user.info swupdate: RUN [read_lines_notify] : 97f18d79ca0a77e461b1c741c606c0425b5818fd4e8a31613ef6d945bfd64841
Feb 22 15:38:08 armadillo user.info swupdate: RUN [read_lines_notify] : 3566e6b9263f2dd4c0348e66853b6653b6f0198b3cd73ce6a5ab146f185e1bc7
Feb 22 15:38:09 armadillo user.info swupdate: RUN [read_lines_notify] : Waiting for btrfs to flush deleted subvolumes
Feb 22 15:38:12 armadillo user.err swupdate: FAILURE ERROR : Checksum WRONG ! Computed 0x3f857a7, it should be 0xe4922c97
Feb 22 15:38:12 armadillo user.err swupdate: FATAL_FAILURE Image invalid or corrupted. Not installing ...
Feb 22 15:38:12 armadillo user.info swupdate: RUN [read_lines_notify] : Restarting containers
Feb 22 15:38:12 armadillo user.err swupdate: FAILURE ERROR : time="2024-02-22T15:38:12+09:00" level=warning msg="The input device is not a TTY. The --tty and --interactive flags might not work properly"

at_dominique.m…

2024年2月22日 17時49分

> これ以降のログはありません。messagesを取得したので下記に記載します。

> Feb 22 15:38:12 armadillo user.err swupdate: FAILURE ERROR : Checksum WRONG ! Computed 0x3f857a7, it should be 0xe4922c97

チャックサムのエラーとして表示されてますが、ファイルが途中で切れてあるかもしれません。
先ほどは 127.0.0.1 で localhost を叩いてるから気づいてませんでしたが、コンテナから abos-web にイメージを送信していますね?

それでしたらコンテナを停止することで、リクエスト側のコンテナも停止されてしまいますので、それで詰みです…
アップデートが大きくなる可能性がたかいので、バッファリングせずにインストールしていますので、そこはちょっとどうしようもないと考えています。
tmpfs モードならコンテナが最後まで起動されたままなので、それで問題なく更新できます。

disk モードでもコンテナを停止しないまま更新することができればそれで回避出きるかもしれませんが、インストールの最後に古いイメージを削除していますので disk モードはそれに向いてないですね… 現在のアップデートスクリプトでは停止させない方法は用意してません。

逆に、運用は tmpfs モードでする予定であれば disk モードを完全に止めた方がいいかもしれません。
運用に近い環境になるのも心強いだと思いますが、いかがでしょうか? disk モードにしている理由は何かありますか?

よろしくお願いします。

tmygt

2024年2月22日 20時47分

> チャックサムのエラーとして表示されてますが、ファイルが途中で切れてあるかもしれません。
> 先ほどは 127.0.0.1 で localhost を叩いてるから気づいてませんでしたが、コンテナから abos-web にイメージを送信していますね?

はい。--net=host なコンテナから実行しています。

> それでしたらコンテナを停止することで、リクエスト側のコンテナも停止されてしまいますので、それで詰みです…
> アップデートが大きくなる可能性がたかいので、バッファリングせずにインストールしていますので、そこはちょっとどうしようもないと考えています。
> tmpfs モードならコンテナが最後まで起動されたままなので、それで問題なく更新できます。

> disk モードでもコンテナを停止しないまま更新することができればそれで回避出きるかもしれませんが、インストールの最後に古いイメージを削除していますので disk モードはそれに向いてないですね… 現在のアップデートスクリプトでは停止させない方法は用意してません。

diskモードは1面しかないんですね。ここを理解できていなかったです。

> 逆に、運用は tmpfs モードでする予定であれば disk モードを完全に止めた方がいいかもしれません。
> 運用に近い環境になるのも心強いだと思いますが、いかがでしょうか? disk モードにしている理由は何かありますか?

マニュアルを最初に読んだ際にdiskモードに切り替えてそのままでした。いずれtmpfsに変えるつもりではあったので、これを機に変更します。
ありがとうございました。