du
の出力がdu -b
と非常に異なることが多いのはなぜですか? -b
は--apparent-size --block-size=1
の省略形です。 --apparent-size
を使用するだけで、ほとんどの場合同じ結果が得られますが、--block-size=1
でうまくいくようです。その場合でも出力は正しいのだろうか、そしてどの番号が欲しいのか? (つまり、別のストレージデバイスにコピーされた場合の実際のファイルサイズ)
見かけのサイズは、アプリケーションがファイル内にあると考えるバイト数です。これは、FTPまたはHTTPを介してファイルを送信することを決定した場合に、ネットワークを介して転送されるデータの量です(プロトコルヘッダーはカウントされません)。これは、cat theFile | wc -c
の結果であり、mmap
を使用してすべてをロードした場合にファイルが占めるアドレス空間の量でもあります。
ディスク使用量は、ファイルがそのスペースを占有しているために、他の目的に使用できないスペースの量です。
ほとんどの場合、ディスク使用量はファイルの最後の(部分的な)ブロックのフルサイズをカウントし、見かけのサイズはその最後のブロックにあるデータのみをカウントするため、見かけのサイズはディスク使用量よりも小さくなります。ただし、スパースファイルがある場合、見かけのサイズは大きくなります(スパースファイルは、ファイルの終わりを超えてどこかを探し、そこに何かを書き込むと作成されます-OSは、ゼロで埋められたブロックをたくさん作成する必要はありません- -書き込みを決定したファイルの部分のブロックのみを作成します)。
(たとえば)du -bm
とdu -m
を比較します。
-b
は--apparent-size --block-size=1
を設定しますが、m
はブロックサイズを1M
にオーバーライドします。
-bh
と-h
の場合も同様です。-bh
は--apparent-size --block-size=1 --human-readable
を意味し、h
はそのブロックサイズを上書きします。
デフォルトでは、duはファイルサイズと同じかそれ以上のディスク使用量を提供するためです。 --apparent-sizeで述べたように
print apparent sizes, rather than disk usage; although the apparent size is usually smaller, it may be
larger due to holes in (`sparse') files, internal fragmentation, indirect blocks, and the like
ファイルとフォルダには、実際のサイズとディスク上のサイズがあります
--apparent-sizeは、ファイルまたはフォルダーの実際のサイズです
ディスク上のサイズは、ファイルまたはフォルダーがディスク上で使用するバイト数です。 duだけを使用する場合も同じです
見かけのサイズがほとんどの場合、ディスク使用量よりも数桁大きいことに遭遇した場合は、内部フラグメンテーションまたは間接ブロックを含むファイルの(「スパース」)ファイルが多数あることを意味します。
最小ブロック粒度の例
少し遊んで、何が起こっているのか見てみましょう。
mount
は、/
にマウントされたext4パーティションにいることを示しています。
ブロックサイズを見つけました with:
stat -fc %s .
これは:
4096
それでは、サイズが1 4095 4096 4097
のファイルをいくつか作成しましょう。
#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
dd if=/dev/zero of=f bs=1 count="${size}" status=none
echo "size ${size}"
echo "real $(du --block-size=1 f)"
echo "apparent $(du --block-size=1 --apparent-size f)"
echo
done
結果は次のとおりです。
size 1
real 4096 f
apparent 1 f
size 4095
real 4096 f
apparent 4095 f
size 4096
real 4096 f
apparent 4096 f
size 4097
real 8192 f
apparent 4097 f
したがって、4096
以下のものは実際には4096
バイトを占めることがわかります。
次に、4097
を通過するとすぐに、8192
になります。これは2 * 4096
です。
その場合、ディスクは常に4096
バイトのブロック境界にデータを格納することは明らかです。
スパースファイルはどうなりますか?
正確な表現が何であるかを調査していませんが、--apparent
がそれを考慮に入れていることは明らかです。
これにより、見かけのサイズが実際のディスク使用量よりも大きくなる可能性があります。
例えば:
dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f
与える:
8192 f
1073741825 f
関連: スパースファイルがサポートされているかどうかをテストする方法
小さなファイルをたくさん保存したい場合はどうすればよいですか?
いくつかの可能性は次のとおりです。
参考文献:
Ubuntu16.04でテスト済み。