statvfs を使用して、ファイルシステム全体のサイズと利用可能なサイズを取得します。

statvfs を使用して、ファイルシステム全体のサイズと利用可能なサイズを取得します。

statvfsの戻り値を使用して、合計ファイルシステムサイズと利用可能なファイルシステムサイズを取得したいと思います。

unsigned long  f_bsize;    /* Filesystem block size */
unsigned long  f_frsize;   /* Fragment size */
fsblkcnt_t     f_blocks;   /* Size of fs in f_frsize units */
fsblkcnt_t     f_bfree;    /* Number of free blocks */
...

源泉:https://man7.org/linux/man-pages/man3/statvfs.3.html

したがって、ファイルシステムの合計サイズを取得するには、f_blocks * f_frsizeコメントにf_blocks「単位」f_frsizeサイズと呼ばれるので、必要なようです。ただし、f_bfree使用可能なブロック数は次のとおりです。それでは、無料のファイルシステムサイズを使用するには使用する必要がありますかf_bsize、それともf_frsize再利用する必要がありますか?

答え1

ブロックの断片化は、いくつかの従来のファイルシステムのファイルシステム機能であるようです(Google検索によると、UFSとJFSがこの機能を使用していることがわかりました)。

スライスサイズは、スライスに許容される最小値を示すように見え、1からサイズでなければなりませんf_bsize

これをサポートしないファイルシステムでは、f_bsizeブロックの追加の断片化はサポートされていないため、この値は0(または0、以下を参照)に等しくなければなりません。

ソースコードを確認するとcoreutils(少なくともRedhatベースのシステムでは)GNUがどのように機能するかがわかりますdfしなければならないさまざまなUNIX(Linuxだけでなく)を使用してさまざまなPOSIXセマンティクスを処理するためにこの問題を解決する方法について、かなり確実なアドバイスを提供する必要があります。

存在するlib/fsusage.c

120       if (statvfs (file, &vfsd) < 0)
121         return -1;
122 
123       /* f_frsize isn't guaranteed to be supported.  */
124       fsp->fsu_blocksize = (vfsd.f_frsize
125                             ? PROPAGATE_ALL_ONES (vfsd.f_frsize)
126                             : PROPAGATE_ALL_ONES (vfsd.f_bsize));
127 
128       fsp->fsu_blocks = PROPAGATE_ALL_ONES (vfsd.f_blocks);
129       fsp->fsu_bfree = PROPAGATE_ALL_ONES (vfsd.f_bfree);
130       fsp->fsu_bavail = PROPAGATE_TOP_BIT (vfsd.f_bavail);
131       fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (vfsd.f_bavail) != 0;
132       fsp->fsu_files = PROPAGATE_ALL_ONES (vfsd.f_files);
133       fsp->fsu_ffree = PROPAGATE_ALL_ONES (vfsd.f_ffree);
134       return 0;

コードからstatvfsPOSIX構造を自分で作成した構造にコピーしますが、重要な部分は124-126それらが何をするのかを示しています。f_frsizeif は 0 ではなく、そうでなければ using ですf_bsize

df私の提案は、野生でそして時間の経過とともに非常に広範な展開が観察されたので、彼らのアプローチを複製することです。誰かがそれが間違っている場合は指摘してください。今は間違った値を報告しています。

また、最新のファイルシステムは、ファイルシステムの使い方についてやや曖昧なアイデアを持っていることも知っておく必要があります。btrfs参照リンクのレプリカ、クォータ、およびスナップショットはもはや正確な絶対値を提供しないと思いました。このステップでは、これをルールではなく例外と見なしたいかもしれませんが、知っておくべきことです。

答え2

Googleはあなたの親友です。結果「f_frsizeとf_bsizeの違い」
=> "ブロックサイズが8KBで、そのブロックに1KBファイルを書き込もうとすると、最終的に7KBのブロックスペースを無駄にすることになります。ところで最近、ファイルブロックの断片化を発見しました。 1KBのファイルは1つの部分だけで埋められ、残りの7つの部分は他のファイルに使用されるため、ブロックスペースを節約できます。
質問に対する答えはf_bsizeを使うことです。

関連情報