mor*_*llo 3 filesystems embedded power-off
我正在开发一个没有任何需要使用文件系统的操作系统的嵌入式应用程序.我和项目中的人一起经历了这么多次,有些人认为系统必须在发生电源故障时正确关闭系统,否则文件系统可能会疯狂.
有人说,如果你只是关闭系统并让大自然继续前进并不重要,但我认为这是最糟糕的事情之一,特别是如果你知道这会给你带来问题,并可能缩短你的产品寿命.
在最后一段我只是认为这是一个问题,但我的问题仍然存在:
断电对文件系统有影响吗?
myr*_*ack 12
以下是帮助嵌入式系统容忍电源故障的各种技术列表.这些可能对您的特定应用不实用.
使用日志文件系统 - 可以容忍由于电源故障,操作系统崩溃等导致的不完整写入.大多数现代文件系统都是记录的,但要做好功课以确认.
除非您的应用程序需要写入性能,否则禁用所有写入缓存. 检查磁盘驱动程序以获取缓存选项.在Linux/Unix下,考虑将文件系统安装在同步模式下.
除非它必须是可写的,否则将其设为只读. 尝试将应用程序可执行文件和操作系统文件保存在自己的分区上,并保留写保护(例如,在Linux中安装只读).您的读/写数据应该在它自己的分区上.即使您的应用程序数据已损坏,您的系统仍应能够启动(尽管具有故障安全默认配置).
3A.对于仅写入一次的数据(例如"配置设置"),请尝试在大多数情况下将其挂载为只读.如果有设置更改挂载是暂时为R/W,请更新数据,然后以只读方式卸载/重新安装.
3B.使用类似于3a的技术来处理现场的应用程序/操作系统更新.
3C.如果将FS安装为只读是不切实际的,至少考虑将单个文件打开为只读(例如fp = fopen("configuration.ini","r")).
如果可能,请使用单独的设备进行存储. 将事物保存在单独的分区中可以提供一些保护,但仍然存在分区表可能损坏并使整个驱动器不可读的边缘情况.使用物理上独立的设备进一步隔离了一个损坏整个系统的损坏设备.在完美的世界中,您将拥有至少4个独立的设备:
4A.引导装载程序
4B.操作系统和应用程序代码
4C.配置设置
4E.应用数据
了解存储设备的特性,并控制所用设备的品牌/型号/版本. 某些硬盘会忽略来自操作系统的缓存刷新命令.我们遇到过某些型号的CompactFlash卡在电源故障时会自行损坏的情况,但"工业"型号没有这个问题.当然,这些信息并未在任何数据表中发布,必须通过实验测试收集.我们开发了一份经批准的CF卡清单,并保留了这些卡的库存.我们定期更新此列表,因为旧卡已过时,或制造商会进行修订.
将临时文件放入RAM磁盘.如果将这些写入保留在磁盘上,则将其作为潜在的损坏来源予以消除.您还可以减少闪光磨损.
开发自动化的损坏检测和恢复方法. - 如果应用程序因缺少配置文件而挂起,则上述所有技术都无法帮助您.您需要能够尽可能优雅地恢复:
7A.您的系统应至少保留其配置设置的两个副本,即"主要"和"备份".如果主服务器由于某种原因失败,请切换到备份.您还应该考虑在配置更改时或在用户将配置声明为"良好"(测试与生产模式)之后进行备份的机制.
7B.您的应用程序数据分区无法安装吗?自动运行chkdsk/fsck.
7C.chkdsk/fsck无法解决问题吗?自动重新格式化分区并使其恢复到已知状态.
7D.在发生故障后,您是否有引导加载程序或其他方法来恢复操作系统和应用程序?
7E.确保您的系统发出哔哔声,闪烁LED或其他东西,以便向用户指出发生了什么.
电源故障应该是您的系统资格测试的一部分. 确保您拥有强大系统的唯一方法是测试它.从系统中拔出电源线并记录发生的情况.尝试在系统操作中的多个点(在运行时,启动时,中间配置等)中移动电源.多次重复每个测试.
如果无法缓解所有电源故障问题,请将电池或超级电容器合并到系统中 - 请记住,在电源较低时,操作系统中需要后台处理才能启动正常关机.此外,电池需要定期测试和更换年龄.
对于非日志文件系统,意外关闭可能意味着某些数据(包括目录结构)的损坏。如果缓存中有未保存的数据,或者 FS 正在写入多块更新并且仅写入部分块时发生中断,就会发生这种情况。
日志记录主要解决这个问题 - 如果中间出现中断,则由 FS 执行的恢复例程或检查和修复操作(通常是隐式的)会使文件系统达到一致状态。然而,这种状态并不总是最新的——即,如果内存缓存中有一些数据,即使使用日志记录,它们也可能会丢失。这是因为日志记录可以使您免于文件系统的损坏,但并不能发挥神奇作用。
直写模式(无写入缓存)减少了数据丢失的可能性,但并不能完全解决问题,因为日志将充当缓存(在很短的时间内)。
因此不幸的是,备份或数据复制是防止数据丢失的主要方法。