Linux是否保证在close()之后文件的内容被刷新到光盘?

时间:2009-04-01 13:21:43

标签: linux file-io filesystems

当使用close()fclose()(例如)关闭文件时,Linux是否保证将文件写回(持久)光盘?

我的意思是,如果close()返回0然后立即断电,以前写的数据是否保证会持续存在,即是否持久?

fsync()系统调用确实提供了此保证。关闭文件也足够了吗?

我找不到任何以此方式提出任何要求的方式。


问题2:

如果close()隐含地执行了fsync(),是否有办法告诉它不要?

9 个答案:

答案 0 :(得分:33)

来自“man 2 close”:

  

成功关闭并不能保证数据已经存在   成功保存到磁盘,如   内核延迟写作。

手册页说如果你想确保你的数据在磁盘上,你必须自己使用fsync()。

答案 1 :(得分:11)

不,关闭执行 fsync(2)并且如果这样做会打击许多机器死亡。许多中间文件由其创建者打开和关闭,然后由其消费者打开和关闭,然后删除,如果 close(2)执行自动,这个非常常见的序列将需要触摸磁盘FSYNC(2)的。相反,通常不会触摸磁盘,磁盘永远不会知道该文件存在。

答案 2 :(得分:9)

同样重要的是要注意fsync不保证文件在磁盘上;它只是保证操作系统已经要求文件系统刷新磁盘更改。文件系统不必将任何内容写入磁盘

来自man 3 fsync

  

如果未定义_POSIX_SYNCHRONIZED_IO,则措辞严重依赖   在一致性文档上告诉用户可以期待什么   来自系统。明确意图是null实现   是允许的。

幸运的是,Linux的所有常见文件系统确实会将更改写入磁盘;不幸的是,仍然不能保证文件在磁盘上。许多硬盘驱动器都打开了写入缓冲(因此有自己的缓冲区,fsync不会刷新)。还有一些drives/raid controllers even lie to you关于冲洗他们的缓冲区。

答案 3 :(得分:6)

没有。 fclose()并不意味着fsync()。许多Linux文件系统会延迟写入和批量处理,从而提高整体性能,可能会减少磁盘驱动器的磨损,并缩短笔记本电脑的电池寿命。如果操作系统必须在文件关闭时写入磁盘,那么许多这些好处都将丢失。

保罗·汤姆林(Pau​​l Tomblin)在他的回答中提到了一个争议,解释我所看到的那个不适合评论。这就是我所听到的:

最近的争议是关于ext4的排序(ext4是流行的ext3 Linux文件系统的拟议继承者)。在Linux和Unix系统中,通常通过读取旧文件,使用不同的名称写出新文件并将新文件重命名为旧文件来更改重要文件。这个想法是确保新的或旧的,即使系统在某些时候失败。不幸的是,ext4似乎很乐意阅读旧版本,将新版本重命名为旧版本,然后编写新版本,如果系统在步骤2和3之间出现故障,这可能是一个真正的问题。

处理此问题的标准方法当然是fsync(),但这会破坏性能。真正的解决方案是修改ext4以保持ext3顺序,在完成写入文件之前,它不会重命名文件。显然这不是标准所涵盖的,所以这是一个实现质量问题,而ext4的QoI在这里真的很糟糕,没有办法在不经常调用fsync()的情况下可靠地编写新版本的配置文件,并且存在所有问题导致或冒失去两个版本的风险。

答案 4 :(得分:3)

不,这不保证。操作系统有自己的缓存。所有关闭真正保证的是程序缓冲区被刷新到操作系统,但操作系统可能仍然保持不成文。我相信在Linux内核世界中存在一些争议,因为即使fsync也不能保证它被刷新到磁盘,至少在ext3中。

答案 5 :(得分:2)

打开的联机帮助页说:

  

为了保证同步I / O,除了 O_DIRECT 之外,还必须使用 O_SYNC

那个

  

通常,此(O_DIRECT)会降低性能。

可以使用 fcntl F_SETFL 切换此标记,以便最小化I / O 的缓存效果,以便每次读取和写入后。

答案 6 :(得分:1)

您可能也对firebird sql数据库中关于fcntl(O_SYNC)无法在linux上工作的bug report感兴趣。

此外,您提出的问题意味着潜在的问题。写入磁盘是什么意思?为什么这有关系?您是否担心电源耗尽且驱动器中的文件丢失?为什么不在系统或SAN上使用UPS?

在这种情况下,您需要一个日记文件系统 - 而不仅仅是元数据日记文件系统,而是所有数据的完整日志。

即使在这种情况下你也必须明白,除了O / S的内容之外,most hard disks lie to you about doing an fsync. - fsync只是将数据发送到驱动器,由各个操作系统决定如何等待驱动器刷新自己的缓存。

- jeffk ++

答案 7 :(得分:0)

我不认为Linux可以保证这一点,因为驱动器本身也可以缓存数据。

答案 8 :(得分:-3)

如果计算机/操作系统具有容错文件系统,我们就不必关心这一点,该文件系统可以保证写入能够在电源循环中存活的内容至少为我们设置此约束的文件。如果存在一些非易失性RAM或等效的RAM,则不必是磁盘。我朦胧地记得的一些过去时代的大型机确实有这样的机制,据说确实做出了这样的保证。