web-dev-qa-db-ja.com

いつでも電源が切れてしまう場合は、SDカードを安全に使用してください

私たちは、OSとアプリケーション用の小さな内部NANDデバイス(250-500Meg)とデータ用の8Gb SDHC SDカードを備えたSDカードを備えた小さな組み込みLinuxシステム(2.6.35-ish)に取り組んでいます。

ユニットの電源はいつでも切断できます。

システムはデータをSDカードに保存する必要があります。このデータはかなり重要です...それはシステムの全体的な目的です。システムは通常、遠隔地のネットワークから完全に切断されており、データは4〜8週間ごとにスニーカーネット経由で取得されます。

現在、SDカードにはVFATが搭載されています。これは主に、最初のテストクライアントがWin7ラップトップに手動でデータを簡単にコピーできるようにするためでした。

しかし、私は今、間違った時間に停電が発生してデータが失われるまでは時間の問題だと心配しています。

データの損失を防ぐためにそのようなシステムを構成する最良の方法は何ですか? JFFS2は、データの書き込み方法に関しては私が望むもののように聞こえますが(パフォーマンスのニーズはまったく高くありません)、block2mtdなどを使用するのはかなり厄介に聞こえます。カードのウェアレベリングがどのように相互作用するかもわかりません。それと。

これを行うための最良の方法は何ですか?

[〜#〜]編集[〜#〜]

私は今、ファイルシステムVFATを残して、一度に0xFFで満たされた日サイズのファイルを割り当てることを考えています。これにより、電源サイクルの障害への露出を大幅に制限できます。その後、これらの事前に作成されたブロック内のレコードのみを追加できました。SDカードがそれほど愚かではなく、0xFF領域への書き込み/消去レベルの書き込みができないことを願っています。

Noatimeを使用できますが、変更された時間フィールドへの書き込みを防ぐのに相当するVFAT nomtimeはありますか?新しい日のファイルが作成されるまで、メタデータの更新をまったく防ぐ方法が必要です。

編集2

電子スタック交換の担当者から、NANDにECCデータがあることを思い出させられたため、消去の必要性を防ぐ方法はありません。

それで、block2mtdを介したJFFS2はこの状況で適切でしょうか?

編集

思ったより悪いです。私が持っているSDカードは、まったく同じ内容をディスクに書き込んでも、データブロックを消去します。消去ブロックは64KBであり、書き込みを完全に遅らせるには大きすぎます。 NANDフラッシュ(書き込み動作を制御できる)に最大128 KBのデータを一種のジャーナルに保存し、SDカードのVFATパーティションにある128 KBに整列したファイルに128 KBブロックを書き込みます(他のSDカードに128KBの消去ブロックがある場合)。

10
darron

さて、これを修正する方法は、「いつでも電源を切ることができる」という問題を修正することです。 1分でもバッテリーを追加することは不可能ですか?

または、2枚のSDカードを使用することもできます。 1つのカードにデータを書き込み、同期し、もう1つのカードに書き込みます。データの各ブロックにはチェックサムとブロック番号が必要ですが、かなり不運な停電が発生した場合でも、カードの1つが正しいはずです。

基本的な問題は、SDカードのウェアレベリングです。これはAFAIKがカードベンダーに依存します(おそらくバッチでさえ、いつでも変更できます)。おそらく停電は正しく処理されません。そして、それが何をするかによっては、それはあなたが書いているブロックを破壊することを意味するだけではないかもしれません。

  1. 自明に小さいカード—3(フラッシュ)ブロックを想定します。ブロック1は、2または3よりも多くの書き込みを受信しました。物理ブロックは番号で、論理ブロックA、B、Cは文字で呼びます。現在、A = 1、B = 2、C = 3です。
  2. ブロックAに書き込みを発行します。 SDカードはあはは!ここでウェアレベリングが必要です。そうしないと、ブロック1が2と3の前に摩耗します。ブロック1と2を交換することにします。
  3. ブロック1をRAM位置i(システムRAMではなくSDカード上)に読み込みます。変更したい部分を更新します。
  4. ブロック2をRAM位置iiに読み込みます
  5. ブロック1を消去します
  6. RAM iiをブロック1に書き込みます。
  7. B = 1となるようにマッピングテーブルを更新します
  8. ブロック2を消去します。
  9. RAM位置iをブロック2に書き込みます。
  10. A = 2となるようにマッピングテーブルを更新します

もちろん、「マッピングテーブルの更新」は必ずしも簡単なことではありません。また、5〜10の順序は異なる場合があります(すべてが完了している場合は問題ありません。消去は書き込みの前に行わなければなりません)。しかし、停電が発生すると、Aが(予想どおりに)破損するだけでなく、Bも破損する可能性があります。または、マッピングの更新中に電源障害が発生した場合、どのような種類の破損が発生するかは誰にもわかりません。

5
derobert

SDに問題があり、予期しない電源障害でext2ルートファイルシステムが破損しています。まず、システムを読み取り専用のルートマウントで実行します。書き込み可能なストレージが必要だったため(ただし、データロギングではなかった)、2番目のパーティションを書き込み可能として設定しました。 FS予期しない電源障害による損傷を最小限に抑えるために、これによりext3パーティションが作成されましたが、これによりカードへの物理的な書き込みが少なくとも2倍になります。この組み合わせ(ただし、2番目のパーティションは許可します)データロガーに比べて書き込み頻度が少ない)問題なく動作しているようです。これまでのところ(専門施設に約30ヶ月間設置されているシステム)

