Armadilloフォーラム

A6E(AG6271)のmicroSDからのSWUpdate失敗について

uesugi

2023年12月19日 13時25分

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

microSDからのSWUpdate失敗についてご相談させてください。

現在microSDからのSWUpdateを実施しようとしています。
コンテナイメージの容量が重く失敗しているようでしたので、/var/tmpの容量を大きくしてSWUpdateを実施しようとしたのですが、
以下エラーにより成功しませんでした。
それに伴い、3点確認をさせてください。

①/var/tmpにmicroSDをmountし、利用することはできますでしょうか?できる場合、失敗している原因に心あたりはありませんでしょうか?
また、できない場合に何か対策方法等ありますでしょうか?
②また、microSDのmountに失敗してしまうケースが多発してしまいます。
何か原因に心当たりありませんでしょうか?
③swuファイル作成時に「swdesc_embed_container」を使用しています。
「swdesc_usb_container」を使用すると本問題を解消することができるのでしょうか?

【作業手順】
①/boot/overlay.txtを変更しSDを有効化
# vi /boot/overlay.txt
変更前:fdt_overlays=armadillo-iotg-a6e-els31.dtbo armadillo-iotg-a6e-lwb5plus.dtbo
変更後:fdt_overlays=armadillo-iotg-a6e-els31.dtbo
# persist_file /boot/overlay.txt
②再起動
# reboot
③各SDのパーテーションをmount
# mkdir -p /mnt/sd1
# mount /dev/mmcblk1p1 /mnt/sd1
# mount /dev/mmcblk1p2 /var/tmp/

④swupdate実行
# swupdate -i ***

【発生エラー】
 添付ファイルをご確認ください。
・SDからのアップデート失敗.png
・mount失敗.png

【環境】
・各ファイルサイズ
.tar 853,160KB
.swu 295,820KB
・armadilloに適用してあるコンテナイメージ
app 899 MB
reboot 4.99 MB
a6e-gw-container 104 MB
・swuはappイメージを更新するファイルです。

使用microSD 
8GB FAT32形式 1Gと3Gのパーテーションで3G側を/ver/tmpにmount 1G側にswuファイルを入れてswupdateを実行しています。

ファイル ファイルの説明
SDからのアップデート失敗.png
mount失敗.png
コメント

at_dominique.m…

2023年12月19日 15時33分

uesugiさん、

