3

我正在开发一个没有任何需要使用文件系统的操作系统的嵌入式应用程序。我已经和项目中的人讨论过很多次了,有些人同意我的观点,即系统必须在出现电源故障时正确关闭系统,否则文件系统可能会发疯。

有人说,如果你只是关闭系统并让自然顺其自然并不重要,但我认为这是最糟糕的事情之一,特别是如果你知道这会给你带来问题并且可能会缩短你的产品的寿命。

在最后一段中,我只是假设这是一个问题,但我的问题仍然存在:

断电对文件系统有影响吗?

4

5 回答 5

15

以下是帮助嵌入式系统容忍电源故障的各种技术列表。这些对于您的特定应用程序可能不实用。

  1. 使用日志文件系统- 可以容忍由于电源故障、操作系统崩溃等导致的不完整写入。大多数现代文件系统都是日志文件系统,但要做好功课确认。

  2. 除非您的应用程序需要写入性能,否则请禁用所有写入缓存。 检查您的磁盘驱动程序的缓存选项。在 Linux/Unix 下,考虑以同步模式挂载文件系统。

  3. 除非它必须是可写的,否则将其设为只读。 尝试将您的应用程序可执行文件和操作系统文件保存在它们自己的分区上,并使用适当的写保护(例如,在 Linux 中以只读方式挂载)。您的读/写数据应位于其自己的分区上。即使您的应用程序数据被损坏,您的系统仍然应该能够启动(尽管具有故障安全默认配置)。

    3a。对于只写入一次的数据(例如配置设置),请尝试在大多数情况下将其安装为只读。如果有设置更改挂载临时为 R/W,请更新数据,然后将其卸载/重新挂载为只读。

    3b。使用类似于 3a 的技术来处理现场的应用程序/操作系统更新。

    3c。如果以只读方式挂载 FS 对您来说不切实际,至少考虑以只读方式打开单个文件(例如 fp=fopen("configuration.ini", "r"))。

  4. 如果可能,请使用单独的设备进行存储。 将内容保存在单独的分区中提供了一些保护,但仍然存在分区表可能损坏并导致整个驱动器不可读的极端情况。使用物理上分离的设备进一步隔离了一个损坏的设备,导致整个系统瘫痪。在一个完美的世界中,您将拥有至少 4 个独立的设备:

    4a。引导加载程序

    4b。操作系统和应用程序代码

    4c。配置设置

    4e。申请资料

  5. 了解您的存储设备的特性,并控制所使用设备的品牌/型号/版本。 一些硬盘忽略来自操作系统的缓存刷新命令。我们曾经遇到过某些型号的 CompactFlash 卡在断电时会自行损坏的情况,但“工业”型号没有这个问题。当然,这些信息没有在任何数据表中公布,必须通过实验测试来收集。我们制定了一份批准的 CF 卡清单,并保留了这些卡的库存。随着旧卡过时,我们不得不定期更新此列表,否则制造商会进行修订。

  6. 将您的临时文件放入RAM Disk中。如果您将这些写操作保留在磁盘外,则可以将它们作为潜在的损坏源消除。您还可以减少闪光磨损。

  7. 开发自动化的损坏检测和恢复方法。- 如果应用程序只是因为缺少配置文件而挂起,那么上述所有技术都对您没有帮助。您需要能够尽可能优雅地恢复:

    7a。您的系统应至少保留其配置设置的两个副本,一个“主”和一个“备份”。如果主因某种原因失败,请切换到备份。您还应该考虑在配置更改时或在用户声明配置“良好”后(测试与生产模式)进行备份的机制。

    7b。您的应用程序数据分区是否挂载失败?自动运行 chkdsk/fsck。

    7c。chkdsk/fsck 是否未能解决问题?自动重新格式化分区并将其恢复到已知状态。

    7d。您是否有引导加载程序或其他方法来在故障后恢复操作系统和应用程序?

    7e。确保您的系统会发出哔哔声、闪烁 LED 或其他东西以向用户指示发生了什么。

  8. 电源故障应该是您的系统资格测试的一部分。 确保您拥有一个强大的系统的唯一方法是对其进行测试。从系统中拔出电源线并记录发生的情况。尝试在系统操作中的多个点(运行时、启动时、中间配置等)拉出电源。多次重复每个测试。

  9. 如果您无法缓解所有电源故障问题,请在系统中加入电池或超级电容器- 请记住,您将需要操作系统中的后台进程来在电量不足时启动正常关机。此外,电池将需要定期测试和更换。

