Armadilloフォーラム

microSDカードの自動マウントについて

hironori

2022年10月20日 16時24分

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

fstabを利用して電源ON時にmicroSDを自動マウントさせておりますが、たまに失敗する場合があり困っています。
設定の不備などの問題点、もしくは別の自動マウント手段がありましたらご教示いただけますでしょうか。

■状況
① /etc/fstabの記述は以下のとおりです。persist_fileは実行済みです。

armadillo:/etc# cat fstab
/dev/root       /                               ext4    ro                              0 0
tmpfs           /tmp                            tmpfs   nosuid,nodev                    0 0
/dev/mmcblk2p3  /var/log                        ext4    defaults,noatime                        0 0
/dev/mmcblk2p5  /var/lib/containers/storage_readonly    btrfs   compress=zstd,discard=async,noatime,subvol=boot_1/containers_storage    0 0
/dev/mmcblk2p5  /var/app/rollback/volumes               btrfs   compress=zstd,discard=async,noatime,subvol=boot_1/volumes               0 0
/dev/mmcblk2p5  /var/app/volumes                btrfs   compress=zstd,discard=async,noatime,subvol=volumes              0 0
/dev/mmcblk2p5  /var/tmp                        btrfs   compress=zstd,discard=async,noatime,subvol=tmp                  0 0
/dev/mmcblk2gp1 /var/at-log                     vfat    defaults,noatime                        0 0
/dev/mmcblk2p4  /opt/firmware                   squashfs defaults                       0 0
/dev/mmcblk1p1  /mnt                            ext4  defaults                          0 0

② 失敗した場合にlsblkで確認するとmmcblk1p1を認識しているようです。

armadillo:~# lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
mmcblk2      179:0    0  7.3G  0 disk
tqmmcblk2p1  179:1    0  300M  0 part
tqmmcblk2p2  179:2    0  300M  0 part /live/rootfs
tqmmcblk2p3  179:3    0   50M  0 part /var/log
tqmmcblk2p4  179:4    0  200M  0 part /opt/firmware
mqmmcblk2p5  179:5    0  6.5G  0 part /var/tmp
                                      /var/app/volumes
                                      /var/app/rollback/volumes
                                      /var/lib/containers/storage_readonly
mmcblk2boot0 179:32   0 31.5M  1 disk
mmcblk2boot1 179:64   0 31.5M  1 disk
mmcblk2gp0   179:96   0    8M  0 disk
mmcblk2gp1   179:128  0    8M  0 disk /var/at-log
mmcblk2gp2   179:160  0    8M  0 disk
mmcblk2gp3   179:192  0    8M  0 disk
mmcblk1      179:224  0   15G  0 disk
mqmmcblk1p1  179:225  0   15G  0 part
zram0        254:0    0    0B  0 disk

なお、起動後に以下のとおり手動でマウントすると成功します。
mount -t ext4 /dev/mmcblk1p1 /mnt

③ 自動マウント失敗時、起動時のログには以下の通りマウント失敗のメッセージが出力されます。

localmount               | * Mounting local filesystems ...mount: /mnt: /dev/mmcblk1p1 already mounted or mount point busy.
localmount               |       dmesg(1) may have more information after failed mount system call.
localmount               | * Some local filesystem failed to mount
localmount               | [ !! ]

④ dmesgを確認すると、以下のメッセージが自動マウント成功時は2回記録されていますが、自動マウント失敗時は1回のみ記録されています。
EXT4-fs (mmcblk1p1): mounted filesystem with ordered data mode. Opts: (null)

⑤ 電源のOFF→ONのときは自動マウント失敗することがありますが、rebootコマンドによる再起動時は今のところ自動マウントに失敗していません。

⑥ 異なる2種類のmicroSDカードで確認しましたが、どちらの場合も自動マウントに失敗することがあります。

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

コメント

at_dominique.m…

2022年10月20日 18時59分

hironoriさん、

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

> localmount               | * Mounting local filesystems ...mount: /mnt: /dev/mmcblk1p1 already mounted or mount point busy.
> localmount               |       dmesg(1) may have more information after failed mount system call.
> localmount               | * Some local filesystem failed to mount
> localmount               | [ !! ]

/mnt はいくつかのシステムスクリプトで使っていて、起動時には少し混乱しているようですね。

今こちらで試したところ、別のエラーで overlayfs の処理中に /mnt をリマウントして以下のワーニングが出ます:

