frkw_r
2025年6月13日 10時53分
==========
製品型番:AG9130-C03Z
Debian/ABOSバージョン:3.21.3-at.9
ゲストOS : debian11
カーネルバージョン:5.10.236-2-at
==========
使用予定のコンテナのサイズが少々大きく、emmc内でイメージファイルの書き込みができなかったため、
SDカードでイメージファイルの管理とコンテナの起動を行いたいと思っております。
そのためにpodmanの参照先をSDカードにしたく設定をしていたのですがうまくいきません。
お手数おかけしますが、もし手順等があれば教えていただけないでしょうか?
以下の設定をstorage.confに書き込んでpodmanの再起動をしています。
runroot = “/run/containers/storage”
driver = “overlay”
graphroot = “/var/app/volumes/sd/podman_storage/storage”
podman ps -a を行ったときのエラー内容
Error : database static dir “var/lib/containers/storage/libpod” does not match our static dir “/var/app/volumes/sd/podman_storage/storage/libpod” : database configuration mismatch
コメント
frkw_r
マルティネ様
ご返信ありがとうございます。
現状、emmcに書き込めるサイズ内でのコンテナ運用を想定している設計になっているという理解でよろしいでしょうか?
>>* appfs (コンテナイメージや /var/app/volumes がはいってるパーティション)のパーティションだけを拡張できますが、こちらの場合の SD カード故障や>>紛失の場合の自動復帰の仕組みは標準にありませんのでご了承ください。(また、BTOサービスでも対応してません。)
上記部分について恐れ入りますがもう少し説明いただけますでしょうか?
通常であればSDカードが紛失、故障があった場合は代替のSDカードで起動ができるものの上記手順を踏むとSDカードでの本体起動はできず本体交換等になるといったイメージでしょうか?
at_dominique.m…
マルティネです。
> 現状、emmcに書き込めるサイズ内でのコンテナ運用を想定している設計になっているという理解でよろしいでしょうか?
はい、通常では eMMC でコンテナイメージも運用できるか、SD ブートですと OSごとにすべてを SD カードに保存する想定です。
コンテナイメージではなく、ファイル類を SD カードに保存して /var/app/volumes/sd 等にマウントすることは可能ですが、コンテナイメージに関してはアップデートの際の処理が多くて、コンテナイメージだけを別に保管すると swupdate のコンテナ管理機能を利用できなくなります。
(別のアップデート方法を用意すればそれでも問題ないですが、何かのアップデートの仕組みが必要だと考えています)
> >>* appfs (コンテナイメージや /var/app/volumes がはいってるパーティション)のパーティションだけを拡張できますが、こちらの場合の SD カード故障や>>紛失の場合の自動復帰の仕組みは標準にありませんのでご了承ください。(また、BTOサービスでも対応してません。)
> 上記部分について恐れ入りますがもう少し説明いただけますでしょうか?
> 通常であればSDカードが紛失、故障があった場合は代替のSDカードで起動ができるものの上記手順を踏むとSDカードでの本体起動はできず本体交換等になるといったイメージでしょうか?
SD カードをアクセスできなくっても、OS(ネットワーク、Armadillo Twin 等による遠隔操作、アップデート機能)としては動きます。
ただし、SDカードに保存されているデータはアクエスできなくなりますので、コンテナイメージやボリュームデータが保存している appfs をマウントできなくなります。
別のカードを投入し、Armadillo Base OS 側で appfs をゼロから作り直す処理が必要となります(起動スクリプトで何かの復帰処理を追加して SWU 等でコンテナを書き込み直すか、何かの復帰用の SWU を準備するか…)
そう考えると、拡張ではなく appfs をすべて置き換えた方が運用として楽かもしれません。
置き換えるとしてあら、 /var/app/volumes等の他の subvolumes も移動する必要がありますので、以下の用なコマンドで SD を予め準備しておいて fstab の変更で利用できます。(この場合の SD の紛失も起動できますし、置き換えはデータすでに書き込んだ状態で置き換えればいいだけですので管理が比較的に楽になります)
以下のコードは https://armadillo.atmark-techno.com/resources/software/armadillo-iot-a9… の 「Alpine Linuxルートファイルシステムビルドツール」を展開して、「common/image_common/lib/rc/sh/functions-atmark.sh」の「format_app」からコピーしました。
(手順が複雑で申し訳ございません。subvolume 機能が必要のため、存在しているパーティションをそのまま cp でコピーすることはできません)
error() { printf "%s\n" "$@" >&2 exit 1 } label=app dev=/dev/mmcblk2p1 mkfs.btrfs -q -f -L "$label" "$dev" \ || error "mkfs btrfs failed" mount -t btrfs "$dev" /mnt btrfs -q subvolume create /mnt/tmp \ || error "subvolume creation failed" mkdir /mnt/boot_0 /mnt/boot_1 btrfs -q subvolume create /mnt/volumes \ || error "subvolume creation failed" btrfs -q subvolume create /mnt/boot_0/containers_storage \ || error "subvolume creation failed" btrfs -q subvolume create /mnt/boot_0/volumes \ || error "subvolume creation failed" # work around podman being silly and throwing errors if the # store does not look right podman --storage-opt additionalimagestore="" \ --root /mnt/boot_0/containers_storage image list >/dev/null 2>&1 rm -f /mnt/boot_0/containers_storage/libpod/bolt_state.db \ /mnt/boot_0/containers_storage/db.sql # yes it really needs that too... mkdir -p /mnt/boot_0/containers_storage/overlay-layers /mnt/boot_0/containers_storage/overlay-images touch /mnt/boot_0/containers_storage/overlay-images/images.lock touch /mnt/boot_0/containers_storage/overlay-layers/layers.lock btrfs property set /mnt/boot_0/containers_storage ro true # and prepare boot_1 as well just in case btrfs -q subvolume snapshot -r /mnt/boot_0/containers_storage /mnt/boot_1/containers_storage \ || error "subvolume creation failed" btrfs -q subvolume create /mnt/boot_1/volumes \ || error "subvolume creation failed" mountpoint -q /mnt/boot_0/containers_storage/overlay \ && umount /mnt/boot_0/containers_storage/overlay umount /mnt
上記の準備の後は fstab の mmcblk0p5 を mmcblk2p1 を置き換えれば完了です
armadillo:~# sed -i -e 's/mmcblk0p5/mmcblk2p1/' /etc/fstab armadillo:~# grep 2p1 /etc/fstab /dev/mmcblk2p1 /var/lib/containers/storage_readonly btrfs compress=zstd,discard=async,noatime,subvol=boot_0/containers_storage 0 0 /dev/mmcblk2p1 /var/app/rollback/volumes btrfs compress=zstd,discard=async,noatime,subvol=boot_0/volumes 0 0 /dev/mmcblk2p1 /var/app/volumes btrfs compress=zstd,discard=async,noatime,subvol=volumes 0 0 /dev/mmcblk2p1 /var/tmp btrfs compress=zstd,discard=async,noatime,subvol=tmp 0 0 armadillo:~# persist_file /etc/fstab armadillo:~# reboot armadillo:~# df -h Filesystem Size Used Available Use% Mounted on /dev/mmcblk0p1 300.0M 139.1M 92.7M 60% /live/rootfs devtmpfs 10.0M 0 10.0M 0% /dev tmpfs 190.1M 1004.0K 189.1M 1% /run shm 475.2M 4.0K 475.2M 0% /dev/shm /dev/mmcblk0gp1 7.9M 2.0K 7.9M 0% /var/at-log /dev/mmcblk0p3 41.8M 6.2M 32.2M 16% /var/log tmpfs 475.2M 0 475.2M 0% /tmp /dev/mmcblk2p1 7.5G 3.7M 7.0G 0% /var/lib/containers/storage_readonly /dev/mmcblk2p1 7.5G 3.7M 7.0G 0% /var/app/rollback/volumes /dev/mmcblk2p1 7.5G 3.7M 7.0G 0% /var/app/volumes /dev/mmcblk2p1 7.5G 3.7M 7.0G 0% /var/tmp /dev/mmcblk0p4 20.1M 20.1M 0 100% /opt/firmware none 475.2M 20.0K 475.2M 0% /live none 475.2M 20.0K 475.2M 0% /
どのみち複雑ですので、パーティションを比較的に簡単に拡張して損失の場合に何かの対策を実装するか、SDカードを準備する時に複雑な処理をするかの2択ですね…
すでに検討されたと思いますが、コンテナの最適化で eMMC に保存できるようにするのは不可能でしょうか?
大きいサイズの原因をご存知でしたら、教えていただけますでしょうか?
よろしくお願いします。
frkw_r
at_dominique.m…
マルティネです。
> SDカードでの対応はなかなか複雑で難しいのかなと印象を受けました。
eMMC OS + SD コンテナイメージが複雑な状態にしてしまって申し訳ございません。
SD ブートでしたらちゃんとサポートしている方法ですので、OS 部分で eMMC を利用しないのはもったいないところもありますが、今回は適切ではないかと思います。
https://manual.atmark-techno.com/armadillo-iot-a9e/armadillo-iotg-a9e_p…
> >大きいサイズの原因をご存知でしたら、教えていただけますでしょうか?
> サイズが大きい理由としましてはGreengrass,AWS関連のcomponent,java,pythonなどを入れているためコンテナサイズが大きいのだろうと考えられます。
了解しました、すぐにはできませんが今度にこれぐらいの規模のコンテナを作って色々試してみたいと思います。
インストールしている具体的な内容によりますが、コンテナのベースも alpine に切り替えるか https://github.com/canonical/chisel の様なプロジェクトでサイズを大分抑えれるのではないかと思います。
(debian は特に、python3-pip 等を入れるとデフォルトで運用に不要な gcc が入ってかなりの無駄ができますので、少し時間かかりますがサイズの改善は eMMC+SD の利用より確実だと考えています)
ひとまず SD ブートの前提で開発を進んでいただいて、サイズを改善できた時に eMMC に戻る方向でいかがでしょうか。
よろしくお願いします。
at_dominique.m…
2025年6月16日 15時02分
frkw_rさん
お世話になっています、
マルティネです。
> 以下の設定をstorage.confに書き込んでpodmanの再起動をしています。
storage.conf の設定でこういう変更はできると思いますが、swupdate でコンテナをアップデートできなくなりますので正式に推奨しづらいところです。
代わりに、以下のどちらかの方法でいかがでしょうか。
* SD ブートを利用して、システムを完全に SD カードに移動できます。
https://manual.atmark-techno.com/armadillo-iot-a9e/armadillo-iotg-a9e_p…
* appfs (コンテナイメージや /var/app/volumes がはいってるパーティション)のパーティションだけを拡張できますが、こちらの場合の SD カード故障や紛失の場合の自動復帰の仕組みは標準にありませんのでご了承ください。(また、BTOサービスでも対応してません。)
パーティション拡張自体は簡単ですが、起動時のマウントのタイミングが早すぎて複数のデバイスの場合の自動認識はまだ起動してませんので、すべてのデバイスを指定する必要があります。
以下の通りに利用できます。SDカードを外したい場合はファイルを削除して「btrfs device remove /dev/mmcblk2p1 /var/app/volumes」で削除できます。
よろしくお願いします