Armadilloフォーラム

.swuファイルの差分作成について

m-h

2024年1月30日 14時20分

「swupdate」機能を使用して「.swu」ファイルを作成する際、全てのイメージを新たに作成するのではなく、
前回のアップデートからの差分だけを含むイメージファイルを作成し、それをアップデートする方法はありますか?
可能ならば、具体的な手順を教えていただけると大変助かります。

※LTE経由でのアップデートを検討しており、ファイルサイズを可能な限り小さくしたいと考えています。

コメント

at_dominique.m…

2024年1月30日 16時42分

m-hさん、

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

> 「swupdate」機能を使用して「.swu」ファイルを作成する際、全てのイメージを新たに作成するのではなく、
> 前回のアップデートからの差分だけを含むイメージファイルを作成し、それをアップデートする方法はありますか?

アップデート内容によります。

Armadillo Base OS の部分自体(rootfs) は差分アップデートを今のところ対応してません(理由はいくつかありますが、仕組みとして persist_file で変更可能になっているため安全のためにフールアップデートが好ましと考えています。研究課題としてはいつか改善したいと思いますが、圧縮して 50MB程度なので優先度は低いです)

コンテナの方のデーターは二つに別けてあります:
* ボリュームファイル(/var/app/volumes または /var/app/rollback/volumes にあるファイル)は swu によるアップデートの場合に前のファイルが残った状態に追加する形になりますので、ファイル内の差分までではありませんが更新したいファイルだけを送信できます。
* コンテナのイメージは「podman_partial_image」というツールでコンテナイメージのレイヤーを一つだけ更新することはできます。
参考:マニュアル ( https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p… )、ブログ( https://armadillo.atmark-techno.com/blog/15288/12148 )
最後まで(swu イメージを生成するところまで)の例が無くてすみません、swu のイメージで問題があれば聞いてください。

よろしくお願いします

マルティネさん

お世話になっております
m-h

資料展開していただきありがとうございます。
おかげさまでCUIでのコンテナのpatial_updateを実行することができました。

また、追加でのご質問で恐縮ですが、VScodeで作成したプロジェクトに対しても可能でしょうか?
拡張機能であるArmadillo Base OS Development Environment内で上記実現できればと考えております
スクリプト内(generate_swu.sh,build_container_image.sh)内に「podman_partial_image」コマンドを組み込む必要がありますでしょうか?

よろしくお願いします

at_dominique.m…

2024年3月1日 15時03分

m-hさん、

マルティネです。

> おかげさまでCUIでのコンテナのpatial_updateを実行することができました。

差分アップデートができてよかったです。

> また、追加でのご質問で恐縮ですが、VScodeで作成したプロジェクトに対しても可能でしょうか?
> 拡張機能であるArmadillo Base OS Development Environment内で上記実現できればと考えております
> スクリプト内(generate_swu.sh,build_container_image.sh)内に「podman_partial_image」コマンドを組み込む必要がありますでしょうか?

大変残念ですが、対応はもう少し難しいです。
VSCode で生成するイメージは "Generate SWU" を実行する度にゼロからの「podman build」を実行しています。
そのため、ベースになるコンテナのイメージは特定できてません。

Dockerfile に使用している "FROM docker.io..." の部分のコンテナに変更なければそれを podman_partial_image のベースとしてしようすれば差分アップデートは生成できますが、今の仕組みでその保証も確認の方法がないので、実装に困っているところです。(Generate SWU の開始時点と podman build の後で状況を確認しても、今回の実行で変更がなくても前の実行で変更があった可能性もありますので、Armadillo 側のバージョンを確認できないため簡単に対応できない状態です)
そもそも、パッケージを追加した場合は docker.io のイメージよりビルドのレイヤーの方が大きいので、差分を対応するとしたらビルドを「依存のインストール」と「プログラムのインストール」にわけて丁寧に管理する必要があります。

個別の対応としては、build_container_image.sh の変更でできそうですね。
確認せずにざっくりですみませんが、この流れでどうでしょうか:
-(スクリプトなどを変更する前に必ずコピーをしてください)
- 一度ビルドされたイメージに名前をつけます(podman tag xxx_app:latest xxx_app:base)
- container/Dockerfile でそのイメージを FROM xxx_app:base に変更します
- build_container_image.sh の save_image() 関数に podman save を podman_partial_image -b xxx_app:base に変更します。

それで差分アップデートが生成されますが、vscode で生成したイメージはもうブランクな armadillo にインストールできなくなりますので注意が必要です。
また、時間が経てば経つほど「apt upgrade」の差分が大きくなりますので、定期的にベースのタグを更新するかイメージをゼロから作り直す必要もあります。

よろしくお願いします。