2

我有一个 linux 嵌入式环境。

这里我有2个场景:

A:

  1. 打开并写入一个临时文件。
  2. 将临时文件重命名为原始文件。
  3. 电力流失

结果:重新启动后,我拥有的是:

  • 0 大小的原始文件,并且没有临时文件。

乙:

  1. 打开并写入一个临时文件。

  2. FSYNC临时文件。

  3. 将临时文件重命名为原始文件。

  4. 电力流失

结果:重启后,

  • 保留原始文件的原始内容,但未实现
  • 0 大小的临时文件

如您所见,在这两种情况之间,唯一的区别是临时文件的 fsync,而不是原始文件。在这两种情况下,我都没有 fsync 原始文件

那么,为什么原始文件的原始内容会保留在场景 B 中呢?

从原始文件的角度来看,更改是通过重命名non-fsynced file vs fsynced file来实现它。

这如何保留原始内容?

编辑:

这种实现原始文件的场景也未能安全地实现原始文件:

  1. 打开并写入一个临时文件。

  2. FSYNC 临时文件。

  3. 将临时文件重命名为原始文件。

  4. fsync 原始文件所在目录

  5. 电力流失

结果:

0 大小的原始文件。

那么,我该怎么做呢?

4

1 回答 1

1

通常,如果您想免受断电的影响,您可以使用日记功能。这意味着(从广义上讲)你存储你想要写的东西,在哪里,你写它,当它成功写出来时,你(至少在逻辑上)从日志中删除它。如果发生重大故障(断电或其他系统崩溃),您可以阅读日志并应用仍然存在的任何更改。许多文件系统都有启用它的选项,在日志文件系统上,您可以期望重命名是原子的并且不受断电影响:文件将以旧名称或新名称存在。

所以常见的工作流程是:

  • 将旧文件重命名为备份名称
  • 将新文件写入其最终名称
  • 关闭新文件以确保它将驻留在磁盘上
  • 删除备份文件(或给它一个不同的名称)

如果断电(或任何其他崩溃情况),下次重启时事情很简单:

  • 如果不存在备份文件,则文件处于稳定状态
  • 如果存在备份文件,则它包含文件的最后稳定状态:如果文件存在,则必须将其删除,并且必须将备份重命名为正常名称
于 2020-07-20T08:33:48.680 回答