お世話になっています、マルティネです。
( https://armadillo.atmark-techno.com/forum/armadillo/18178 と同じ問題なので、そちらで返事しない予定です。何か返事し忘れたところがあればお手数ですが言ってください)

> ①/var/tmpにmicroSDをmountし、利用することはできますでしょうか?できる場合、失敗している原因に心あたりはありませんでしょうか?
> また、できない場合に何か対策方法等ありますでしょうか?

申し訳ございません、swupdate のスクリプトは /var/tmp をみて appfs のパーティションを取得していますので、/var/tmp を別のパーティションでマウントすると appfs の処理が失敗します。

対策はいくつかありますが、SD カードを /var/tmp ではなく /mnt 等にマウントして, 「TMPDIR=/mnt swupdate -i /mnt/update.swu」等でアップデートを実行すればそのディレクトリが swupdate と podman の一時的にディレクトリとして使用されますのでそれで進めるかと思います。

> ②また、microSDのmountに失敗してしまうケースが多発してしまいます。
> 何か原因に心当たりありませんでしょうか?

すみません、これは初めて見ました。
dmesg の出力に何かヒントがあるかもしれませんので、よろしければ提供していただけますか?
こちらで同じモデルで試してみますが、LTE ボードの影響でしたらインストーラーでもエラーが発生すると思いますので何かの個差かもしれません。後ほどまた返事します。

> ③swuファイル作成時に「swdesc_embed_container」を使用しています。
> 「swdesc_usb_container」を使用すると本問題を解消することができるのでしょうか?

SWU ファイルを USB ディスクや SD カードでインストールする場合は swdesc_usb_container を使用すれば一つのコピーが省かれますので、効率いいですね。
(それでも /var/tmp に podman内のコピーが一つありますので、完璧とはいえませんが、swdesc_embed_container より成功する可能性があります)

> 【環境】
> ・各ファイルサイズ
> .tar 853,160KB
> .swu 295,820KB
> ・armadilloに適用してあるコンテナイメージ
> app 899 MB
> reboot 4.99 MB
> a6e-gw-container 104 MB
> ・swuはappイメージを更新するファイルです。

情報提供ありがとうございます。
そのサイズでしたら確かに swdesc_embed_container でギリギリ入らないで、swdesc_usb_container で入れそうですね。

最悪の場合の計算としては、appfs の 2.7GB に対して:
- A面のコンテナ ~= 1GB (圧縮で実際に 700MB ですが、とりあえず無視します)
- swdesc_embed_container による app.tar = 850MB
- podman による一時的なコピー = 850MB
- B面のコンテナ = 850MB

合計は swdesc_embed_container で 3.5GB, swdesc_usb_container でちょうど 2.7GB。
どれも同じぐらい圧縮される想定でしたら 7割にすると swdesc_embed_container で 2.5GB になってしまって、ギリギリ入りそうですが、おそらく btrfs の metadata/data の管理で最後までうまく書込みできないと思います。

開発の時は外部ストレージでワークアラウンドできますが、運用としては不便なので、いくつかの方向を検討できると思います:
- コンテナのサイズの最適化:app コンテナのベースが debian でしたら、alpine で構成してみたら効率よくなるかもしれません。
- A面のコンテナを削除してから更新させる:A/B アップデートのメリットがなくなりますが、どうしてもの時はアップデートを二つに別けて一つ目のアップデートで /etc/atmark/containers/app.conf を削除することでそのイメージを削除させて、次の swu で入れ直すかたちにすれば普通に入らない物も入れます。
- 普段を差分アップデートでの更新させる:弊社が提供している vscode プロジェクトではまだ対応してませんので素直に使用できないかもしれませんが、コンテナはレイヤーで構成されていて、レイヤーの一部だけを送信することができます( https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p… の podman_partial_image 参照)

よろしければ追加の説明できますので聞いてください。

> 使用microSD 
> 8GB FAT32形式 1Gと3Gのパーテーションで3G側を/ver/tmpにmount 1G側にswuファイルを入れてswupdateを実行しています。

問題になるかどうか分かりませんが FAT32 は linux でいくつかのファイルタイプを対応できませんので、TMPDIR に使用するパーティションは別のファイルシステムにしてもらえたらいいかと思います。
armadillo に mkfs.ext4 がありますので、マウントする前にそれでフォーマットしてください(中身が削除されます)

よろしくお願いします。

アットマークテクノ マルティネ様
ご回答ありがとうございます。

>dmesg の出力に何かヒントがあるかもしれませんので、よろしければ提供していただけますか?
取り急ぎ、②のdmesgを添付させていただきます。(下から13行目あたりです)
ご確認よろしくお願いいたします。

投稿時に記載した通り、使用microSDは以下のようになっています。
8GB FAT32形式 1Gと3Gのパーテーションで1G側のみmountできていません。

ファイル ファイルの説明
sd-dmesg.txt

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

>対策はいくつかありますが、SD カードを /var/tmp ではなく /mnt 等にマウントして, 「TMPDIR=/mnt swupdate -i /mnt/update.swu」等でアップデートを実行すればそのディレクトリが swupdate と podman の一時的にディレクトリとして使用されますのでそれで進めるかと思います。

ご教示頂きました上記の方法を試しましたが、失敗となりました。

【作業手順】

①/boot/overlay.txtを変更しSDを有効化
# vi /boot/overlay.txt
変更前:fdt_overlays=armadillo-iotg-a6e-els31.dtbo armadillo-iotg-a6e-lwb5plus.dtbo
変更後:fdt_overlays=armadillo-iotg-a6e-els31.dtbo
# persist_file /boot/overlays.txt
②再起動
# reboot

③各SDのパーテーションをmount
# mkdir -p /mnt/sd1
# mkdir -p /mnt/sd2
# mkdir -p /mnt/sd3
# mount /dev/mmcblk1p1 /mnt/sd1
# mount /dev/mmcblk1p2 /mnt/sd2
# mount /dev/mmcblk1p3 /mnt/sd3

#df -h
④swupdate実行
# TMPDIR=/mnt/sd2 swupdate -i /mnt/sd1/download.swu

【発生エラー】
添付ファイルをご確認ください。
・SDカードエラーログ.PNG

使用microSD
8GB FAT32形式

ファイル ファイルの説明
SDカードエラーログ.PNG

at_dominique.m…

2023年12月21日 9時46分

uesugiさん

お世話になっています、
マルティネでうs。

> ご教示頂きました上記の方法を試しましたが、失敗となりました。

これはものすごく分かりにくいですが、別のところで成功しました。

https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p… の「 USBメモリまたはSDカードからの自動インストール 」に説明されているとおり、SD カードのルートディレクトリ(/mnt/sd1直接)に swu ファイルがある場合に自動的にインストールされます。

手動にマウントして swupdate -i を実行したところにおそらく swupdate がすでに実行中になっていて、その実行が終わるのを待っていた後に「再起動しますよ」というエラーが出ました。

インストールのログは 「grep swupdate /var/log/messages」で確認できます。

自動インストールを防ぎたい場合は swu ファイルをサブディレクトリにするか、自動アップデートの udev ルールを無効化してください:

armadillo:~# echo '# disable system rule' > /etc/udev/rules.d/swupdate-usb.rules
armadillo:~# persist_file /etc/udev/rules.d/swupdate-usb.rules

よろしくお願いします。

at_dominique.m…

2023年12月21日 10時17分

uesugiさん

連続ですみません、

> 手動にマウントして swupdate -i を実行したところにおそらく swupdate がすでに実行中になっていて、その実行が終わるのを待っていた後に「再起動しますよ」というエラーが出ました。

追加しわすれてました:
- 成功の場合にしか再起動しませんので、自動インストールが成功しました
- また、自動インストールが /var/tmp を使っていたので、今回は容量が足りていたらしいですね…

最後に話を戻しますが、sd カードをマウントできない問題についてはもう少し時間をください。
sd カードがすでにマウントされて、アップデートが実行中の場合は問題なく普通の mount コマンドでマウント可能になっているはずですが、mount 実行中に別の mount コマンドを実行すると Invalid argument で失敗します。
(その際、dmesg に「Can't open blockdev」のメッセージが出力されていて、確認したところ「[ 178.590391] /dev/mmcblk1p1: Can't open blockdev」がちゃんと出漁されています)
ですが、マウントされている途中の時間はとても短くて、おそらく別の問題がからんでいるかと思います。起動じかんから3分立っているところに発生するはずがありません。
お手数ですが、また再現しましたら /var/log/messages の方も確認・提供をお願いできますでしょうか?
おそらく /var/log/messages に「Dec 20 11:05:42 armadillo user.notice swupdate-auto-update: Mounting mmcblk1p1 on /mnt in private namespace」のようなメッセージが記載されるはずですが、それと Can't open blockdev のエラーの一致を確認したいです。

よろしくお願いします。