`du` は使用されたブロックをどのようにカウントするのか

`du` は使用されたブロックをどのようにカウントするのか

duファイル内で使用されるブロックの数がどのようにカウントされるかを理解したいです。

シナリオ

dd bs=1 seek=2GiB if=/dev/null of=big
0+0 records in
0+0 records out
0 bytes (0 B) copied, 2.3324e-05 s, 0.0 kB/s

ls -lh big
-rw-r--r-- 1 roaima roaima 2.0G May 19 15:55 big

du -h big
0       big

私は、 に対する答えが異なることを常に受け​​入れてきましたls。異なるものを測定しているので、それは問題ありません。

現在、私はクラウドベースのファイルシステムを使用しており、ストレージだけでなくデータをダウンロードするたびに料金が発生するため、「このツリーではどのくらいのディスク容量が使用されているか」などの一般的なハウスキーピングアクティビティによってアクセスされるデータの量を最小限に抑える必要があります。

使用済みブロックの数を教えてくれるライブラリ/システム コールは知りませんが、簡単に存在する可能性があります。duゼロで埋められたファイルと本当にスパースなファイルを区別しないため、検討中のすべてのファイルを読み取ることはないと思います。

では、du使用されたブロックはどのようにカウントされるのでしょうか?

答え1

du用途stat(2)ファイルで使用されているブロックの数を調べます。 を実行すると、stat bigブロック数が で指定された数と一致することがわかりますdu

duオプションを使用して強制的にバイト数をカウントすることができ-b、その出力はls's と一致します。

どちらの場合も、stat(2)次のように使用します (少なくともfstatat(2)私が持っているバージョンでは)。

$ strace du big|&grep big
execve("/usr/bin/du", ["du", "big"], [/* 57 vars */]) = 0
newfstatat(AT_FDCWD, "big", {st_mode=S_IFREG|0644, st_size=2147483648, ...}, AT_SYMLINK_NOFOLLOW) = 0
write(1, "0\tbig\n", 60 big

処理の違いは見えるdu.c

関連情報