web-dev-qa-db-ja.com

`du`の出力が` du-b`と非常に異なることが多いのはなぜですか

duの出力がdu -bと非常に異なることが多いのはなぜですか? -b--apparent-size --block-size=1の省略形です。 --apparent-sizeを使用するだけで、ほとんどの場合同じ結果が得られますが、--block-size=1でうまくいくようです。その場合でも出力は正しいのだろうか、そしてどの番号が欲しいのか? (つまり、別のストレージデバイスにコピーされた場合の実際のファイルサイズ)

28
knittl

見かけのサイズは、アプリケーションがファイル内にあると考えるバイト数です。これは、FTPまたはHTTPを介してファイルを送信することを決定した場合に、ネットワークを介して転送されるデータの量です(プロトコルヘッダーはカウントされません)。これは、cat theFile | wc -cの結果であり、mmapを使用してすべてをロードした場合にファイルが占めるアドレス空間の量でもあります。

ディスク使用量は、ファイルがそのスペースを占有しているために、他の目的に使用できないスペースの量です。

ほとんどの場合、ディスク使用量はファイルの最後の(部分的な)ブロックのフルサイズをカウントし、見かけのサイズはその最後のブロックにあるデータのみをカウントするため、見かけのサイズはディスク使用量よりも小さくなります。ただし、スパースファイルがある場合、見かけのサイズは大きくなります(スパースファイルは、ファイルの終わりを超えてどこかを探し、そこに何かを書き込むと作成されます-OSは、ゼロで埋められたブロックをたくさん作成する必要はありません- -書き込みを決定したファイルの部分のブロックのみを作成します)。

26
Ken Bloom

(たとえば)du -bmdu -mを比較します。

-b--apparent-size --block-size=1を設定しますが、mはブロックサイズを1Mにオーバーライドします。

-bh-hの場合も同様です。-bh--apparent-size --block-size=1 --human-readableを意味し、hはそのブロックサイズを上書きします。

1

デフォルトでは、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
1
Brian Carlton

ファイルとフォルダには、実際のサイズとディスク上のサイズがあります

  • --apparent-sizeは、ファイルまたはフォルダーの実際のサイズです

  • ディスク上のサイズは、ファイルまたはフォルダーがディスク上で使用するバイト数です。 duだけを使用する場合も同じです

見かけのサイズがほとんどの場合、ディスク使用量よりも数桁大きいことに遭遇した場合は、内部フラグメンテーションまたは間接ブロックを含むファイルの(「スパース」)ファイルが多数あることを意味します。

1
hukko

最小ブロック粒度の例

少し遊んで、何が起こっているのか見てみましょう。

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でテスト済み。