我的嵌入式 Linux 设备使用 SD 卡来保存某些诊断数据,这些数据对于内部闪存来说实在是太丰富了。
问题是,如果设备意外关闭,卡上的文件系统(FAT32)就会损坏。
没有办法防止意外断电或用户关闭它,而且该设备应该相对免维护。更糟糕的是,数据是连续写入的,因此损坏非常频繁,并且 Linux 在检测到故障 FS 时会默默地将其重新挂载为只读。
您建议用什么方法来缓解这种情况?启动时自动运行 fsck.vfat 就够了吗?
更多信息:
- 用户不应将该卡视为可移动的。它应被视为内部磁盘。存储在其上的任何数据都可以通过网络或 USB 驱动器下载,并且系统会自动清除最旧的条目。这意味着它不需要在普通 PC 上可读。
- 系统目前支持 FAT、yaffs 和 jffs2。向内核添加其他文件系统也是可行的,但如果有其他途径,我们会优先考虑它们。
- 写入可以根据需要暂停几分钟而不会丢失数据。
- 部分数据丢失或轻微损坏是可以接受的,但完全停止记录则不行。
- 大多数情况下,断电事件是完全不可预测的。
- 系统运行在 ARM9、200MHZ、64MB RAM、32MB 内部闪存上,其主要功能消耗了大部分 CPU 功率。在考虑资源密集型解决方案时,请考虑到这一点。
答案1
您可以使用block2mtd
驱动程序来使用您似乎在其他地方为 SD 卡使用的事务性 jffs2 或 yaffs(2) 文件系统,这将解决关机时数据丢失或文件系统损坏的问题。
不过,这样做可能会引发其他问题。由于 SD 卡可能具有自己的磨损均衡和扇区重映射机制,因此这些机制可能会干扰 jffs2 和 yaffs 的实现,从而降低 SD 卡的使用寿命或性能。如果这不是问题,那么值得一试。
答案2
检查您使用的内核是否支持 vfat 的刷新和/或同步标志(似乎有些版本忽略了它,请小心!)。
要不就彻底废除文件系统如果所有内容都可以放入一个文件(就像原始日志流的情况一样!)或放入几个固定大小的文件中(使用分区;)