我应该在嵌入式系统上使用fsck ext3吗?
收藏

我们有许多嵌入式系统需要对驻留在闪存上的文件系统进行r/w访问,并进行块设备仿真。我们最老的平台运行在Compact Flash上,这些系统已经使用了3年多,在启动期间没有运行任何一个FSCK,到目前为止,我们没有因文件系统或CF而失败。
在我们最新的平台上,我们最初使用USB闪存进行生产,现在正在迁移到模块上的磁盘进行R/W存储。前一段时间,我们在运行USB存储的许多设备上的文件系统出现了一些问题,所以我启用了E2FSCK,以查看这是否有帮助。结果我们收到了一批坏的闪存,所以一旦更换,问题就消失了。我已经禁用了E2FSCK,因为我们没有迹象表明它使系统更加可靠,从历史上看,没有它我们一直很好。
既然我们已经开始在模块单元上放入磁盘,我又开始看到文件系统错误了。突然,系统无法读取/写入某些文件,如果我试图从紧急控制台访问该文件,我只会得到“输入/输出错误”。我再次启用了e2fsck,所有文件都被更正了。
o'reilly的“构建嵌入式linux系统”建议在ext2文件系统上运行e2fsck,但没有提到它与ext3的关系,所以我对是否应该启用它有点困惑。
你对在嵌入式系统上运行fsck有什么看法?我们正在考虑将二进制文件放在一个r/o分区上,并且只将必须修改的文件放在同一个闪存设备上的r/w分区上,这样fsck就不会意外地删除重要的系统二进制文件,有没有人有过这种设置的经验(好/坏)?


最佳答案:

我认为对您的问题的回答更多地涉及到您的应用程序相对于其数据有哪些类型的一致性要求。也就是说,如果在没有正式关闭系统的情况下断电,必须保证什么?一般来说,没有一个桌面操作系统类型的文件系统能够很好地处理这一切,而不需要在应用程序的关键事务点关闭/同步文件和刷新磁盘缓存等,以确保您需要维护的内容实际上已提交给媒体。
运行fsck可以修复文件系统,但是如果没有上述注意事项,就无法保证您所做的更改将被实际保留。IE:停电会给你带来什么后果还不确定。
我同意将二进制文件或其他重要的只读数据放在单独的只读分区上确实有助于确保它们不会由于文件系统结构的fsck修正而被错误地丢弃。至少,将它们放在根目录下的另一个子目录中,而不是放在保存r/w数据的位置将有所帮助。但在这两种情况下,如果您支持软件更新,您仍然需要有一个方案来处理编写“只读”区域。
在我们的应用程序中,我们实际上为二进制文件之类的东西维护了一对目录,系统设置为从这两个区域中的任何一个启动。在软件更新期间,我们更新第一个目录,将所有内容同步到媒体,并在转到第二个副本的更新之前验证磁盘上的md5校验和。在引导期间,仅当md5校验和良好时才使用它们。这将确保始终引导相干图像。

    公众号
    关注公众号订阅更多技术干货!