Armadilloフォーラム

コンテナ内でvfatを扱いたい

t-tanaka

2025年3月10日 18時58分

==========
製品型番:Armadillo-IoT A6E
Debian/ABOSバージョン:3.20.5-at.8
カーネルバージョン:5.10.233-0-at
3G/LTE モジュール情報 (Debianのみ):
その他:
==========
大変お世話になっております。

コンテナ内でvfatを扱いたいです。
何か方法があればご教示お願い致します。
コンテナイメージ:debian:stretch

コメント

at_reika.yamazaki

2025年3月10日 19時59分

お世話になっております。山崎です。
こちら、コンテナ内から VFAT 形式の SD カードもしくは、USB メモリを使用したいということでよろしいでしょうか?
その場合は mount オプションのファイルシステムタイプで vfat を指定してみてください。
以下はコマンド例です。

mount -t vfat <デバイス名> <マウント先>

また、マウントのタイミングによってはコンテナに権限付与が必要です。
マニュアルの以下の箇所でコンテナの設定内容についても記載があるので、こちらもご確認ください。

■ 3.7.1. SDカードを使用する
https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…
■ 3.7.6. USB デバイスを使用する
https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…

以上、どうぞよろしくお願いいたします。

早々のご返信ありがとうございます。

質問する内容が違っていたため、もう一度質問させていただきます。

やりたいこととしては、
コンテナを起動している状態でUSBメモリを抜き差ししたときに、USBメモリの中身をコンテナの中から見たいというものです。

USBメモリを挿した状態でコンテナを起動した場合ですと、USBメモリの中身が確認できます。
その後抜き差しすると、以下のエラーが出力され、中身が確認出来なくなります。
ホスト側で自動マウントの設定はしています。

root@armadillo:/# ls -l /usb/
[ 3158.862720] FAT-fs (sda1): Directory bread(block 29590) failed
[ 3158.868724] FAT-fs (sda1): Directory bread(block 29591) failed
[ 3158.874587] FAT-fs (sda1): Directory bread(block 29592) failed
[ 3158.880480] FAT-fs (sda1): Directory bread(block 29593) failed
[ 3158.886336] FAT-fs (sda1): Directory bread(block 29594) failed
[ 3158.892235] FAT-fs (sda1): Directory bread(block 29595) failed
[ 3158.898119] FAT-fs (sda1): Directory bread(block 29596) failed
[ 3158.903971] FAT-fs (sda1): Directory bread(block 29597) failed
[ 3158.909858] FAT-fs (sda1): Directory bread(block 29598) failed
[ 3158.915736] FAT-fs (sda1): Directory bread(block 29599) failed

何か対応策はございますでしょうか。
ご多用のところ恐縮ですが、ご確認の程よろしくお願いいたします。

現在の設定は以下になります。

test-container.conf
 
set_image localhost/test-image:latest
add_args --privileged
add_volumes /var/app/volumes/usb:/usb
/etc/udev/rules.d/99-usb_mem.rules
 
KERNEL=="sd*[0-9]*",SUBSYSTEM=="block",ACTION=="add", RUN+="/root/mount_dev.sh", SYMLINK+="usb"	
KERNEL=="sd*[0-9]*",SUBSYSTEM=="block",ACTION=="remove", RUN+="/bin/umount /var/app/volumes/usb"		
mount_dev.sh
 
#!/bin/sh
 
LINKNAME=/dev/usb
MOUNTPOINT=/var/app/volumes/usb
if ! mountpoint -q ${MOUNTPOINT}; then
    mount -t vfat ${LINKNAME} ${MOUNTPOINT}
fi

> お世話になっております。山崎です。
> こちら、コンテナ内から VFAT 形式の SD カードもしくは、USB メモリを使用したいということでよろしいでしょうか?
> その場合は mount オプションのファイルシステムタイプで vfat を指定してみてください。
> 以下はコマンド例です。
>

> mount -t vfat <デバイス名> <マウント先>
> 

