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;
コードからstatvfs
POSIX構造を自分で作成した構造にコピーしますが、重要な部分は124-126
それらが何をするのかを示しています。f_frsize
if は 0 ではなく、そうでなければ using ですf_bsize
。
df
私の提案は、野生でそして時間の経過とともに非常に広範な展開が観察されたので、彼らのアプローチを複製することです。誰かがそれが間違っている場合は指摘してください。今は間違った値を報告しています。
また、最新のファイルシステムは、ファイルシステムの使い方についてやや曖昧なアイデアを持っていることも知っておく必要があります。btrfs
参照リンクのレプリカ、クォータ、およびスナップショットはもはや正確な絶対値を提供しないと思いました。このステップでは、これをルールではなく例外と見なしたいかもしれませんが、知っておくべきことです。
答え2
Googleはあなたの親友です。結果「f_frsizeとf_bsizeの違い」
=> "ブロックサイズが8KBで、そのブロックに1KBファイルを書き込もうとすると、最終的に7KBのブロックスペースを無駄にすることになります。ところで最近、ファイルブロックの断片化を発見しました。 1KBのファイルは1つの部分だけで埋められ、残りの7つの部分は他のファイルに使用されるため、ブロックスペースを節約できます。
質問に対する答えはf_bsizeを使うことです。