一部のファイルシステムでは、ファイルを作成するときに、ファイル自体だけでなく親ディレクトリでも fsync() を呼び出して、ファイルの作成を永続的にする必要があります。そうしないと、ディレクトリ エントリが不正なアンマウントによって失われ、ファイルの inode が孤立する可能性があります。
ext4 でも同じですか、それともジャーナルがそれを処理しますか?
多くのアプリケーション (例: strace で検証された vim) は、ファイルに対してのみ fsync を呼び出すようです。これは安全ですか?
更新:コミット 14ece1028b3ed53ffec1b1213ffc6acaf79ad77cカーネルでは、ext4が特に変更され、ジャーナリングを無効にした場合、ファイル自体を fsync() すると、親ディレクトリ エントリは自動的に fsync() されます。しかし、ジャーナリングが有効になっている場合はどうでしょうか? ディレクトリ fsync() は、新しい inode の作成と同じトランザクションの一部であるため、暗黙的に実行されますか?
答え1
部分的には「場合による」と言うのは、ext4 ではジャーナル オプションを変更してファイル全体またはメタデータのみをログに記録できるため、これらがすぐにコミットされるかどうかはハードウェア構成に部分的に依存するからです。
ext4 が少なくともメタデータジャーナリング付きでマウントされており、サブシステムが書き込みをキャッシュしていない場合は、ディレクトリを fsync する必要はないと思います。
POSIX や ext4 では、fsync を使用してもシステムがクラッシュしてもファイルが存続するという保証はないことにも注意してください。
完全な回答ではありませんが、問題のブログ投稿ではジャーナリングとデータ損失の問題について詳しく説明しています。最近のものではありませんが、それでも現在の ext4 の状況を反映するもので、fsync を使用するタイミングと使用しないタイミングに関する彼のコメントには価値があると思います。