4
Dave Kitchen

同様のことがelectronics.stackexchange.comで議論されました: 予期しない停電からSDカードを保護するにはどうすればよいですか?

ソフトウェアソリューションとタンデムで機能する横向きの答えは、ハードウェアを調べることです(これについても、ESEに質問がありましたが、私にはできません今すぐそれを見つけてください。厳密にはSDカードではなく、電源が失われたデバイスと、これを検出してそれに対処する方法についてです。

簡単に言うと、バッテリー電源がない場合でも、電源にはかなり大きなコンデンサーがあり、電源をスムーズにします。基本的に、電源が切れるだけではありません。電圧は徐々に低下します。電圧が特定のポイントを下回ると、組み込みシステムのRESET信号をアサートする電圧低下保護IC /回路がおそらくあります。 PCマザーボードにもそれらがあり、PSUからの「POWEROK」信号に応答します。これは、電源が切れると、電圧が安全なレベルを下回る前に数ミリ秒の間、コンピューターが強制的に停止されることを意味します。この間、SDカードなどの周辺機器の電源は入ったままですが、コンピューターからのトランザクションはありません。

SDカードには、ウェアレベリングを含む保留中のトランザクションを完了するのに十分な時間がある可能性がありますに電源が切れます。十分な大きさのコンデンサで電源を改善するか、SDカードの近くにあるコンデンサを使用すると、これを確実にできますが、いつでもプラットフォームをそのまま試すことができます。十分な時間電力を保持している可能性が非常に高いです。

問題のハードウェアの側面が問題でない場合は、ソフトウェアのみの問題を解決できます。 derobert 冗長性のために2つのカードを使用するという考えは悪くありません。VFATなどの標準ファイルシステムを使用すると、カードの損耗均等化アルゴリズムを混乱させるリスクが少なくなります。

とにかく、それはあなたがそれほど多くの問題を抱えることはないでしょう。カード上のブロックが100回の書き込みに耐えられると仮定すると(控えめですが、高品質のカードを取得するようにしてください!)、8GBのカードを使用すると、最初のブロックがなくなるまでに800GBを書き込みます(もちろん統計的に言えば)。

4
Alexios

停電や全体的なデータセキュリティの可能性がある環境でのデータセキュリティについては、さらに多くの点を考慮する必要があります。

ストレージにMLCセルを使用せず、SLCのみが十分なデータ保持時間を持っています。次に、それらのSLCカードにスマートファームウェアを含めることができます。一部のカードは、どのような状態でも電源喪失によって破損することはありません。彼らは測定によって停電を認識し、最後のブロックが完全に書き込まれていることを確認します。

これらのカードは、MLCセルよりも高価で、少し低速です。カードについては、swissbitなどのベンダーを参照してください。

3
Rotesmofa