overlayfs                | * Preparing overlayfs over / ...mount: /live: special device /mnt/live does not exist.
overlayfs                |       dmesg(1) may have more information after failed mount system call.
overlayfs                | * Could move /mnt/live, things might break...
overlayfs                | * Could not bind mount old rootfs to /live/rootfs: staying in /mnt
overlayfs                | [ ok ]

(結果的にあは /mnt に SD カードがマウントされてますのですぐには不具合が出ませんが、この場合は persist_file が使えなくなります。)

このエラーの処理は少し頑張れば今後のアップデートで直せます。

残念ですが、hironoriさんのエラーはまだ再現できてません。バージョンの違いで何か少し変わったかもしれません、明日か来週もうちょっと追ってみますが、とりあえず回避策から始めましょう 。

問題になりそうな点が二つあります:
- /mnt が他のスクリプトで使われてます。基本は private mountspace で実行するように頑張りましたが、誤りや例外もありますので、/var/app/volumes/mnt ディレクトリを作ってそっちらを使えたらと思います。 /var/app/volumes は触りませんので、パスが少し長くなりますがそこを自由に使って見てください。
- タイミングの問題でしたら、 fstab ではなく、/etc/local.d/mount_sd.start などで mount コマンドを実行してみたらどうでしょうか?
local のスクリプトが最後で実行されて、podman-atmark サービスの後に実行されますので、コンテナに使う場合はそのコンテナを `set_autostart no` で自動起動を止めて mount の後に podman_start containername で実行できます。(すみません、汚いですね…)

何か分かりましたらまた連絡します。

よろしくお願いします。

hironori

2022年10月21日 17時23分

マルティネさん

お世話になっております。
早々にご回答いただきありがとうございます。

本日、ご指摘の通りマウント先を/var/app/volumes/mntに変更して確認しましたが、
変更前と同様の起動ログが発生し、残念ながら状況は変わりませんでした。
来週、local.dのスクリプトで起動順を指定して動作を確認してみます。

> 何か分かりましたらまた連絡します。

お手数をおかけしますが、よろしくお願いします。

at_dominique.m…

2022年10月24日 11時29分

hironoriさん、

> 本日、ご指摘の通りマウント先を/var/app/volumes/mntに変更して確認しましたが、
> 変更前と同様の起動ログが発生し、残念ながら状況は変わりませんでした。

了解しました。それでしたらタイミングの問題で local.d で回避できると思いますが、引き続きのテストをよろしくお願いします。

また、私の方ではまだ再現できてませんが(SDカードのスピードの影響かなにか?)、ひとまず引っかかりそうなところを修正してみましたので、よろしければ添付にある abos-base-1.12-r1.apk.tar を手元の armadillo に展開して、「persist_file -a add ./abos-base-1.12-r1.apk」でインストールしていただければ、動くかもしれません。
具体的には:
- 木曜日説明した overlay の問題の回避
- 自動アップデートスクリプト(USBやSDカードにswuが当歳されたら自動的にインストールするスクリプト)にいくつかの制限の追加

この修正は今月のアップデートに入りませんが、問題なければ11月のアップデートに入れたいと思います。

それでも問題が続いていたら大変お手数ですが、「Starting kernel ...」の行からのシリアルのログと、/var/log/messages の内容を送っていただければすごく助かります。

よろしくお願いします。

ファイル ファイルの説明
abos-base-1.12-r1.apk_.tar

hironori

2022年10月27日 15時55分

マルティネさん

ご回答ありがとうございます。

> 了解しました。それでしたらタイミングの問題で local.d で回避できると思いますが、引き続きのテストをよろしくお願いします。

local.dでSDカードマウントし、その後にコンテナ起動するよう修正しました。十数回程度動作を確認しました。
今のところ正常に自動マウントされているので、おそらくタイミングの問題であったものと思われます。
ご助言いただき、ありがとうございました。

> また、私の方ではまだ再現できてませんが(SDカードのスピードの影響かなにか?)、ひとまず引っかかりそうなところを修正してみましたので、よろしければ添付にある abos-base-1.12-r1.apk.tar を手元の armadillo に展開して、「persist_file -a add ./abos-base-1.12-r1.apk」でインストールしていただければ、動くかもしれません。

こちらの修正については未だ確認できていません。
折を見てfstabで自動マウントする環境下で確認してみます。