Armadilloフォーラム

電源遮断時の永続保存フォルダ内ファイル破損対策

ttt90

2025年3月21日 11時13分

==========
製品型番:Armadillo-IoT G4
Debian/ABOSバージョン:3.15.4
カーネルバージョン:5.10.112-0-at
3G/LTE モジュール情報 (Debianのみ):
その他:
==========

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

アプリケーションから永続保存フォルダ(/var/app/volumes/)へファイルを書き込むシステムになっています。
システム構成上、Armadillo基板が安全にシャットダウンされることはなく、電源供給が突然遮断される仕組みになっています。
そのため、ファイルへの書き込み途中に電源が遮断された際にファイルが破損する可能性が考えられます。このような場合にハードウェア以外で対処可能な対策はありますでしょうか?

また、swupdateによる自動アップデートをシステムに導入しようとしています。
A面でアプリケーションは動作している状態でB面でアップデートをさせたいです。
下記フォーラムの中でswupdate中に/var/app/volumes/への書込みがあると、故障につながる可能性があると記載がありますが、/var/app/rollback/volumesへ保存場所を変更したほうが故障リスクは削減されるのでしょうか?そのほか良い方法があればご教示いただきたいです。

https://armadillo.atmark-techno.com/forum/armadillo/24408

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

コメント

at_satoshi.ohta

2025年3月21日 13時20分

太田です。

アップデート時に電源が遮断されると /var/app/volumes は2面化されていないので書き込みが中途半端になる可能性があります。
/var/app/rollback/volumes では、起動していない面(B面とします)に書き込みを行うので、もしアップデート途中で電源が切れたとしても現在起動しているアプリケーションに影響することはないです。
そのため、仰るとおり、電源が突然遮断されることを想定したシステムであれば /var/app/rollback/volumes に書き込みをした方がいいかもしれません。

それか、これまで通り /var/app/volumes に書き込みを行う場合についてですが、以下の方法が考えられると思います。
- 別のファイル名で保存して fsync/syncfs で保存してからリネームする
(既存のファイルがある場合には別の名前でコピーして fsync/syncfs で保存してからリネームする)
- sqliteのWALモードのようにデータの安全性を保ちつつ適切なタイミングで sync して eMMC に書き込むことを保証するソフトウェアを使用する

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

at_dominique.m…

2025年3月21日 13時46分

よこからすみません、マルティネです。

少し訂正させてください。

swupdate に関しては、太田さんの説明の通り、/var/app/rollback/volumes を使うと書き込みがシステムが使ってない領域で行われますので、電源の遮断があっても問題なく再起動して前の状態のままに Armadillo を利用できます。

swupdate 以外の書き込みは、rollback の「snapshot してから書きこんで、書き込み完了後に切り替える」仕組みは現実的ではありませんので、アプリケーションがファイルを書きこむ際にいくつかの注意が必要です。
btrfs では「copy on write」の仕組みでファイルシステムの故障はないですが、metadata と data の同期が揃ってない状態でファイルの中身が空に見えたり、大きいデータを書きこんでるところで途中の状態で同期させたりすることがありますので、アプリケーションから書き込みする場合は太田さんが書いた通りに sync 機能を明確につかうか、それをすでに対応してくれてる sqlite 等を利用するかになります。

ログの用なものでしたらファイルの最後にデータを足してる分でしたら問題ないと思いますが、複雑な処理を想定していたらなにかの database を使うと安心です。

よろしくお願いします。