于 2013-01-24T19:36:39.703 回答
4

除了 msemack 的回复,不幸的是,我的评分太低,无法对他的答案与单独的答案发表评论。

断电对文件系统有影响吗?

是的,如果没有采取适当的措施来防止腐败。请参阅以前的答案以了解文件系统选项以帮助缓解。但是,如果您的设备上未正确实施 ATA 刷新/睡眠,您可能会遇到我们所做的情况。在我们的场景中,设备损坏超出了文件系统,并且 fdisk/format 无法恢复设备。

相反,一旦发生损坏,就需要 ATA 安全擦除来恢复设备。为了避免这种情况,我们在断电之前实施了一个 ATA 睡眠命令。这需要 400 毫秒的保持时间来支持 160 毫秒的 ATA 睡眠时间,并为帽在产品生命周期内的退化留有一些空间。

我们的场景中的注释:

  • fdisk/format 无法修复/恢复驱动器。
  • 我们的电源安全文件系统的检查磁盘实用程序返回该设备有坏块,但实际上没有。
  • 刷新/同步返回成功,很快,很可能没有实现。
  • 一旦损坏,dd 无法读取超出第一个分区边界的设备,并在之后返回 i/o 错误。
  • hdparm 用于发出 ATA 安全擦除,作为某些损坏情况的唯一恢复方法。
于 2015-10-15T01:20:52.860 回答
3

对于非日志文件系统的意外关闭可能意味着某些数据(包括目录结构)的损坏。如果缓存中有未保存的数据,或者 FS 正在写入多块更新并且仅写入一些块时发生中断,则会发生这种情况。

日志处理主要解决了这个问题——如果中间有中断,FS 完成的恢复例程或检查和修复操作(通常是隐式地)将文件系统带到一致的状态。然而,这种状态并不总是最新的——即如果内存缓存中有一些数据,即使使用日志,它们也可能丢失。这是因为日志可以使您免于文件系统的损坏,但不会起到任何作用。

直写模式(无写入缓存)降低了数据丢失的可能性,但不能完全解决问题,因为日志将作为缓存工作(在很短的时间内)。

所以不幸的是,备份或数据复制是防止数据丢失的主要方法。

于 2013-01-22T14:19:25.067 回答
2

这完全取决于您使用的文件系统,以及是否可以根据您的项目要求在断电时丢失一些数据。

可以想象使用一种文件系统,该文件系统可以防止无人看管的断电并且能够从部分写入序列中恢复。所以在应用方面,如果你没有绝对需要在关机前写入的critic数据,则不需要特定的断电检测程序。

现在,如果您想为您的项目提供更具体的答案,则必须提供有关您正在使用的文件系统和项目要求的更多信息。

编辑:由于您在关机前要保存重要的应用数据,我认为您自己已经回答了这个问题。确保无人值守关机的唯一方法是使用掉电检测来提醒您的嵌入式设备以及一些硬件电路,以便为设备提供足够的电力以执行关机程序。

于 2013-01-22T13:58:24.590 回答
2

如果正在进行写入或文件在关机时打开,则 FAT 文件系统特别容易损坏 - 特别是如果存在未刷新的缓冲操作。在一个项目中,我从事的解决方案是在启动时运行文件系统完整性检查和修复(本质上是 chkdsk/scandsk)。这种策略并没有防止数据丢失,但它确实防止了文件系统变得不可用。

许多供应商为 FAT 提供日志附加组件来解决这个问题。例如,这些包括SeggerQuadrosMicrium

无论哪种方式,您的系统通常应该采用 open-write-close 方法来访问文件,或者如果您觉得需要保持文件打开,则采用 open-write-flush 方法。

于 2013-01-22T15:49:32.760 回答