ディスク使用量を測定するさまざまな方法があるのはなぜですか?


114

ファイルのサイズを合計すると、1つの図が表示されます。実行するとdu、別の図が表示されます。duパーティション上のすべてのファイルで実行すると、使用されているdfクレームと一致しません。ファイルの合計サイズにさまざまな数値があるのはなぜですか?コンピューターを追加できませんか?

追加といえば、の「使用済み」列と「使用可能」列を追加するとdf、合計の数値が得られません。そして、その合計値はパーティションのサイズよりも小さくなっています。パーティションサイズを合計しても、ディスクサイズは取得できません。何が得られますか?

回答:


144

数字の加算は簡単です。問題は、追加する多くの異なる番号があることです。

ファイルはどのくらいのディスク容量を使用しますか?

基本的な考え方は、nバイトを含むファイルはnバイトのディスク領域に加えて、ファイルのメタデータ(アクセス許可、タイムスタンプなど)、およびシステムが必要とする情報のオーバーヘッドのビットなどの制御情報のビットを使用することです。ファイルが保存されている場所を見つけます。しかし、多くの合併症があります。

顕微鏡的合併症

各ファイルを図書館の一連の本と考えてください。小さなファイルは1つのボリュームのみを構成しますが、大きなファイルは百科事典のように多くのボリュームで構成されます。ファイルを見つけることができるように、すべてのボリュームを参照するカードカタログがあります。各ボリュームには、カバーのために少しオーバーヘッドがあります。ファイルが非常に小さい場合、このオーバーヘッドは比較的大きくなります。また、カードカタログ自体がいくらかのスペースを占有します。

もう少し技術的に言えば、典型的な単純なファイルシステムでは、スペースはブロックに分割されます。典型的なブロックサイズは4KiBです。各ファイルは整数個のブロックを占有します。ファイルサイズがブロックサイズの倍数でない限り、最後のブロックは部分的にしか使用されません。したがって、1バイトのファイルと4096バイトのファイルは両方とも1ブロックを占有しますが、4097バイトのファイルは2ブロックを占有します。これはduコマンドで確認できます。ファイルシステムのブロックサイズduが4KiBの場合、1バイトファイルの4KiBが報告されます。

ファイルが大きい場合、ファイルを構成するブロックのリストを保存するためだけに追加のブロックが必要です(これらは間接ブロックです。より洗練されたファイルシステムは、エクステントの形でこれを最適化できます)。ls -lまたはGNU によって報告されたファイルサイズには表示されませんdu --apparent-sizedu、サイズではなくディスク使用量を報告するが、それらを考慮します。

一部のファイルシステムは、最後のブロックに残った空きスペースを再利用して、同じブロックに複数のファイルテールパックしようとします。一部のファイルシステム(Linux 3.8以降のext4など)は、iノードに完全に収まる小さなファイル(わずか数バイト)に0ブロックを使用します。

肉眼的合併症

一般に、上記のように、レポートされる合計サイズduは、ファイルで使用されるブロックまたはエクステントのサイズの合計です。

duファイルが圧縮されている場合、レポートされるサイズは小さくなる可能性があります。Unixシステムは従来、粗い形式の圧縮をサポートしています。ファイルブロックにnullバイトのみが含まれる場合、ゼロのブロックを格納する代わりに、ファイルシステムはそのブロックを完全に省略できます。このようなブロックが省略されたファイルは、スパースファイルと呼ばれます。ファイルに大量のヌルバイトが含まれている場合、スパースファイルは自動的に作成されません。アプリケーションは、ファイルがスパースになるように調整する必要があります。

btrfszfsなどの一部のファイルシステムは、汎用圧縮をサポートしています。

高度な合併症

zfsやbtrfsなどの非常に現代的なファイルシステムの2つの主要な機能により、ファイルサイズとディスク使用量との関係は、スナップショットと重複排除により大きく異なります。

スナップショットは、特定の日付におけるファイルシステムの凍結状態です。この機能をサポートするファイルシステムには、異なる日付に撮影された複数のスナップショットを含めることができます。もちろん、これらのスナップショットにはスペースが必要です。極端な場合、アクティブバージョンのファイルシステムからすべてのファイルを削除しても、スナップショットが残っていてもファイルシステムは空になりません。

スナップショット以降、または2つのスナップショット間で変更されていないファイルまたはブロックは、スナップショットとアクティブバージョンまたは他のスナップショットにまったく同じように存在します。これはcopy-on-writeを介して実装されます。エッジケースによっては、使用可能なスペースが不足しているため、ファイルシステム全体でファイルを削除できないことがあります。そのファイルを削除するには、ディレクトリ内にブロックのコピーを作成する必要があり、その1つのブロックでさえ余地がないためです。

