Armadilloフォーラム

Cleanup of old images failed の修正

tmygt

2024年3月7日 21時45分

SWUpdateを試しているのですが、 Cleanup of old images failed が発生して失敗します。

[ERROR] : SWUPDATE failed [0] ERROR : ----------------------------------------------
[ERROR] : SWUPDATE failed [0] ERROR : /!\ image app in /target/etc/atmark/containers/app.conf not found in image store !
[ERROR] : SWUPDATE failed [0] ERROR : ----------------------------------------------
[ERROR] : SWUPDATE failed [0] ERROR : ----------------------------------------------
[ERROR] : SWUPDATE failed [0] ERROR : /!\ cleanup of old images failed: mismatching configuration/container update?
[ERROR] : SWUPDATE failed [0] ERROR : ----------------------------------------------
[ERROR] : SWUPDATE failed [0] ERROR : Command failed: sh $1 /var/tmp/scripts_post.sh
[ERROR] : SWUPDATE failed [0] ERROR : Error streaming enc.zst.scripts_post.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というイメージはすでに使っておらずABOSから削除しています。app.confは現在はbaseというイメージを参照しています。
swuファイルにはconfファイルとイメージを含めています。confファイルはbaseイメージを参照していて、baseイメージも含めています。

下記を参考にしているのですが、現状のABOS上のconfファイルおよびSWUに含まれるconfファイルからappへの参照はすでに削除しているにもかかわらず引き続きこのエラーが表示されます。
https://armadillo.atmark-techno.com/faq/swupdate-troubleshooting-abos

おそらくどこかに過去の設定が残っているのだと思うのですが、どこを確認すればよいでしょうか?

コメント

at_satoshi.ohta

2024年3月8日 11時37分

お世話になっております。
太田です。

このエラーは、confファイルのset_imageに書かれているコンテナイメージがArmadilloに存在しない場合に発生します。

確認のため、swupdateのエラーが発生したArmadillo上でいくつかコマンドを実行して頂けますでしょうか?
はじめに、

armadillo:~# abos-ctrl mount-old

を実行してください。swupdateが失敗した面が /target にマウントされます。その後に、

armadillo:~# podman --storage-opt additionalimagestore=/target/var/lib/containers/storage_readonly images
armadillo:~# cat /target/etc/atmark/containers/app.conf

を実行していただくと、swupdateが失敗した面でインストールしたコンテナイメージとconfファイルを確認できます。
その結果を教えていただければ幸いです。

よろしくお願いいたします。

太田さん

コメントありがとうございます。
実行しました。(実際のログは開発中のアプリケーション名が入ってしまっているので、適宜置き換えています。)

armadillo:~# abos-ctrl mount-old
/usr/sbin/abos-ctrl: line 22: is_mountpointd: not found
Mounted /dev/mmcblk2p1 to /target successfully.
Unmount it with 'abos-ctrl umount /target' when done
armadillo:~# podman --storage-opt additionalimagestore=/target/var/lib/container
s/storage_readonly images
REPOSITORY          TAG         IMAGE ID      CREATED       SIZE        R/O
localhost/base  latest      dce15ce28365  17 hours ago  453 MB      true
<none>              <none>      c5291f7aeb40  2 weeks ago   453 MB      true
armadillo:~# cat /target/etc/atmark/containers/
README                        app.conf
alpine.conf.example 
at-debian-image.conf.example
armadillo:~# cat /target/etc/atmark/containers/app.conf
# TODO: 本番環境用設定を作成する。
armadillo:~#

/target/etc/atmark/containers/app.conf が原因だと考えています。
この /target/etc/atmark/containers/app.conf ですが、descファイルに記載しているものではあるのですが、swuビルド時に同名の他のdescファイルで上書きしているつもりでした。

device.descとdevice-debug.desc2つのdescを用意しています。device-debug.desc では、デバッグ時に有効としたい設定を入れていて(例えばrootでのSSH有効化)、それぞれのdescで/target/etc/atmark/containers/app.confを追加しています。
下記の様にmkswuを実行することで、device-debug.descで追加したapp.confでdevice.descのapp.confが上書きされる想定でした。

mkswu -o image.swu device.desc device-debug.desc

追加で下記2点を質問させてください。

