Armadilloフォーラム

「コンテナの2面化」とはどのように実現されているのでしょうか

kn_kobayashi

2022年12月24日 23時04分

お世話になります。

「コンテナの2面化」について質問です。
以下の資料やBaseOSの開発マニュアル等を見る限り、コンテナも2面化されているものと認識しています。
https://armadillo.atmark-techno.com/system/files/protected_files/2021-1…

しかし、こちらはOSやブートローダーと違い、パーティションをA/B面で管理しているわけではなさそうです。
しかもパーティション単位ではなく、絵を見る限りではコンテナ単位で2面化?されている絵になっています。
コンテナの2面化とは、どのように実現されているのでしょうか。
電源断等によりコンテナを保存しているパーティションのファイルシステムが破損しても、コンテナは復旧すると思っていますが、認識違っていますでしょうか。

コメント

at_dominique.m…

2022年12月26日 10時17分

kn_kobayashiさん、

お世話になっています、
アットマークテクノのマルティネです。

> 「コンテナの2面化」について質問です。
> 以下の資料やBaseOSの開発マニュアル等を見る限り、コンテナも2面化されているものと認識しています。
> https://armadillo.atmark-techno.com/system/files/protected_files/2021-1…

そうです、コンテナも2面化されています。
具体的に、コンテナのイメージを服務 /var/lib/containers/storage_readonly とボリューム用の /var/app/rollback/volumes が2面化されていますが、/var/app/volumes はデータベースやログをなくさないように2面化していません。
ボリュームのディレクトリを選ぶ時にその点を考慮してください。

> しかし、こちらはOSやブートローダーと違い、パーティションをA/B面で管理しているわけではなさそうです。
> しかもパーティション単位ではなく、絵を見る限りではコンテナ単位で2面化?されている絵になっています。

それは絵で確かに勘違いしやすいですが、コンテナ単位ではなくセットで2面化されていますね。指摘ありがとうございました、改善できないか相談してみます。

> コンテナの2面化とは、どのように実現されているのでしょうか。

実装としては btrfs の サブボリューム(subvolume)を使っています。swupdate でアップデートを行う際にサブボリュームを 「snapshot 」することで、時間も容量も使わずにコピーすることができます。
切り替えた後にファイルに変更を行う場合は、元のデータを変更することなく「copy on write」機能で新しいファイルを書き込んで、元のデータを維持します。
rollback の際に正しいサブボリュームをマウントして、もとのコンテナ状態に戻ります。

> 電源断等によりコンテナを保存しているパーティションのファイルシステムが破損しても、コンテナは復旧すると思っていますが、認識違っていますでしょうか。

ファイルシステム全体が故障すれば復帰は確かに不可能ですが、btrfs 全体の故障の可能性はとても低いと判断しました。
弊社としては btrfs を初めて使うことになりましたが、先ほど話した copy on write の機能で壊れにくくなっていますし、ファイルシステムの metadata を二重していますので、eMMC のブロックのエラーでも故障しません(そのブロックを読む時に dmesg にエラーが表示されて、読めるコピーから新しいコピーが作成されます)
データの方は二重されてませんので、そちらのエラーの場合は checksum のエラーでファイルを読めませんが、ファイルシステム全体に影響がありません。ext4などと違って、化けたデータを読めませんので、安全に使えたらと思います。

分からないことがあたらやまた質問あったら遠慮なく聞いてください。

よろしくお願いします。

kn_kobayashi

2023年1月12日 12時12分

マルティネ様
お世話になっております。

なるほど。内容理解できました。コンテナはbtrfsで実現しているのですね。

ご丁寧にご回答いただき、ありがとうございました。