重複排除は、同一ブロックの保存を回避することで構成されるストレージ最適化手法です。典型的なデータでは、重複を探すことは必ずしも努力する価値があるとは限りません。zfs btrfsは両方とも、オプション機能として重複排除をサポートしています。

du合計がファイルサイズの合計と異なるのはなぜですか?

上で見たように、du各ファイルについて報告されるサイズは通常、ファイルで使用されるブロックまたはエクステントのサイズの合計です。デフォルトでls -lは、サイズはバイト単位でリストされますが、duサイズはKiB、または従来のシステムでは512バイト単位(セクター)でリストされます(du -k強制的にキロバイトを使用します)。最新のユニックスは、K、M、Gなどを使用した「人間が読める」数値をサポートls -lhdu -h、使用するのに適切です(KiB、MiB、GiBの場合)。

duディレクトリで実行すると、ディレクトリ自体を含む、ディレクトリツリー内のすべてのファイルのディスク使用量が合計されます。ディレクトリにはデータ(ファイルの名前、およびファイルのメタデータがある場所へのポインター)が含まれているため、少しのストレージスペースが必要です。小さなディレクトリは1ブロックを占有し、大きなディレクトリはより多くのブロックを必要とします。ディレクトリで使用されるストレージの量は、ディレクトリに含まれるファイルだけでなく、挿入された順序と削除されるファイルの順序にも依存する場合があります(ファイルシステムによっては、ディスクスペースとパフォーマンスの妥協点となる場合があります) )、しかし違いはわずかです(あちこちに余分なブロックがあります)。走るときls -ld /some/directory、ディレクトリのサイズが一覧表示されます。(出力の上部にある「合計NNN」行ls -lは無関係な数値であり、リストされたアイテムのブロック内のサイズの合計であり、KiBまたはセクターで表されます。)

覚えておいてくださいdu含まれるドットファイルlsは、使用しない限り、表示されません-Aか、-aオプションを選択します。

du予想される合計よりも少ない場合があります。これは、ディレクトリツリー内にハードリンクがある場合に発生しduます。各ファイルを1回だけカウントします。

ZFSLinux などの一部のファイルシステムduでは、ファイルの拡張属性が占めるディスクスペース全体を報告しません。

ディレクトリの下にマウントポイントがある場合du-xオプションを指定しない限り、これらのマウントポイント上のすべてのファイルもカウントすることに注意してください。たとえば、ルートファイルシステム内のファイルの合計サイズが必要な場合はdu -x /、ではなくを実行しますdu /

ファイルシステムが空でないディレクトリマウントされている場合、そのディレクトリ内のファイルはマウントされたファイルシステムによって隠されます。彼らはまだ彼らのスペースを占有しますが、duそれらを見つけません。

削除されたファイル

