ディレクトリの合計サイズをカウントする方法と、ディレクトリのコピー間で `du` 出力が異なるのはなぜですか?

ディレクトリの合計サイズをカウントする方法と、ディレクトリのコピー間で `du` 出力が異なるのはなぜですか?

なぜなら、明らかにここで何かが欠けているからです:

 $ cp -a CENTOS-chroot 1
 $ cp -a CENTOS-chroot 2
 $ cp -a CENTOS-chroot 3
 $ cp -a CENTOS-chroot 4
 $ du --block-size=1 -s 1 2 3 4
6320304128  1
6320304128  2
6320234496  3
6320238592  4

これは、私が所有する 2 台の Linux マシン (Manjaro と Centos7) 上の ext4 を使用した HDD と NVME SSD の両方で発生します。

答え1

ディスク使用量はdu、見かけ上の「ファイルサイズ「レベル…参照--apparent-size。」

--apparent-size

ディスク使用量ではなく、見かけのサイズを出力します。見かけのサイズは通常は小さくなりますが、(「スパース」) ファイルの穴、内部の断片化、間接ブロックなどにより大きくなる場合があります。

も参照してください-b。これは、与えるよりも良い選択肢かもしれません--block-size=1 そして --apparent-size一緒に:

-b--bytes

に相当--apparent-size --block-size=1

...それで、du -bs ${dir}より良い結果が得られるのでしょうか?


ほとんど/すべてのファイルシステムが固定サイズのブロックに基づいていることを考えると、一見「ファイルサイズ「(つまり、ファイルから読み取ることができるバイト数)は、ディスク上で実際に使用されるスペース(つまり、このファイルとそのメタデータを保存するために消費されるバイト数)とは異なります。」

例えば:

  • 小さなファイルは通常、実際のサイズよりも多くのスペースを使用します。すべき「... 4KiB ブロックのファイルシステムでは、たとえ 1 バイトしか保存していない場合でも、ファイルが 4KiB 未満のディスク領域を使用することはできません。
  • 大きなファイルは、通常、複数の「範囲「...エクステントは、ファイルの一部分のデータの配置場所を記述します。エクステントもディスク領域を消費します。
    • 断片化のないファイルシステム(つまり、未使用のスペースの大きなギャップ)では、「大きい「エクステントが 1 つだけのファイルです。」
    • 断片化が激しいファイルシステム(つまり、あちこちに大量のデータがあり、データ間に小さなギャップがある)では、同じ「大きい「ファイルには、実際には、データが保存されている場所を示すために使用される複数のエクステントが含まれる場合があります。

これは、ファイルがディスク上に配置した順序と、連続した空き領域のブロックを探すために使用されるアルゴリズムに完全に依存します。

テトリスボードを上手にプレイした時のように、すべてのファイルを連続的かつ慎重に再配置し、完璧にテッセレーションする、非常にスペース効率の高いファイルシステムを構築できます。ファイルシステムは適切なスペースの検索に多くの時間を費やすことになり、パフォーマンスが大幅に低下します。

同様に、最初の未使用ブロックのみを使用し、使用済みブロックをスキップする、非常に断片化指向のファイルシステムを持つこともできます。最初のギャップに基づいてデータを書き込むと、パフォーマンスも大幅に低下します。

代わりに、私たちはバランスをとることを好みます。いくつかの時間 (しかしあまりありません) を使用して、書き込もうとしているデータ全体を格納する未使用領域の連続ブロックを探します。

ファイルの断片化レベルは、コピーコマンドが発行された順序に直接結びついているわけではありません。その理由の1つは、「努力するが、頑張りすぎない「上記で概説したアプローチ」


まとめると、これら2つのディレクトリに保存されるデータは同じであるはずですが、ディスク使用量(同じデータ) が完全に一致する可能性は低いです。

保存されたデータが同じであることを確認するためのオプションはいくつかあります。試してみてくださいdiff(出力がなくても問題ありません。変更が報告されます)。

diff -qr "${src}" "${dst}"

さらに複雑なことに、スパースファイルでは大幅予想より少ない:

$ truncate -s 100M x
$ ls -l x
-rw-r--r-- 1 attie attie 104857600 Jul 14 17:15 x
$ du --block-size 1 x
0       x
$ du -bs x
104857600       x

答え2

ext4 ファイル システムのブロックとエクステントのレイアウトは、ファイル システムの充填率と断片化に依存します。

これは、より多くのファイルを持つファイル システムでは、空のファイル システムの場合よりも、追加ファイル用に使用されるスペースが (わずかに) 異なる可能性があることを意味します。この場合、4 番目のコピーは 1 番目のコピーよりも多くのスペースを占有します。

関連情報