我正在开发一个没有任何需要使用文件系统的操作系统的嵌入式应用程序。我和项目中的人一起经历了这么多次,有些人认为系统必须在出现电源故障时正确关闭系统,否则文件系统可能会疯狂。
有些人说,如果你只是关闭系统并让大自然继续前进并不重要,但我认为这是最糟糕的事情之一,特别是如果你知道这会给你带来一个问题,可能缩短产品的使用寿命。
在最后一段中,我只是假设这是一个问题,但我的问题仍然存在:
断电对文件系统有影响吗?
答案 0 :(得分:12)
以下是帮助嵌入式系统容忍电源故障的各种技术列表。这些可能对您的特定应用不实用。
使用Journaling File System - 可以容忍由于电源故障,操作系统崩溃等导致的不完整写入。大多数现代文件系统都是记录的,但要做好功课确认。
除非您的应用程序需要写入性能,否则请禁用所有写入缓存。检查磁盘驱动程序是否有缓存选项。在Linux / Unix下,考虑将文件系统挂载到同步模式。
除非它必须是可写的,否则将其设置为只读。尝试将应用程序可执行文件和操作系统文件保存在自己的分区上,并保留写保护(例如mount只能在Linux中读取)。您的读/写数据应该在它自己的分区上。即使您的应用程序数据已损坏,您的系统仍应能够启动(尽管具有故障安全默认配置)。
3A。对于仅写入一次的数据(例如“配置设置”),请尝试在大多数情况下将其挂载为只读。如果有设置更改挂载是暂时为R / W,请更新数据,然后以只读方式卸载/重新安装。
3B。使用类似于3a的技术来处理现场的应用程序/操作系统更新。
3c上。如果将FS安装为只读是不切实际的,至少考虑将单个文件打开为只读(例如fp = fopen(“configuration.ini”,“r”))。
如果可能,请使用单独的设备进行存储。将内容保存在单独的分区中可提供一些保护,但仍存在分区表可能损坏并呈现整个驱动器的边缘情况不可读。使用物理上独立的设备进一步隔离了一个损坏整个系统的损坏设备。在完美的世界中,您将拥有至少4个独立的设备:
4A。引导加载程序
4b中。操作系统&申请代码
4c中。配置设置
4e中。申请数据
了解存储设备的特性,并控制所用设备的品牌/型号/版本。某些硬盘会忽略来自操作系统的缓存刷新命令。我们遇到过某些型号的CompactFlash卡在电源故障时会自行损坏的情况,但“工业”型号没有这个问题。当然,这些信息并未在任何数据表中发布,必须通过实验测试收集。我们开发了一份经批准的CF卡清单,并保留了这些卡的库存。我们定期更新此列表,因为旧卡已过时,或制造商会进行修订。
将您的临时文件放在RAM Disk中。如果将这些写入保留在磁盘上,则将其作为潜在的损坏源进行消除。您还可以减少闪光磨损。
开发自动化损坏检测和恢复方法。 - 如果应用程序因缺少配置文件而挂起,则上述所有技术都无法帮助您。您需要能够尽可能优雅地恢复:
7a中。您的系统应至少保留其配置设置的两个副本,即“主要”和“备份”。如果主服务器由于某种原因失败,请切换到备份。您还应该考虑在配置发生更改时,或者在用户声明配置“良好”之后进行备份的机制(测试与生产模式)。
7b中。您的应用程序数据分区无法安装吗?自动运行chkdsk / fsck。
7C。 chkdsk / fsck无法解决问题吗?自动重新格式化分区并使其恢复到已知状态。
7D。在发生故障后,您是否有引导加载程序或其他方法来恢复操作系统和应用程序?
7E。确保您的系统发出哔哔声,闪烁LED或其他东西,以便向用户表明发生了什么。
电源故障应该是您的系统资格测试的一部分。您确定拥有强大系统的唯一方法是测试它。从系统中拔出电源线并记录发生的情况。尝试在系统操作中的多个点(在运行时,启动时,中间配置等)中断电。多次重复每个测试。
如果无法缓解所有电源故障问题,请将电池或Supercapacitor合并到系统中 - 请注意,您需要在操作系统中启用后台进程才能启动电量不足时正常关机。此外,电池需要定期测试和更换年龄。
答案 1 :(得分:4)
除了msemack的回复,遗憾的是我的评分太低,无法对他的答案发表评论而不是单独的答案。
断电对文件系统有影响吗?
是的,如果没有采取适当的措施来防止腐败。有关文件系统选项的帮助,请参阅前面的答案。但是,如果您的设备上没有正确实现ATA刷新/睡眠,您可能会遇到我们所做的情况。在我们的场景中,设备在文件系统之外已损坏,并且fdisk / format无法恢复设备。
一旦发生损坏,需要ATA安全擦除才能恢复设备。为了避免这种情况,我们在断电之前实施了ATA睡眠命令。这需要400毫秒的保持时间来支持160毫秒的ATA睡眠,并且在产品的使用寿命期间留下一些降低帽子的空间。
我们的情景说明:
答案 2 :(得分:3)
对于非日志文件系统,意外关闭可能意味着某些数据(包括目录结构)的损坏。如果缓存中存在未保存的数据,或者FS正在编写多块更新,并且只写入一些块时发生中断,则会发生这种情况。
Journalling主要解决这个问题 - 如果中间中断,FS执行的恢复例程或检查和修复操作(通常是隐式的)会使文件系统处于一致状态。然而,这种状态并不总是最新的 - 即如果存储器高速缓存中有一些数据,即使使用日志记录它们也可能丢失。这是因为日志记录可以避免文件系统损坏,但不会产生魔法。
直写模式(无写缓存)降低了数据丢失的可能性,但并未完全解决问题,因为日志记录将作为缓存(在很短的时间内)。
所以不幸的是,备份或数据复制是防止数据丢失的主要方法。
答案 3 :(得分:2)
这完全取决于您使用的文件系统,以及是否可以根据您的项目要求在断电时丢失一些数据。
可以想象使用一个文件系统,该文件系统可以防止无人值守的断电,并且能够从部分写入序列中恢复。因此,在应用方面,如果您没有绝对需要在下载之前编写的批评数据,则不需要特定的断电检测程序。
现在,如果您想为项目提供更具体的答案,则必须提供有关您正在使用的文件系统和项目要求的更多信息。
编辑:由于你有关键应用数据要在关机前保存,我想你已经自己回答了这个问题。确保无人值守断电的唯一方法是进行欠压检测,以便向嵌入式设备发出警报,并提供一些硬件电路,以便为设备提供电源以执行关机程序。
答案 4 :(得分:2)