1. 上記の様なmkswu/descの使い方はできないのでしょうか
2. 空のconfファイル(set_imageを書いていないファイル)では暗黙的にファイル名と同名のコンテナがset_imageされるのでしょうか

よろしくお願いいたします。

at_satoshi.ohta

2024年3月8日 18時22分

お世話になっております。
太田です。

回答の順番が逆になってしまいますが、

> 2. 空のconfファイル(set_imageを書いていないファイル)では暗黙的にファイル名と同名のコンテナがset_imageされるのでしょうか

こちらはそのとおりです。app.confに set_image がない場合は app というコンテナイメージを参照しようとします。

> 1. 上記の様なmkswu/descの使い方はできないのでしょうか

可能だと思います。
上記のように2つのdescファイルを使って SWU ファイルを作成すると、ファイルのコピー先が同じ場合、後の方の desc ファイルで上書きされます。
今回の場合は、device-debug.desc の方の app.conf が優先されて上書きされます。
ファイルのコピー先が被らない場合は、それぞれのdescファイルで指定した Armadillo のコピー先に問題なくコピーされるはずです。

前の返信のエラーは device-debug.desc のapp.conf が空であったため、app というコンテナイメージがあるという前提でコンテナを起動しようとしたことから起きたと考えられます。
これは、device-debug.desc のapp.conf に set_image として localhost/base を指定することでエラーを防げると思います。

どうぞよろしくお願いいたします。

太田さん

回答ありがとうございます。

> > 2. 空のconfファイル(set_imageを書いていないファイル)では暗黙的にファイル名と同名のコンテナがset_imageされるのでしょうか
> こちらはそのとおりです。app.confに set_image がない場合は app というコンテナイメージを参照しようとします。

わかりました。

> > 1. 上記の様なmkswu/descの使い方はできないのでしょうか
>
> 可能だと思います。
> 上記のように2つのdescファイルを使って SWU ファイルを作成すると、ファイルのコピー先が同じ場合、後の方の desc ファイルで上書きされます。
> 今回の場合は、device-debug.desc の方の app.conf が優先されて上書きされます。
> ファイルのコピー先が被らない場合は、それぞれのdescファイルで指定した Armadillo のコピー先に問題なくコピーされるはずです。
>
> 前の返信のエラーは device-debug.desc のapp.conf が空であったため、app というコンテナイメージがあるという前提でコンテナを起動しようとしたことから起きたと考えられます。

こちらはdescファイルを再度見直したところ、原因がわかりました。device-debug.desc内のswdesc_optionで記述するバージョンを更新し忘れていました。device.confの内容を書き込み後、device-debug.descは更新が無いと判断されデバッグ用のconfファイルがコピーされなかったのだと考えています。

これを踏まえて追加で質問させてください。

1. 1つのdescファイルにDEBUG時のみ有効になるような記述をする方法は無いでしょうか?
2. 複数のdescファイル(コンポーネント)で同じファイルを取り扱う際に気を付けるべきことはありますか? そもそも避けたほうがよいですか?

> 2. 複数のdescファイル(コンポーネント)で同じファイルを取り扱う際に気を付けるべきことはありますか? そもそも避けたほうがよいですか?

すみません、2は質問があまり明確でない気がしたので無視してください。1の答えを教えていただきたいです。
よろしくお願いいたします。

at_satoshi.ohta

2024年3月11日 17時46分

太田です。

> 1. 1つのdescファイルにDEBUG時のみ有効になるような記述をする方法は無いでしょうか?

descファイル内にシェルスクリプトを書くことができます。
1つのやり方として、シェル内のある環境変数の値を判断してDEBUG時に有効にする機能を追加するかどうかを決める
という方法が考えられます。

例えばDEBUGという環境変数を使うとすると、device.desc内に下記のようにif文を書けます。

if [ "${DEBUG}" = "true" ]; then
 DEBUG時に有効にしたい内容
fi

device.descからSWUファイルを作成するときに、ATDE 上で下記のようにmkswuを実行するとDEBUG時のみ有効にする機能を追加した SWU を作成することができます。

DEBUG=true mkswu -o image.swu device.desc

宜しくおねがいします。

太田さん

> descファイル内にシェルスクリプトを書くことができます。

回答ありがとうございます。
今やっているファイル分割よりも教えていただいた方法のほうがよさそうなので試してみます。