私たちは、OSおよびアプリケーション用の小型内部NANDデバイス(250-500Meg)とデータ用の8Gb SDHC SDカードを備えたSDカードを備えた小型組み込みLinuxシステム(2.6.35-ish)を開発しています。
いつでもデバイスの電源が切れることがあります。
システムはSDカードにデータを保存する必要があります。このデータは非常に重要です。システムの完全な目的です。これらのシステムは通常、リモートの場所にあるすべてのネットワークから完全に切断され、4〜8週間ごとにスリメネットを介してデータを取得します。
現在はSDカードにVFATを追加するだけです。これは主に最初のテスト顧客がWin7ノートブックに手動でデータを簡単にコピーできるようにするためです。
しかし、今間違った時間に停電が発生してデータが失われるのは時間問題に過ぎないという心配があります。
データの損失を防ぐために、これらのシステムを構成する最良の方法は何ですか? JFFS2は私が望むデータ作成方法のように聞こえますが(パフォーマンス要件はまったく高くありません)、block2mtdなどを使用するのはかなり面倒です。また、カードの摩耗レベリングがどのように相互作用するのかよくわかりません。
最良のアプローチは何ですか?
編集する
これで、ファイルシステムVFATをそのままにして、一度に1日のサイズのファイルを割り当て、0xFFでパディングして電源サイクルエラーのリスクを大幅に制限することを検討しています。その後、事前に生成されたブロックにレコードを追加し、SDカードが0xFF領域に削除/摩耗レベルを記録するほど愚かではないことを願っています。
noatimeを使用できますが、変更された時間フィールドの書き込みを防ぐための同等のVFAT nomtimeはありますか?新しい日のファイルが作成されるまでメタデータの更新を防ぐ方法が必要です。
編集2
Electronics Stack Exchangeの誰かがNANDにもECCデータがあるので、削除の必要性を防ぐ方法がないと思い出しました。
それでは、この場合、block2mtdを介したJFFS2は適切ですか?
編集3
思った以上に悪いです。私が持っているSDカードは、ディスクに同じ内容を書き込んでもデータブロックを消去します。消去ブロックは64KBで、完全に遅延された書き込みには大きすぎます。最大128 KBのデータをNANDフラッシュ(書き込み動作を制御できます)にログ形式で保存し、128 KBのブロックをSDカードのVFATパーティションにある128 KBのソートファイルに書き込みます(他のSDカードに128 KBがある場合)。ブロック削除)。
答え1
したがって、この問題を解決する方法は、「いつでも停電が起こる可能性がある」という問題を解決することです。 1分でもバッテリーを補充できませんか?
あるいは、2枚のSDカードを使用することもできます。あるカードにデータを書き込み、同期し、別のカードに書き込みます。各データブロックにはチェックサムとブロック番号が必要ですが、非常に不幸な停電が発生した場合でも、カードの1つが正確でなければなりません。
あなたの基本的な質問はSDカードの摩耗の平準化です。私が知っている限り、カードベンダーによって異なります(バッチ処理でもいつでも変更できます)。停電を正しく処理できない可能性があります。それが何をするかに応じて、これは単に書き込んでいるブロックを損傷する以上の意味を持つかもしれません。
- カードが小さいとしましょう。つまり、3(フラッシュ)ブロックです。ブロック1は2〜3回以上の書き込みを受けました。物理ブロックを数値で、論理ブロックA、B、Cを文字で呼び出します。これでA = 1、B = 2、C = 3です。
- ブロックAへの書き込みを実行します。 SDカードはアハ!ここでは摩耗レベリングが必要です。それ以外の場合、ブロック1は2と3の前に磨耗します。ブロック1と2を交換することにしました。
- ブロック1をRAM位置i(システムRAMではなくSDカード)に読み込みます。変更したい部分が更新されます。
- ブロック2をRAM位置iiに読み込む。
- ブロック1をクリアします。
- RAM 位置 ii をブロック 1 に書き込みます。
- マッピングテーブルをB = 1に更新します。
- ブロック2をクリアします。
- RAM位置iをブロック2に書き込む。
- A = 2を表すようにマッピングテーブルを更新します。
もちろん、「マッピングテーブルの更新」は必ずしも単純ではありません。 5-10は順序が異なる場合があります(すべて完了すると問題になりません。もちろん、書き込み前に削除する必要があります)。ただし、停電が発生すると(予想どおり)、AだけでなくBも損傷する可能性があります。または、地図の更新中に停電が発生した場合、どのようなダメージが発生する可能性があるのか、誰が知っていますか?
答え2
Electronics.stackexchange.comでも同様の内容が議論されています。予期しない停電からSDカードを保護する方法は?
有効な副次的な回答シリアル接続ソフトウェアソリューションを使用することは、ハードウェアを調べることです。 (ESEにもこれに関する質問がありますが、今は見つかりません。厳密に言えば、SDカードに関するものではなく、デバイスの電源の中断と検出と操作方法についてです。その上)。
簡単に言えば、バッテリー電源がない可能性がありますが、電源装置には電源をスムーズにするためのかなり大きなコンデンサがあります。基本的に電気はただ消えません。電圧は徐々に減少します。電圧が特定のポイントを下回ると、内蔵システムにRESET信号を送信する低電圧保護IC /回路がある可能性があります。 PCマザーボードにもこれらの機能があり、PSUの「POWEROK」信号に応答します。つまり、電源が切れると、電圧が安全レベルを下回る前にコンピュータが数ミリ秒間強制的に停止します。この間、SDカードなどの周辺機器の電源はオンになっていますが、コンピュータにはトランザクションがありません。
SDカードには、ウェアレベリングを含む保留中のトランザクションを完了するのに十分な時間があります。今後その力が出ました。十分に大きなコンデンサを使用するか、SDカードの近くにコンデンサを使用して電源を改善すると、これを確実にするのに役立ちますが、いつでもプラットフォームをそのまま実験できます。十分に長い間電力を維持する可能性が高い。
問題のハードウェアの側面が問題でない場合は、純粋なソフトウェアの側面を解決するだけです。ドロバート冗長性のために2つのカードを使用するという考えは悪くなく、VFATなどの標準ファイルシステムを使用すると、カードのウェアレベリングアルゴリズムが台無しになるリスクが軽減されます。
どちらにしてもそれほど多くの問題は発生しません。カードのブロックが100回の書き込みに耐えることができると仮定し(保守的に考えていますが、高品質のカードを手に入れよう!)8GBカードを使用すると、最初のブロックが失敗した場合は800GBを書きます(もちろん統計的に言えば) 。 。
答え3
予期しない停電により、SD、ext2ルートファイルシステムが破損する問題が発生しました。まず、読み取り専用のルートマウントでシステムを実行しています。書き込み可能なストレージが必要ですが(データレコードはありません)、2番目のパーティションを書き込み可能にします。予期しない停電が発生した場合にFSの損傷を最小限に抑えるために、これをext3パーティションに設定しました。ただし、これにより、カードへの物理書き込み回数が少なくとも2倍以上になります。この組み合わせ(ただし、2番目のパーティションがデータロガーに比べて頻繁に書き込まないことは認めます)は問題なく実行されるようです。これまで。 (システムを専門施設に設置してから約30ヶ月)
答え4
停電が発生する可能性がある環境では、データセキュリティと全体的なデータセキュリティに関して考慮すべき追加事項があります。
MLCセルは保存には使用されず、SLCのみが十分なデータ保持時間を持っています。これにより、SLCカードにスマートファームウェアがある可能性があります。測定値を使用して停電を識別し、最後のブロックが完全に記録されていることを確認します。
このカードはMLCデバイスよりも高価で、少し遅いです。 swissbitなどのプロバイダのカードを確認してください。