ファイルが削除されると、これはディレクトリエントリのみを削除し、必ずしもファイル自体を削除するわけではありません。ファイルを実際に削除し、ディスクスペースを再利用するには、2つの条件が必要です。

  • ファイルのリンクカウントは0にする必要があります。ファイルに複数のハードリンクがある場合、1つを削除しても他のハードリンクには影響しません。
  • ファイルが何らかのプロセスで開かれている限り、データは残ります。すべてのプロセスがファイルを閉じた場合にのみ、ファイルが削除されます。出力fuser -mまたはlsofマウントポイントには、ファイルが削除された場合でも、そのファイルシステムでファイルが開かれているプロセスが含まれます。
  • 削除されたファイルを開いているプロセスがなくても、そのファイルがloopデバイスのバックエンドである場合、ファイルのスペースは再利用されません。losetup -a(as rootloopは、現在セットアップされているデバイスとファイルを示します。losetup -dディスクスペースを再利用するには、ループデバイスを(withで)破棄する必要があります。

一部のファイルマネージャーまたはGUI環境でファイルを削除すると、そのファイルはゴミ箱に置かれ、元に戻すことができます。ファイルの削除を取り消すことができる限り、そのスペースは引き続き消費されます。

これらの数字はdf正確に何ですか?

典型的なファイルシステムには以下が含まれます。

  • ファイル(ディレクトリを含む)データと一部のメタデータ(間接ブロック、一部のファイルシステムの拡張属性を含む)を含むブロック。
  • 無料ブロック。
  • rootユーザーに予約されているブロック。
  • スーパーブロックおよびその他の制御情報。
  • iノード
  • ジャーナル

によって報告されるのは最初の種類のみduです。になるとdf、「使用済み」、「使用可能」、および合計の列はファイルシステムに依存します(もちろん使用済みブロック(間接ブロックを含む)は常に「使用済み」列にあり、未使用ブロックは常に「使用可能」列)。

EXT2 / EXT3 / ext4のファイルシステムの中に予備ルートユーザに空間の5%。これは、ルートファイルシステムで役立ちます。システムがいっぱいになった場合でも動作を維持します(特にログ記録のため、およびシステム管理者が問題を修正しながら少しのデータを保存できるようにします)。のようなデータパーティションであっても/home、ほぼ満杯のファイルシステムは断片化の傾向があるため、その予約スペースを維持すると便利です。Linuxは、ファイルの書き込み時に多くの連続したブロックを事前に割り当てることで、断片化(特にハードディスクなどの回転する機械デバイスでのファイルアクセスを遅くする)を回避しようとしますが、連続したブロックがあまりない場合は機能しません。

btrfsではなくext4までの従来のファイルシステムは、ファイルシステムの作成時に一定数のiノードを予約します。これにより、ファイルシステムの設計が大幅に簡素化されますが、iノードの数を適切にサイズ設定する必要があるという欠点があります。iノードが多すぎると、スペースが無駄になります。iノードが少なすぎると、ファイルシステムはスペースが不足する前にiノードが不足する可能性があります。このコマンドdf -iは、使用中のiノードの数と使用可能なiノードの数を報告します(概念が適用されないファイルシステムは0を報告する場合があります)。

tune2fs -lext2 / ext3 / ext4ファイルシステムを含むボリュームで実行すると、空きiノードとブロックの総数と数などの統計情報が報告されます。

問題を混乱させる可能性のある別の機能は、サブボリュームですbtrfsおよびzfsで、名前がdatasetsでサポートされています)。複数のサブボリュームは同じスペースを共有しますが、個別のディレクトリツリールートがあります。

ファイルシステムがネットワーク(NFS、Sambaなど)経由でマウントされ、サーバーがそのファイルシステムの一部をエクスポートする場合(サーバーに/homeファイルシステムがあり、エクスポートする場合/home/bob)、dfクライアントではファイルシステム全体ではなく、ファイルシステム全体のデータを反映しますエクスポートされてクライアントにマウントされる部分のみ。

ディスク上のスペースは何を使用していますか?

上で見たように、によって報告される合計サイズdfは、ファイルシステムのすべての制御データを常に考慮するとは限りません。必要に応じて、ファイルシステム固有のツールを使用して、ファイルシステムの正確なサイズを取得します。たとえば、ext2 / ext3 / ext4を使用して実行tune2fs -lし、ブロックサイズにブロック数を掛けます。

ファイルシステムを作成すると、通常はそれが含まれるパーティションまたはボリュームの利用可能なスペースを埋めます。ファイルシステムを移動したり、ボリュームのサイズを変更したりすると、ファイルシステムが小さくなる場合があります。

Linuxでは、lsblk利用可能なストレージボリュームの概要がわかりやすく表示されます。追加情報については、または持っていない場合はlsblk、専用のボリューム管理ツールまたはパーティション分割ツールを使用して、所有しているパーティションを確認してください。Linuxでは、ありますlvsvgspvsのためのLVMfdisk(「MBR」)パーティション(だけでなく、最近のシステムでGPT)伝統的なPCスタイルのため、gdiskのGPTパーティション、disklabelBSDディスクラベルのため、Partedを、などは、Linuxの下では、cat /proc/partitions簡単な概要を提供します。通常のインストールには、オペレーティングシステムで使用される少なくとも2つのパーティションまたはボリュームがあります。ファイルシステム(場合によってはそれ以上)とスワップボリュームです。

一部のコンピューターには、BIOSまたは他の診断ソフトウェアを含むパーティションがありますUEFIを搭載したコンピューターには、専用のブートローダーパーティションがあります。

最後に、ほとんどのコンピュータープログラムは、1024 = 2 10の累乗に基づいた単位を使用していることに注意してください(プログラマーはバイナリと2の累乗を好むため)。したがって、1 kB = 1024 B、1 MB = 1048576 B、1 GB = 1073741824、1 TB = 1099511627776 B、…正式には、これらのユニットはkibibyte KiB、mebibyte MiBなどとして知られていますが、ほとんどのソフトウェアは単にkまたはkBを報告します。 MやMBなど。一方、ハードディスクメーカーは体系的にメトリック(1000ベースのユニット)を使用しています。そのため、1 TBのドライブは931 GiBまたは0.904 TiBのみです。


1
@Kiwyにtune2fsは、ファイルシステムを含むブロックデバイスへの読み取りアクセス権が必要です。これは、一般にルートである必要があります。これにより、任意のファイルのコンテンツを読み取ることができます。
ジル14年

