"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。違うものを測るから大丈夫です。

クラウドベースのファイルシステムがあり、ストレージのコストだけでなくデータをダウンロードするたびに支払われているため、「このツリーがディスク容量をどのくらい使用しているか」などの一般的な管理活動にアクセスするデータ量を最小限に抑える必要があります。 ?

使用されているブロックの数を知らせるライブラリ/システムコールはありませんが、おそらく1つはあります。私はduそれがゼロでいっぱいのファイルと本当にまれなファイルを区別することができないので、それが考慮されているすべてのファイルを読むと信じていません。

では、du使用されるブロック数はどのように計算されますか?

答え1

du使用stat(2)ファイルが使用するブロック数を探します。実行すると、stat bigブロック数が与えられた数と一致することがわかりますdu

duこのオプションを使用してバイト数を強制的に計算する-bと、出力はlsと一致します。

どちらの場合も、以下を使用します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

関連情報