いくつかの異なるディスク使用量値をpydf
使用して、この現象を複数回確認しました。df
たとえば、
$ df -h | grep sdb1
/dev/sdb1 11T 9.6T 705G 94% /mnt/disk
$ pydf | grep sdb1
/dev/sdb1 11T 10T 704G 88.6 [############.] /mnt/disk
pydf
10TB/88.6% 使用済みと表示され、df -h
9.6TB/94% 使用済みと表示されます。
インデックスノードを追加しても、以下がpydf -i
表示されます。
$ pydf -i | grep sdb1
/dev/sdb1 349M 205k 349M 0.1 [.............] /mnt/disk
どうやら0.4TBというディスク容量を余裕があるには、ディスク容量が小さすぎるようです。
注 - 違い使用可能なディスク容量がありません。pydf
- これは「ライブ」システムなので、コマンド間で使用可能なディスク容量がわずかに変更されます(704 GB対705 GB)。 - アイドルシステムで実行してKBを使用すると同じ数ですdf
。
誰でも違いを説明できますか?
この例はDebian Linux 10のものですが、他のシステムでも見たことがあります。
追加情報:
ブロックサイズは4096バイトで、ブロックサイズを強制的に適用すると、比較は次のようになります(「列」と一致するように編集されます)。
$ (df --block-size=4096 && pydf --blocks) | grep sdb1
/dev/sdb1 2906334056 2568838216 191006112 94% /mnt/disk
/dev/sdb1 2906334056 2568838332 191005996 88.4 [#######.] /mnt/disk
また、「ライブシステム」なので値が少し異なりますが、そのためには値(百分率を除く)を同じに呼んでも大丈夫だと思います。
そのファイルシステムの内容は基本的にDVR(Digital Video Recorder)データディスクなので、ほとんど50〜300 MBの大容量ビデオクリップがあり、他の(より小さい)ファイルはほとんどありません。
答え1
df(1)
マニュアルページから次の内容を読むことができます。
値はブロックあたり512バイトの数で表されます。
したがって、1つの結論はdf
塊で測定することであり、他のツールは別のものとして測定することです。どちらのツールも、ファイルサイズに関する情報を取得するために任意の形式のstat
呼び出し(おそらく)を使用できます。lstat
stat(2)
struct stat {
...
off_t st_size; /* file size, in bytes */
blkcnt_t st_blocks; /* blocks allocated for file */
ファイルサイズはバイト単位で測定され、ファイルに割り当てられたブロックの数です。これはテストを提案できます。 1バイトを含むファイルのst_sizeとst_blocksは何ですか?
#include <sys/stat.h>
#include <stdio.h>
int main(void) {
struct stat buf;
stat("file", &buf);
printf("size\t%lld\nblocks\t%lld\n", buf.st_size, buf.st_blocks);
return 0;
}
スクリプトはblocksize
適切なテストファイルにコンパイルされます。
$ make blocksize
cc -O2 -pipe -o blocksize blocksize.c
$ printf 1 > file
$ ./blocksize
size 1
blocks 4
1バイトファイルのサイズは1ですが、このシステムは4ブロックのスペースを消費することを示しています。ブロック数とブロックサイズは異なる場合がありますが、これはファイルサイズごとに計算するツール(st_size
)と使用されるファイルシステムブロック数を計算するツール()のst_blocks
違いを説明します。