> また、マウントのタイミングによってはコンテナに権限付与が必要です。
> マニュアルの以下の箇所でコンテナの設定内容についても記載があるので、こちらもご確認ください。
>
> ■ 3.7.1. SDカードを使用する
> https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…
> ■ 3.7.6. USB デバイスを使用する
> https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…
>
> 以上、どうぞよろしくお願いいたします。

at_reika.yamazaki

2025年3月11日 20時12分

お世話になっております。山崎です。
ホスト側で自動マウントしたマウント先を、コンテナのボリュームマウントで渡しているのですね。
この使い方ですと、USB メモリをずっと挿している場合は大丈夫ですが、挿抜した際にアンマウントされて、再マウントしてもコンテナ内からは見えなくなります。
これを回避するにはマウント/アンマウントの処理をコンテナ側に持たせる方が良いと思います。
やり方の一例は以下になります。

1. udev ルールからマウント/アンマウントの処理を削除
/dev/usb としてデバイス名を固定する処理のみ残します。

KERNEL=="sd*[0-9]*",SUBSYSTEM=="block", SYMLINK+="usb"

2. /dev/usb をコンテナに渡す
以下にテストで使ったコンテナ設定ファイルの内容を記載します。
内容についてですが add_hotplugs を使用するとコンテナ起動後に挿抜を行なっても認識されるデバイスを設定できます。USB メモリの場合は sd を指定します。
また、"add_args --privileged" はコンテナに全権限と全てのデバイスへのアクセスを許可する強力なオプションのため、開発時以外では推奨しません。代わりに "add_args --cap-add SYS_ADMIN" を使うことをお勧めします。
また、ホスト側でマウントしなくなったため、"add_volumes /var/app/volumes/usb:/usb" は不要になると思います。
もし、ホスト側と共有したいファイル等があればそのままお使いください。

set_image localhost/test-image:latest
add_hotplugs sd
#add_args --privileged
add_args --cap-add SYS_ADMIN
#add_volumes /var/app/volumes/usb:/usb
set_command sleep infinity

3. コンテナ内からマウント/アンマウントする
USB メモリを挿抜してもコンテナ内から /dev/usb が見えると思います。ご使用のタイミングに合わせてマウント/アンマウントしてください。

以上、ひとまずのお返事です。
どうぞよろしくお願いいたします。

at_reika.yamazaki

2025年3月12日 14時18分

お世話になっております。山崎です。
昨日ご紹介した方法のほかに、もう一つコンテナを作成して、このコンテナで mount/umount する方法も確認できたのでご紹介します。

このコンテナには autofs をインストールします。autofs は Linux の機能で、自動的にファイルシステムをマウントします。現在マウントされていないファイルシステムをアクセスする要求を受け取ると設定したディレクトリに自動的にマウントされます。 また、そのディレクトリを使わなくなった際にも自動的にアンマウントすることもできます。
手順は主に以下になります。

1. autofs を利用するコンテナイメージの作成
2. Armadillo 側に autofs の設定を作成
3. 1 で作成したコンテナイメージを使用したコンテナ設定ファイルの作成
4. test-container の設定変更

各手順について詳しく説明します。
なるべくわかりやすく記述しますが、長くなりますことをご了承ください。

--------

1. autofs を利用するコンテナイメージの作成
コンテナイメージを作成するための Dockerfile を作成します。もとになるイメージは alpine で、autofs パッケージをインストールします。
Dockerfile の内容は以下です。

FROM docker.io/alpine
 
RUN apk add --no-cache  autofs

Dockerfile を作成したら、以下のコマンドを実行してこの Dockerfile から autofs コンテナイメージを作成します。

abos-ctrl podman-rw build -t autofs -f Dockerfile

"podman images" を実行したらコンテナイメージの一覧の中に、autofs を確認できると思います。

# podman images
REPOSITORY                TAG         IMAGE ID      CREATED             SIZE
localhost/autofs          latest      edb4e068df03  About a minute ago  7.4 MB

