在某些文件系统上,创建文件时,不仅需要对文件本身调用 fsync(),还需要对父目录调用 fsync(),以使文件创建持久。否则,目录条目可能会在未干净卸载时丢失;文件 inode 将成为孤立文件。
对于 ext4 来说,这仍然正确吗,或者日志会处理这个问题吗?
许多应用程序(例如 vim,经 strace 验证)似乎只对文件调用 fsync。这样安全吗?
更新:在提交 14ece1028b3ed53ffec1b1213ffc6acaf79ad77c对于内核,ext4 进行了特别的修改,以便:禁用日记功能,在 fsync() 文件本身时,父目录条目会自动 fsync()。但是启用日志记录怎么办?目录 fsync() 是否隐式,因为它与创建新 inode 属于同一事务?
答案1
我会说“这取决于”部分原因,因为 ext4 可以改变其日志选项,以便记录整个文件或仅记录元数据,而这些是否立即提交部分取决于硬件配置。
如果 ext4 至少安装了元数据日志并且子系统没有缓存写入,我建议您不需要 fsync 目录。
需要注意的是,即使使用 fsync,POSIX 甚至 ext4 也无法保证文件在系统崩溃后还能存活。
虽然不是完整的回复,但相关博客文章详细阐述了日志和数据丢失问题。虽然不是最近的,但我相信它仍然代表了 ext4 的现状,他关于何时使用或不使用 fsync 的评论很有价值。