Armadilloフォーラム

コンテナイメージの保存先ストレージの変更について

fss-sh

2025年7月8日 17時42分

==========
製品型番:AGX4500-C00D0
Debian/ABOSバージョン:3.20.3-at.4
カーネルバージョン:5.10.228-0-at
3G/LTE モジュール情報 (Debianのみ):
その他:
==========

プロジェクトで開発中のアプリケーションのコンテナイメージ群の合計が16GB程度となっており、デフォルトのmmcblk2のストレージサイズは 9GBだったため、podman loadコマンドではすべてのアプリケーションイメージを保存できませんでした。アプリケーションのイメージは10個以上あり、各イメージの容量の減少は開発中のため後回しにしています。
そのためコンテナイメージの保存先を microSDカード(mmcblk1) に変更しました。

この変更手順として「コンテナイメージ保存先変更方法」のようにしましたが、問題のある個所はあるでしょうか。
Webフォーラムの過去記事を検索しましたが、同様の質問は見つけらなかったのですが、同様の記事があれば教えてください

コンテナイメージ保存先変更方法

# ※ 事前にホストOSには sudo をインストールし、atmark ユーザーに対して、NOPASSWD の設定している
# microSDカードを挿入している。microSDカードは ELECOM MF-HMS256GU13V3 を使用
 
sudo fdisk /dev/mmcblk1
 
# partition 1を 作成
 
# 1つ目のパーティションを btrfs で初期化
 
sudo mkfs.btrfs /dev/mmcblk1p1
 
# mmcblk1p1のマウント先をのディレクトリを作成
sudo mkdir -p /mnt/sd
 
sudo mount /dev/mmcblk1p1 /mnt/sd
 
cd /mnt/sd
 
# /var/tmp用
sudo btrfs subvolume create tmp
 
# /var/lib/containers/storage 用
sudo btrfs subvolume create containers_storage
 
# /var/sampleapp 用 アプリケーションの設定ファイルなどを保存する場所
sudo btrfs subvolume create sampleapp
 
cd ~/
 
#一旦マウント解除
sudo umount /mnt/sd
 
# podmanの保存設定をdiskに変更
sudo abos-ctrl podman-storage --disk
 
# fstabの記述を書き換える。
sudo vi /etc/fstab
 
# /dev/mmcblk2p5        /var/tmp                        btrfs   compress=zstd,discard=async,noatime,subvol=tmp                  0 0
/dev/mmcblk2gp1 /var/at-log                     vfat    defaults                        0 0
/dev/mmcblk2p4  /opt/firmware                   squashfs defaults                       0 0
# /dev/mmcblk2p5        /var/lib/containers/storage                     btrfs   compress=zstd,discard=async,noatime,subvol=containers_storag
e                       0 0
/dev/mmcblk1p1  /mnt/sd                 btrfs   compress=zstd,discard=async,noatime,subvol=/                    0 0
/dev/mmcblk1p1  /var/tmp                        btrfs   compress=zstd,discard=async,noatime,subvol=tmp                  0 0
/dev/mmcblk1p1  /var/lib/containers/storage     btrfs   compress=zstd,discard=async,noatime,subvol=containers_storage                   0 0
/dev/mmcblk1p1  /var/sampleapp                  btrfs   compress=zstd,discard=async,noatime,subvol=devicehub                    0 0
 
# /var/sampleapp は synlinkとフォルダを作成する
sudo ln -s /mnt/sd/sampleapp /var/sampleapp
# symlinkを永続化
sudo persist_file  /var/sampleapp
# fstabを永続化
sudo persist_file /etc/fstab
# 再起動
sudo reboot
コメント

at_kojiro.yamada

2025年7月9日 13時35分

> この変更手順として「コンテナイメージ保存先変更方法」のようにしましたが、問題のある個所はあるでしょうか。
> Webフォーラムの過去記事を検索しましたが、同様の質問は見つけらなかったのですが、同様の記事があれば教えてください

SWU イメージのインストール と abos-ctrl rollback-clone の実行が失敗するかもしれません。
ただ、今の状態で不自由がないのであれば、そのまま使っていただいても良いと思います。

インストールディスクが行っている初期化処理を厳密に再現する手順を書いておきますので、
必要になったら試していただければと思います。

----------------------------------

app パーティションを /dev/mmcblk0p5 から /dev/mmcblk2p1 に変更する手順

注: 想定した使い方ではないため、別の場所でなにか問題が起こるかもしれません。その点ご留意ください。

1. gpt パーティションを作成しておく (fdisk ではなく gdisk を使ってください)
2. コンテナイメージ用パーティションに "app" という名前(ラベル) をつける
3. 以下のスクリプトを root ユーザーで実行する ("app" パーティションが /dev/mmcblk2p1 以外の場合は sd_part 変数を手直ししてください)
4. /etc/fstab 内の /dev/mmcblk0p5 を /dev/mmcblk2p1 に書き換える
5. persist_file -p /etc/fstab で fstab を永続化する

スクリプト

#!/bin/sh
 
sd_part="/dev/mmcblk2p1"
 
error() {
        echo "$@" >&2
        exit 1
}
 
print_green() {
        echo "$@"
}
 
format_app() {
        local dev="$1"
        local label="app"
 
        printf "Preparing app partition... "
 
        [ -e "$dev" ] || error "No partition $dev!"
        [ -n "$ENCRYPT_USERFS" ] && luks_format "${dev##*/}"
        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
 
        # also create mountpoints in target rootfs
        mkdir -p /target/var/lib/containers/storage_readonly
        mkdir -p /target/var/lib/containers/storage
        mkdir -p /target/var/app/rollback/volumes
        mkdir -p /target/var/app/volumes /target/var/tmp
 
        print_green "ok"
}
 
format_app "$sd_part"

上記スクリプトは、 build-rootfs[1] の common/image_common/lib/rc/sh/functions-atmark.sh から format_app() 関数を抜き出して、足りない関数を適当に追加したものです。
format_app 関数は、インストールディスクによる初期化処理で実行される関数で、 app パーティションの初期化を行います。