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
。