Linux 操作系统如何格式化 SD 卡并神奇地修复所有问题?
我有一个运行 FreeRTOS 和 FAT-FS 的 STM32。
当我的 SD 卡损坏且 FAT-FS 对此无能为力时,我通过 Linux 格式化 SD 卡,然后一切又开始工作。
Linux如何格式化SD卡?
FAT-FS 表示存在物理错误(驱动程序级别错误,因此基本上 SD 内的 uC 未按我们预期的方式响应)。
答案1
我有一部旧手机。如果我让它写入SD卡,有时会写入坏扇区。我怀疑这种情况发生在电池电量不足的情况下,并且因为手机无法满足 SD 卡的标准电气要求。
在现代块设备上,坏逻辑块可能会反复读取失败(校验和不匹配),但如果成功向其中写入新内容,则会“修复”。当我的手机损坏我的 SD 卡时,我所需要做的就是重新格式化该卡。我什至不需要重写所有块(有时称为“完整格式”)。在重新格式化期间和之后,文件系统永远不会读取尚未写入的块(从来没有任何理由这样做)。
这种方法存在一些风险。您的设备实际上可能已永久损坏,并且在格式化一段时间后问题会再次出现。如果这是一个问题,最安全的方法是在格式化设备或分区之前以某种方式对其进行测试。 (从历史上看,你应该使用badblocks
,但我不确定现在它有多好)。
如果文件的某个数据块损坏,您可以通过删除或覆盖该文件来恢复。问题是当文件系统的内部结构中有坏块时。通常,文件系统不包含任何将其重置为默认初始状态的代码。悄无声息地丢失数据的风险太高了。因此错误将持续存在。一些文件系统检查器可能会询问您是否要重置坏块。
(旁注:特别是对于 Linux fsck.vfat
,我有一些文件系统,它只是放弃了它,并说它没有实现特定类型的修复。我怀疑 Windows 版本的文件系统更全面一些。)
某些文件系统可能支持使用冗余副本恢复某些结构,而不必重置它们。 FAT 文件系统往往使用两个冗余 FAT 运行,这可以用于恢复,例如fsck.vfat
在 Linux 上。 Ext4 倾向于保留大量冗余的“超级块”。
我了解像 btrfs 和 ZFS 这样的文件系统可以配置为在不同的设备上保留所有元数据的冗余副本,并在它们仍在运行时进行修复。
[从此评论扩展:通过内核跟踪定义故障 SD 卡的状态?]