GNU/Linux >> Linux の 問題 >  >> Linux

「du」の出力が「du -b」としばしば異なるのはなぜですか

比較 (例) du -bm du -m まで .

-b --apparent-size --block-size=1 を設定します 、しかしその後 m ブロックサイズをオーバーライドして 1M にします .

-bh と同様 対 -h :-bh --apparent-size --block-size=1 --human-readable を意味します 、そして再び h そのブロックサイズをオーバーライドします。


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

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

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


最小ブロック粒度の例

何が起こっているか見てみましょう。

mount / にマウントされた ext4 パーティションにいることがわかります .

そのブロックサイズは次のように見つけます:

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

関連:スパース ファイルがサポートされているかどうかをテストする方法

大量の小さなファイルを保存したい場合はどうすればよいですか?

いくつかの可能性は次のとおりです:

  • ファイル システムの代わりにデータベースを使用する:データベース vs ファイル システム ストレージ
  • ブロックのサブアロケーションをサポートするファイル システムを使用する

参考文献:

  • https://serverfault.com/questions/565966/which-block-sizes-for-millions-of-small-files
  • https://askubuntu.com/questions/641900/how-file-system-block-size-works

Ubuntu 16.04 でテスト済み。


Linux
  1. 標準出力からの出力の最後の 4 文字を取得する

  2. スワップ パーティションのサイズを RAM サイズの 2 倍にする必要があるのはなぜですか?

  3. free からの出力の buffers 列は何ですか?

  1. MacからLinuxに切り替えた理由

  2. 「sudo」パスワードが「su root」パスワードと異なるのはなぜですか

  3. openssl passwd の出力が毎回異なるのはなぜですか?

  1. Grep – GrepパターンのブラケットがPs結果からGrepプロセスを削除するのはなぜですか?

  2. Grub2のコマンドからの出力に等しい変数を設定するにはどうすればよいですか?

  3. Grep-o-wでMacOsXで期待される出力が得られないのはなぜですか?