【发布时间】:2021-12-16 06:07:25
【问题描述】:
我们的(嵌入式)Linux 系统有一个 ext4 文件系统。现在,我们的其中一个应用程序需要使用简单的文件写入 API 修改数据文件。那里的要求是文件更新应该是原子的 - 不是来自不同应用程序的并行写入(我们没有那个),而是在断电的情况下每个写入都不能部分执行的意义上- 它可以完全执行,也可以不执行。这是有保证的吗?我知道文件写入可能不会因为缓存而立即执行,但我不确定这些写入是否可以被缓存分割成部分的方式,因此我的问题是。
我也可以使用 copy-write-rename 方法将原始文件复制到临时文件,在那里进行更改,然后将文件重命名回原始文件,这取决于重命名操作的原子性质。但即便如此,我也不确定这些操作能否保证按照我想要的方式进行排序(尤其是写入和重命名)。
【问题讨论】:
-
数据丢失时会发生什么。嵌入式系统对生命至关重要(例如某些医院设备?)
-
数据丢失时(在现实世界中)会发生什么?您的嵌入式系统是消费级吸尘器(数据丢失很烦人,但并不重要)还是神经外科机器人((数据丢失会导致人员死亡)?
-
那里的数据丢失并不重要。产品有点像路由器。
-
请编辑您的问题以改进它。我觉得我的回答很中肯。随意点赞。但是你想要一个保证,你不能得到它。与您的老板或客户讨论。考虑改进硬件或降低规格。
-
AFAIK 是的,写入可以是非原子的。例如,假设您的写入跨越页面缓存中的两个页面。期望内核记住它们必须一起刷新或以特定顺序刷新是不合理的。如果硬件一次只能写出一页或一个扇区,那么刷新甚至可能是不可能的。几乎确定磁盘上内容的唯一方法是使用
fsync。
标签: linux filesystems atomic ext4