2. Armadillo 側に autofs の設定を作成
Armadillo の /var/app/rollback/volumes ディレクトリ配下に autofs ディレクトリを作成して、autofs の設定を配置します。
作成するのは以下の三つです。

・auto.master
マウントポイントの情報を記載します。以下は /mnt/automount に対して、auto.mnt の設定を適用します。

/mnt/automount /etc/autofs/auto.mnt --timeout=1

・auto.mnt
マウント情報を記載します。以下は USBメモリと SDカードをそれぞれ usb、 sd ディレクトリにマウントする設定です。

usb -nosuid,nodev,ro,fstype=auto :/dev/sda1
sd -nosuid,nodev,ro,fstype=auto :/dev/mmcblk1p1

・autofs.conf
autofs の設定ファイルです。

# 変更が必要な場合は man page を参照ください:
# https://manpages.debian.org/bookworm/autofs/autofs.conf.5.en.html
[autofs]
# デフォルトより早くアンマウントします
timeout = 10
# マウントが失敗した場合はデフォルトより早くキャッシュをタイムアウトします
negative_timeout = 10

上記の3つのファイルが作成されていれば大丈夫です。

# ls /var/app/rollback/volumes/autofs/
auto.master  auto.mnt     autofs.conf

3. 1 で作成したコンテナイメージを使用したコンテナ設定ファイルの作成

/etc/atmark/containers/autofs.conf を作成します。

# ビルドしたコンテナイメージ
set_image localhost/autofs
# コンフィグディレクトリ
add_volumes /var/app/rollback/volumes/autofs:/etc/autofs:ro
# 共有ディレクトリ
add_volumes /run/mnt:/mnt:shared
# マウントするために必要な権限
add_args --cap-add SYS_ADMIN
# sd は usb メモリ等のため
# misc は /dev/autofs のアクセス権限のため
add_hotplugs sd misc
# pid 見えないとリクエストを受信できないため
add_args --pid=host
# サービス実行コマンド
set_command automount -f -v

4. test-container の設定変更
test-container.conf を以下のように設定します。

set_image localhost/test-image:latest
add_volumes /run/mnt:/mnt:shared,ro
set_command sleep infinity

念のため、すべてのコンテナ設定ファイルを永続化して起動します。

# persist_file -r /etc/atmark/containers/
# podman_start -a

--------

ここまでの設定で autofs コンテナと、test-container コンテナが起動していると思います。
test-container 内では /mnt/automount ディレクトリに sd と usb ディレクトリが現れます。

# ls /mnt/automount/
sd  usb

設定に成功している場合は /mnt/automount/usb に自動マウントされた USBメモリが見えると思います。
挿抜してもしばらくすると認識するはずです。

参考になりましたら幸いです。
以上、どうぞよろしくお願いいたします。

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

confファイルでadd_hotplugsを記述する方法で問題なく動作することができました。
ありがとうございます。
2つ目に共有していただいた方法もとても勉強になりました。

丁寧なご対応ありがとうございます。

> お世話になっております。山崎です。
> 昨日ご紹介した方法のほかに、もう一つコンテナを作成して、このコンテナで mount/umount する方法も確認できたのでご紹介します。
>
> このコンテナには autofs をインストールします。autofs は Linux の機能で、自動的にファイルシステムをマウントします。現在マウントされていないファイルシステムをアクセスする要求を受け取ると設定したディレクトリに自動的にマウントされます。 また、そのディレクトリを使わなくなった際にも自動的にアンマウントすることもできます。
> 手順は主に以下になります。
>
> 1. autofs を利用するコンテナイメージの作成
> 2. Armadillo 側に autofs の設定を作成
> 3. 1 で作成したコンテナイメージを使用したコンテナ設定ファイルの作成
> 4. test-container の設定変更
>
> 各手順について詳しく説明します。
> なるべくわかりやすく記述しますが、長くなりますことをご了承ください。
>
> --------
>
> 1. autofs を利用するコンテナイメージの作成
> コンテナイメージを作成するための Dockerfile を作成します。もとになるイメージは alpine で、autofs パッケージをインストールします。
> Dockerfile の内容は以下です。
>

