Armadilloフォーラム

swupdateでコンテナだけ再起動したいが、電源再起動がかかってしまう

kn_kobayashi

2023年3月2日 18時56分

お世話になっております。

swupdateを使用して、「コンテナだけ再起動」(電源は再起動しない)を実現しようとしております。
色々参考にしながら、下記の様にdescを作成し、mkswuにてswuイメージを作成しました。
--------------------------------------
swdesc_option version=1
swdesc_option POST_ACTION=container
swdesc_embed_container "sample-container.tar" \
--version sample-container 1
swdesc_files --extra-os --dest /etc/atmark/containers "sample-container.conf"
--------------------------------------

作成したswuをいざArmadilloで実行すると、どうしても再起動がかかってしまいます。
一番最後の「swdesc_files --extra-os --dest /etc/atmark/containers "sample-container.conf"」を
削除すると、再起動がかかりません。

ということで、質問なのですが、
「swdesc_option POST_ACTION=container」
こちらの設定は「コンテナだけが更新された場合は再起動しない」という意味であり、
一番最後の「swdesc_files --extra-os --dest /etc/atmark/containers "sample-container.conf"」が
rootfsの変更に引っかかり、コンテナだけの変更とはみなされず再起動がかかっている、
という認識で宜しいでしょうか。
ということはconfファイルを更新する場合は必ず再起動がかかる、ということになりますでしょうか。

またこれは要望になりますが、
https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro
https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-base-os-dev
上記のページのどこをよんでも、「--extra-os」の説明がなく、分かりづらかったです。
まったく別の「個人ブログ」で「--extra-os」についての記載を発見しましたが、
上記のページにもご記載いただけないでしょうか。

コメント

at_dominique.m…

2023年3月3日 8時50分

kn_kobayashiさん、

> 作成したswuをいざArmadilloで実行すると、どうしても再起動がかかってしまいます。
> 一番最後の「swdesc_files --extra-os --dest /etc/atmark/containers "sample-container.conf"」を
> 削除すると、再起動がかかりません。

はい、os の部分を更新する際に再起動でしか切り替えできませんので、base_os か --extra-os を利用した swu ではどうしても再起動してしまいます。

> ということで、質問なのですが、
> 「swdesc_option POST_ACTION=container」
> こちらの設定は「コンテナだけが更新された場合は再起動しない」という意味であり、
> 一番最後の「swdesc_files --extra-os --dest /etc/atmark/containers "sample-container.conf"」が
> rootfsの変更に引っかかり、コンテナだけの変更とはみなされず再起動がかかっている、
> という認識で宜しいでしょうか。
> ということはconfファイルを更新する場合は必ず再起動がかかる、ということになりますでしょうか。

はい、そのとおりです。 conf ファイルは OS の部分に入っていますので、この場合は「set_image my_container:latest」などで固定しないことをおすすめします。コンテナのバージョンは swu のバージョンで管理していますので、コンフィグファイルと swdesc の二ヶ所で管理しなくてもいいと考えています。

swu の desc ファイルに複数のバージョンを指定できますので、コンフィグを念のため(古いイメージの更新や出荷状態の初期書き込み用)に入れたい場合は別のバージョンを指定することで、コンフィグの更新の場合のみ再起動することになりますが、どうでしょうか?

swdesc_option version はその下にある swdesc_*コマンドに適用されますので、以下の二つのコンフィグのどれかでできると思います。使いやすそうな方を試してみてください。

# コンフィグの変更がない場合に再起動させません
swdesc_option POST_ACTION=container
 
# コンテナのバージョン
swdesc_option version=2
swdesc_embed_container "sample-container.tar"
 
# コンフィグのバージョン
swdesc_option version=1
swdesc_files --extra-os --dest /etc/atmark/containers "sample-container.conf"
 
----------------
 
# コンフィグの変更がない場合に再起動させません
swdesc_option POST_ACTION=container
 
swdesc_embed_container --version sample-container 1 \
    "sample-container.tar"
 
swdesc_files --version extra_os.sample-container 1 \
    --dest /etc/atmark/containers "sample-container.conf"

マニュアルには「 swdesc_option POST_ACTION=container: コンテナのみのアップデート後に再起動を行いません。 コンテナの中身だけをアップデートする場合、Armadillo-IoT ゲートウェイ G4を再起動せずにコンテナだけを再起動させます。 」で説明されていますが、「コンテナの中身だけをアップデートする場合」ではなく「Armadillo Base OS の更新がない場合」にした方がいいかもしれません。
改めて考えて更新したいと思います。

