确保 Linux ext4 文件系统上文件写入的完整性

问题描述 投票:0回答:1

我们的(嵌入式)Linux 系统有一个 ext4 文件系统。现在,我们的应用程序之一需要使用简单的文件写入 API 来修改数据文件。那里的要求是文件更新应该是原子的 - 不是从不同应用程序并行写入的意义上(我们没有),而是在电源故障的情况下每个写入不能部分执行的意义上- 它可以完全执行,也可以不执行。这有保证吗?我知道由于缓存,文件写入可能不会立即执行,但我不确定这些写入是否可以被缓存以可能成为部分的方式分割,因此我的问题。

我也可以使用复制-写入-重命名方法将原始文件复制到临时文件,在那里进行更改,然后将文件重命名回原始文件,这取决于重命名操作的原子性质。但即便如此,我也不确定这些操作是否能保证按照我想要的方式排序(尤其是写入和重命名)。

linux filesystems atomic ext4
1个回答
1
投票

可能会使用(在用户模式应用程序中)sync(2)系统调用。在此之前,如果使用 stdio

,请使用 
fflush(3)

为了确保原子性,您可能需要使用Frama-CBismonDECODER项目等静态分析工具检查大量代码(甚至可能在内核内部)。当然,这是非常昂贵的。请注意赖斯定理

在内核(或硬件)级别,无法保证原子性:例如,(由您的应用程序)成功的 write(2) 系统调用(由您的应用程序)很可能涉及(在连接到您的硬盘的 SATA 电缆上)磁盘)许多帧或数据包。如果断电,数据将会丢失。

不要忘记 Linux kernelGNU libc 是开源的。您可以研究他们的源代码并改进它们。

还可以考虑硬件方法:添加一些UPS

另一种可能性是扩展你的 C 编译器,例如编写您的 GCC 插件,以半自动添加对 sync(2)

的调用

另一种可能性是生成您的C代码(例如使用RefPerSysGPP或您自己的C代码生成器)。雅克·皮特拉 (Jacques Pitrat) 的最后一本书人工智能,有意识机器的良心详细解释了如何做到这一点。

另请参阅我的

sync-periodically.c
程序(GPLv3+ 许可;因此没有保修)。

您还可以改进一些生成 C 的开源编译器(如 Bigloo),以在合适的位置发出对 sync(2) 的调用。

PS。如果您的嵌入式软件是多线程的(使用多个 pthread 或进程),或者您的硬件有几个磁盘或 SSD,或者位于太空(宇宙射线?)或核电站内部(放射性? )

© www.soinside.com 2019 - 2024. All rights reserved.