21
SEでは「ありがとう」はお勧めできませんが、この素晴らしい投稿には大きな「ありがとう」が必要です。
dotancohen

1
6歳のときにカードカタログを見たのを覚えていますか
イズカタ

1
@illuminÉそれは私にとってはあまりにも高度なSolarisであり、どのレベルに適合するかはわかりません。
ジル14年

1
du ない間接ブロックのアカウントを。これが、で報告されているファイルサイズとの主な違いls -lです。
ステファンシャゼル

4

ファイルサイズとディスク領域の計算の複雑さの短い要約:

  • ファイルがディスク上で占有するスペースは、各ブロックのサイズに対する占有ブロック数+占有するiノード数の乗数です。1バイトのファイルには、少なくとも1つのブロック、1つのiノード、1つのディレクトリエントリが必要です。

    ただし、ファイルが別のファイルへのハードリンクである場合、追加のディレクトリエントリは1つだけで済みます。これは、同じブロックセットへの単なる別の参照になります。

  • ファイルの内容のサイズ。これがls表示されます。
  • 空きディスク容量は、収まる最大のファイルのサイズでも、ディスクに収まるすべてのファイルコンテンツサイズの合計でもありません。中間のどこかにあります。これは、ファイルの数(inodeを使用)、ブロックサイズ、および各ファイルのコンテンツがブロックを完全に埋める程度に依存します。

これはファイルシステムの表面をひっかいているだけであり、非常に単純化されています。また、異なるファイルシステムは異なる動作をすることを覚えておいてください。

statこの情報のいくつかを見つけるのに非常に役立ちます。statの使用方法とその用途の例を次に示します。http://landoflinux.com/linux_stat_command_examples.html


1
通常、1バイトのファイルは8ではなく1ブロックかかります。ハードリンクを作成してもiノードは作成されません。ファイルへのリンクの数に関係なく、1つのファイルは1つのiノードです。ハードリンクを作成するには、ディレクトリエントリ用のスペースのみが必要です。
ジル

訂正してくれたことに感謝します。確かに私の記憶の再:ext2の詳細な研究は今や少しあいまいです。私はstat reの出力を追跡していました:ブロック数-それは過剰に感じましたが、それはそこにあります。答えを訂正します。
ペドロ

1
これは、ext2ファイルシステムが4kBブロックを使用している場合、1 ext2ブロック= 8 statブロックであるためです。歴史的な理由により、statは512バイトブロックでカウントされます。参照してくださいunix.stackexchange.com/questions/14409/...
ジル・

3

私はここに原因別の例を示しますduと異なるがdf

dfファイルシステムに割り当てられたブロックをカウントし、du各ファイルのサイズ情報を使用します。違いには多くの原因があります。

1)アプリケーションによってまだ開いているリンクされていない(削除された)ファイル。ファイル情報が欠落していますが、ブロックはまだ割り当てられています。 lsof +aL1 <filesystem>プロセスを特定するのに役立ちます。ほとんどの場合、プロセスを強制終了してスペースを解放する必要があります(プロセスによって異なりますが、構成の再読み込みで十分な場合もあります)。

2)マウントポイントの下に隠されているduが隠されていないファイルdfdebugfsファイルシステムを読むのに役立ちます。

$ sudo debugfs 
debugfs 1.42.12 (29-Aug-2014)
debugfs:  open /dev/xxx    (the desired file system  device)
debugfs:  cd /boot
debugfs:  ls -l 
 1966081   40755 (2)      0      0    4096 26-May-2016 16:28 .
      2   40555 (2)      0      0    4096 11-May-2016 10:43 ..
 1974291  100644 (1)      0      0       0 26-May-2016 16:28 bob   <---<<< /boot/bob is hidden by /boot fs

3)現実よりも大きく見えるスパースファイル。割り当てられていないブロックはカウントされませんdfが、見かけのファイルサイズはカウントされduます。

ハードリンクはだまされないことに注意してください du


3

df一般に、ファイルシステムが何であるか、それぞれがどのくらいいっぱいで、どこにマウントされているかを確認するために使用されます。ファイルシステムのスペースが不足していて、ファイルシステム間での移動や、より大きなディスクの購入などを行う場合に非常に便利です。

du各ディレクトリが消費している累積ストレージの詳細を表示します(windirstatWindows のようなもの)。ファイルのクリーンアップを試みるときに、スペースを占有している場所を見つけるのに最適です。

他の人によって説明された小さな数値の違いは別として、私dudfユーティリティは非常に異なる目的に役立つと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.