> またこれは要望になりますが、
> 上記のページのどこをよんでも、「--extra-os」の説明がなく、分かりづらかったです。
> まったく別の「個人ブログ」で「--extra-os」についての記載を発見しましたが、
> 上記のページにもご記載いただけないでしょうか。

そうですね、マニュアルの「9.8.5. mkswu の desc ファイル」[1]の最初の方にバージョンの説明をして、「swdesc_* コマンドに --extra-os オプションを追加すると、 component に自動的に extra_os. を足します。」で --extra-os の説明になっているつもりでしたが、流れではかなり分かりにくいですね。
この助言もありがたくいただいて、3月のアップデートで改善したいと思います。

[1] https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…

よろしくお願いします。

大分遅くなりましたが、ご回答ありがとうございました。

追加で質問になります。

①swdesc_option version=XXですが、swupdateを実施するたびに、この数字を上げていかないと、アップデート出来ない仕様でしょうか。
ちょっとだけ修正したい!っていう場合でも、毎回数字が上がっていく為、不便に感じております。

②version=1からやり直したい場合、以下の手順を試してから、swupdate -iを試していますが、
「Waiting for btrfs to flush deleted subvolumes」でフリーズしてしまうことが多々あります。
何か間違っているのでしょうか。
・/etc/sw-version から、該当コンテナのバージョンを消す
・podman rmで、コンテナを削除する

③versionが変わっていなくても強制上書きするモードはないのでしょうか。
「下がっている場合を許可する」はあったと思うのですが、「同じ場合上書き」を許可したいです。

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

at_dominique.m…

2023年3月20日 9時28分

kn_kobayashiさん、

マルティネです。

> ①swdesc_option version=XXですが、swupdateを実施するたびに、この数字を上げていかないと、アップデート出来ない仕様でしょうか。
> ちょっとだけ修正したい!っていう場合でも、毎回数字が上がっていく為、不便に感じております。

はい、毎回上げる仕組みです。
面倒のは承知の上で、丁度今月のアップデート(3月28日リリース予定)で mkswu --update-version file.desc の新しいコマンドを用意しました。
試したい場合は https://github.com/atmark-techno/mkswu/ をクローンして直接に git のディレクトリから ./mkswu で実行できますが、リリースまで手動でバージョンの管理でもいいです。

> ②version=1からやり直したい場合、以下の手順を試してから、swupdate -iを試していますが、
> 「Waiting for btrfs to flush deleted subvolumes」でフリーズしてしまうことが多々あります。

このメッセージは予備の /var/app/volumes やコンテナイメージを消した後に、カーネルが本当に削除されたことを待っています。
scheduling やデータの量によって、十秒か一分もかかる場合はありますが、完全に固まることはないはずです。(一応、30分の制限を設定していますが、30分かかったら何かの問題があります)

フリーズと言うのは、どれぐらいの時間でしょうか?
本当に長い時間であれば少し情報を伺いたいですが、よろしいでしょうか?

> 何か間違っているのでしょうか。
> ・/etc/sw-version から、該当コンテナのバージョンを消す

大量の armadillo の場合におすすめしませんが、手元の armadillo でテストする分には問題ありません。
消されたバージョンの分が再びインストールされます。

> ・podman rmで、コンテナを削除する

これも問題ありませんが、
abos-ctrl podman-storage --disk の場合ですね?
(読み取り専用の subvolume ではない、の確認です)

> ③versionが変わっていなくても強制上書きするモードはないのでしょうか。
> 「下がっている場合を許可する」はあったと思うのですが、「同じ場合上書き」を許可したいです。

下がった場合は --install-if differentで指定できますね。

同じ場合は swupdate が対応してくれないのでどうしようもないですが、どうしてもインストールしたい場合はバージョンを指定せずに swdesc_option FORCE_VERSION で強制的にインストールさせます。
(バージョンが指定された場合にあ、FORCE_VERSION と関係なく使われていますので、swdesc_option version の行も消す必要があります)

この場合は/etc/sw-versions に何も記載されてませんし、ネットワークでアップデートする場合に難度もアップデートされてしまいますので開発の時だけに使ってください。

個人的には mkswu --update-version を上手く使っていただけたら、通常に上がる形でいいと思いますが、その対応が遅くなってすみませんでした。

よろしくお願いします。