この問題を中心に展開している既存のトピックがいくつかありますが、私が求めることは少し異なります。組み込みLinuxにSDカードを使用していますが、電力損失に悩まされています。いつかハードウェアを変更したり、適切に終了したりすることができるかもしれません。しかし、今のところ、大騒ぎすることなく停電に耐えられるファイルシステムを見つけたいと思っています。データの損失は許容されます。私は現在書いているファイルより多くを失いたくないのですが、「マウントできません」、「この10分間fsckを待つ」、または「新しいファイルを作成できません」に直面するよりも、むしろそれを失いたいこのiノードが原因で何かエラーが発生しました。プログラムは続けなければなりません!
私はこれを確実にするために多くの努力をしています。私は工業用グレードのコンポーネントを使用しています。ハードウェアウォッチドッグ、ソフトウェアウォッチドッグ、内部、外部、initによるプログラムの再起動、デーモンによるメモリ、ファイル記述子の常時チェックなど、ウォッチドッグがウォッチドッグを監視し、ウォッチドッグが他のウォッチドッグによって監視されています。 ...しかし、SDカードがマウントされて機能することを保証できないようです。
今の私の最善の策は、SDカードでJFSを使用することです。私のインストールにfsckとfsck.jfsを含めます。(私のRAMと私のフラッシュを食べる600kb +を追加します。これは悪いことです。)そして、毎回の起動時にfsckを実行します(ブート時間が長くなる可能性があります。これはやや悪いことです)。それは少し悲しいようですが。
誰かがより良い方法やより良いファイルシステムを知っていますか?
更新:e2fsprogs-libs(jfsutilsへの依存)は、私のディストリビューションでコンパイルするのが非常に難しいようです。ZFSを調べます(私のディストリビューションにはネイティブではありません。そして、私が必要としないことはたくさんあるようです)。
UPDATE2:私のシステムとテストに関するいくつかの詳細:SDカードストレージは、セカンダリのオプションのストレージです。SDカードは、2Gb-8Gbの工業グレードのmicroSDです。SDカードは、mount -tコマンドでrcを介してマウントされます。オプション「noatime」ではなく「sync」。私のディストリビューションは、3.10カーネルと1.21 busyboxを備えたカスタムAnalog Device風味のuClinuxです。私のプライマリストレージはjffs2を使用したspiフラッシュです。私はそれに関して何の問題も経験したことがありません。利用可能なfsck.jffs2があるかどうかさえわかりません。一方でナンドフラッシュ...しかし、それは別の話です。SDカードの目的は、測定データを保存することです。'monitor'プログラムは結果をファイルに追加し、戦略的な同期配置を備えています。ファイルが所定のサイズを超えると、新しいファイルが作成されます。指定した数のファイルに達すると、最も古いファイルが削除されます。停電が原因で現在の測定ファイルが失われた場合でも、問題はありません。ファイルは通常50〜100 kbで、1つの結果は通常1 kbです。これは初期の開発段階にすぎません。何も修正されていません。組み込みシステムでフラッシュ以外のファイルシステムを扱ったのはこれが初めてです。(x86サーバーでext4を取得しました。)
私はvfatから始めました。デフォルトのファイルシステム。(私は、工場がそれを選択する理由があるかもしれないと考えました。そして、物事がうまくいくならば、私はそれほど気にしません。)私は、組み込みvfatデバイスで電力損失の問題を見たことはありません。WinCEでFATの問題を経験しました。しかし、私の「モニター」プログラムが100-200ファイルに達したとき、それ以上作成することを拒否しました。FATにはルートに特別なファイル制限の問題があり、サブディレクトリに少し大きい問題があるようです。1つのディレクトリに500〜1000個のファイルを作成できるようにする必要があります。したがって、vfatは機能しません。
その後、ext2に切り替えました。起動時にfsckを挿入しませんでした。(私がそうしなければならなかったことを知りませんでした。)1日以内に、「モニター」プログラムは、「iノード何か何か」エラーのためにそれ以上のファイルを作成できませんでした。災害!
私の現在のソリューションは、起動時に「e2fsck -y」を使用したext2です。これまでのところ、それは有望なようです。しかし、e2fsckと「起動時のfsck」の概念全体が私を悩ませています。それ自体によるe2fsckは、私のプライマリフラッシュとRAMの350kb以上を費やしています。(実行されていない場合)これは、これが私の最大のプログラムであることを意味します。それはbusyboxよりも大きいです。それは私のカーネルにほとんど匹敵しています。
私はext3を検討してきました。メタデータをジャーナル化しているので、害はありません。それがどれほど役立つかについては疑問です。私の小さなファイルと制御された同期で、私はカバーされるべきだと思いますか?順序付けされた書き込みシーケンスがあります。データもある程度ジャーナル化されていることを意味します。ただし、これにより非決定的なラグが発生する可能性があります。これは私の状況では悪いです。(それはおそらく問題ではありません。)また、スケジュールされた同期機能があります。例えば。5秒ごとにコミットします。自分の同期を妨げていると思います。SDカードの場合、書き込みが多すぎると良くありません。産業用のものでも。これを無効にする方法に関するドキュメントは見つかりません。そして、ext3はまだ、すべての起動時に実行されるように、fsckを要求します!しかし、ext3はまだ可能性があります。
Ext4。ext3のパフォーマンス問題の多くを修正します。本当にパフォーマンスは必要ありません。そして、私のディストリビューションには組み込みのmkfs.ext4とfsck.ext4がないようです。おそらくそれは問題ではありません。それはそうかもしれません。例えば。e2progs-libs(jfsutilsへの依存関係)には、コンパイルに関する多くの問題があるようです。
JFS、XFS、BRFSS。すべて私のカーネルでサポートされています。現在、ユーザースペースのツールボックスには含まれていません。すべてがかなり大きく複雑なシステムのようです。そして、それらはすべて起動時に「fsck」と同等のものを必要とするようです?
自分のファイルシステムをスローすることも検討しました。常にファイルテーブルのコピーを2つ書き込みます。トラバースするとき、正しいCRCと最新のシーケンス番号を持つものを選択します。2段階の書き込みシーケンスを作成します。一時的に割り当て、コミット時に修正します。fsckは必要ありません。少しナイーブかもしれませんが。
UPDATE3:ところで、組み込みシステム(少なくとも1つ)の性質は、それらが自律的で、無人で、手の届かないところにあり、何年も実行する必要があるということです。fsckのようなプログラムも人間の相互作用を必要とするには、私を這います。