> FROM docker.io/alpine
> 
> RUN apk add --no-cache  autofs
> 

> Dockerfile を作成したら、以下のコマンドを実行してこの Dockerfile から autofs コンテナイメージを作成します。
>

> abos-ctrl podman-rw build -t autofs -f Dockerfile
> 

> "podman images" を実行したらコンテナイメージの一覧の中に、autofs を確認できると思います。
>

> # podman images
> REPOSITORY                TAG         IMAGE ID      CREATED             SIZE
> localhost/autofs          latest      edb4e068df03  About a minute ago  7.4 MB
> 

>
> 2. Armadillo 側に autofs の設定を作成
> Armadillo の /var/app/rollback/volumes ディレクトリ配下に autofs ディレクトリを作成して、autofs の設定を配置します。
> 作成するのは以下の三つです。
>
> ・auto.master
> マウントポイントの情報を記載します。以下は /mnt/automount に対して、auto.mnt の設定を適用します。
>

> /mnt/automount /etc/autofs/auto.mnt --timeout=1
> 

>
> ・auto.mnt
> マウント情報を記載します。以下は USBメモリと SDカードをそれぞれ usb、 sd ディレクトリにマウントする設定です。
>

> usb -nosuid,nodev,ro,fstype=auto :/dev/sda1
> sd -nosuid,nodev,ro,fstype=auto :/dev/mmcblk1p1
> 

>
> ・autofs.conf
> autofs の設定ファイルです。
>

> # 変更が必要な場合は man page を参照ください:
> # https://manpages.debian.org/bookworm/autofs/autofs.conf.5.en.html
> [autofs]
> # デフォルトより早くアンマウントします
> timeout = 10
> # マウントが失敗した場合はデフォルトより早くキャッシュをタイムアウトします
> negative_timeout = 10
> 

>
> 上記の3つのファイルが作成されていれば大丈夫です。
>

> # ls /var/app/rollback/volumes/autofs/
> auto.master  auto.mnt     autofs.conf
> 

>
> 3. 1 で作成したコンテナイメージを使用したコンテナ設定ファイルの作成
>
> /etc/atmark/containers/autofs.conf を作成します。
>

> # ビルドしたコンテナイメージ
> set_image localhost/autofs
> # コンフィグディレクトリ
> add_volumes /var/app/rollback/volumes/autofs:/etc/autofs:ro
> # 共有ディレクトリ
> add_volumes /run/mnt:/mnt:shared
> # マウントするために必要な権限
> add_args --cap-add SYS_ADMIN
> # sd は usb メモリ等のため
> # misc は /dev/autofs のアクセス権限のため
> add_hotplugs sd misc
> # pid 見えないとリクエストを受信できないため
> add_args --pid=host
> # サービス実行コマンド
> set_command automount -f -v
> 

>
> 4. test-container の設定変更
> test-container.conf を以下のように設定します。
>

> set_image localhost/test-image:latest
> add_volumes /run/mnt:/mnt:shared,ro
> set_command sleep infinity
> 

> 念のため、すべてのコンテナ設定ファイルを永続化して起動します。
>

> # persist_file -r /etc/atmark/containers/
> # podman_start -a
> 

>
> --------
>
> ここまでの設定で autofs コンテナと、test-container コンテナが起動していると思います。
> test-container 内では /mnt/automount ディレクトリに sd と usb ディレクトリが現れます。
>

> # ls /mnt/automount/
> sd  usb
> 

> 設定に成功している場合は /mnt/automount/usb に自動マウントされた USBメモリが見えると思います。
> 挿抜してもしばらくすると認識するはずです。
>
> 参考になりましたら幸いです。
> 以上、どうぞよろしくお願いいたします。