2017-03-17 14 views
0

最近、ext4ファイルシステムの適切な使用法をテストしています。私の専門家は何ですか:ext4とfallocateの使い方

システムがクラッシュしたとき、データは書戻しOKでしたが、損失はできませんでしたが、メタデートできます。
私の使用法は次のとおりです。 fallocate(fd、0、0、4 * 1024 * 1024); // 4MB
2. fsync(fd)を呼び出すと、データとメタデータをディスクに書き込むことができます。
3.関数を呼び出して4kサイズのファイルをランダムに書き出します。 O_DRICTフラグ付きで、fsyncは呼び出さない。私は返信をOKでログに記録します。
4.ログに記録されたオフセットを確認します。しかし、私はいくつかのオフセットでは、4kのデータを読み取る、0です。オフセットは、ホールファイルのように使用されていないようです。

私の質問は、ということです。
< 1.なぜfallocateを呼び出して、ファイルのメタデータにfsyncはまだ は、いくつかのブロックを示しているようだ後に使用するので、それはnullを返し読んだときにされていません。それは私の理解です。
< 2.他のAPIを呼び出して、ファイルが空でないスペースを割り当てることができます。その後、O_DIRECTを使用してデータを書き込むと、システムがクラッシュしてもデータが失われないことを確認できます。

Thanks. 

答えて

0

ファイルスペースに書き込むだけで、その穴が削除されます。書くことなく、汚れたページはなく、fsyncは単純に何もしません。

私はあなたにステップ4をどのように実行したのだろうと思います。手動クラッシュで行ったようですね。クラッシュなしで書き込みを行った後に読み込んだ場合は、ゼロ以外の値を書いていれば、ゼロであってはなりません。クラッシュ後にそれを読み取ると、ディスクキャッシュが存在するとゼロが発生する可能性があります。しかし、この種のゼロはホールのようなものではなく、ディスクからゼロを読み込んでいます(おそらくディスクにはゼロが含まれている可能性があります)。

関連する問題