Linux OSはどのようにしてSDカードをフォーマットし、魔法のようにすべてを修正しますか?
FreeRTOSとFAT-FSを実行しているSTM32があります。
SDカードが破損していて、FAT-FSで何もできない場合は、LinuxでSDカードをフォーマットすると、すべてが再び機能し始めます。
LinuxはSDカードをどのようにフォーマットしますか?
FAT-FSは、物理エラーがあると言っています(ドライバーレベルのエラーなので、基本的にSD内のuCは期待どおりに応答しません)。
私は古い電話を持っています。 SDカードを書き込ませると、不良セクタを書き込むことがあります。これは、バッテリー残量が少なく、電話がSDカードの標準的な電気的要件を満たしていないために発生すると思われます。
最新のブロックデバイスでは、不良論理ブロックは繰り返し読み取りに失敗する可能性があります(チェックサムの不一致)が、新しいコンテンツを正常に書き込むと「修復」されます。私の電話が私のSDカードを破損したとき、私がする必要があるのはカードを再フォーマットすることだけです。すべてのブロックを書き直す必要すらありません(「フルフォーマット」と呼ばれることもあります)。再フォーマット中および再フォーマット後、ファイルシステムはまだ書き込んでいないブロックを読み取ることはありません(そうする理由はありません)。
このアプローチにはいくつかのリスクがあります。デバイスが実際に恒久的に損傷している可能性があり、フォーマット後しばらくすると問題が再発する可能性があります。これが懸念される場合、最も安全なアプローチは、フォーマットする前にデバイスまたはパーティションを何らかの方法でテストすることです。 (これまではbadblocks
を使用することになっていたのですが、最近はどれほど素晴らしいかわかりません)。
ファイルのデータブロックの1つに問題がある場合は、ファイルを削除または上書きすることで回復できる可能性があります。問題は、ファイルシステムの内部構造に不良ブロックがある場合です。通常、ファイルシステムには、これらをデフォルトの初期状態にリセットするコードは含まれていません。黙ってデータを失うリスクが高すぎます。したがって、エラーは解決しません。ただし、一部のファイルシステムチェッカーは、不良ブロックをリセットするかどうかを尋ねる場合があります。
(補足:Linuxの場合fsck.vfat
具体的には、私はそれがただあきらめて、特定のタイプの修復を実装していないと言っているファイルシステムを持っていました。そのWindowsバージョンはもう少し包括的だと思います。)
一部のファイルシステムは、特定の構造をリセットする代わりに、冗長コピーを使用して復元することをサポートしている場合があります。 FATファイルシステムは2つの冗長FATで実行される傾向があり、これらはリカバリに使用できます。沿って fsck.vfat
Linuxの場合。 Ext4は、冗長な「スーパーブロック」を多数保持する傾向があります。
BtrfsやZFSなどのファイルシステムは、すべてのメタデータの冗長コピーを別々のデバイスに保持し、実行中に修復できるように構成できることを理解しています。
[このコメントから拡張: カーネルトレースによって失敗したSDカードの状態を定義しますか? ]