ディスク使用量を測定する方法はなぜそんなに変わりますか?

ディスク使用量を測定する方法はなぜそんなに変わりますか?

ファイルサイズを合計すると、数値が表示されます。を実行すると、du別の番号が得られます。duパーティション内のすべてのファイルに対して実行すると、使用されdfた宣言と一致しません。合計ファイルサイズの数がなぜそんなに変わるのですか?コンピュータを追加できませんか?

追加については、「使用済み」および「使用可能」列を追加してdf合計を取得できません。この合計は私のパーティションサイズよりも小さいです。パーティションサイズを合計すると、ディスクサイズがわかりません!何を提供しますか?

答え1

数字を追加するのは簡単です。問題は、追加する必要がある数が多すぎるということです。

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

基本的なアイデアはNバイト使用量Nバイトのディスク領域といくつかの制御情報(ファイルのメタデータ(権限、タイムスタンプなど))とファイルが格納されている情報を見つけるためのシステムには少しオーバーヘッドが必要です。しかし、多くの合併症があります。

細かい合併症

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

より技術的には、一般的な単純なファイルシステムでは、スペースは次のように分けられます。彫刻。一般的なブロックサイズは4KiBです。各ファイルは整数個のブロックを占めています。ファイルサイズがブロックサイズの倍数でない限り、最後のブロックのみが部分的に使用されます。したがって、1バイトファイルと4096バイトファイルの両方が1ブロックを占め、4097バイトファイルは2ブロックを占めます。以下を使用またはls観察できますdu。ファイルシステムのブロックサイズが4KiBの場合ls -sduおよびは、1バイトのファイルを4KiBとして報告します。

ファイルが大きい場合、ファイルを構成するブロックのリストを保存するには追加のブロックが必要です。間接ブロック;より複雑なファイルシステムは、これを次の形式に最適化できます。範囲)。これは、ls -lGNUまたはGNUによって報告されたファイルサイズには表示されませんdu --apparent-size。サイズduの代わりにls -sディスク使用量を報告すると、これらの問題がよく明らかになります。

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

巨視的合併症

通常、上記のように報告された合計サイズは、ファイルduで使用されるブロックサイズまたは範囲サイズの合計です。

duファイルが圧縮されていると、報告されたサイズが小さくなる可能性があります。 Unixシステムは伝統的に粗雑な圧縮をサポートしていました。ファイルブロックにNULLバイトしか含まれていない場合、ファイルシステムはゼロブロックを格納する代わりにブロックを完全に無視できます。このようなブロックを省略したファイルスパースファイル。ファイルに多数のヌルバイトが含まれていると、スパースファイルは自動的に生成されず、アプリケーションはファイルがスパースするように準備する必要があります。

いくつかのファイルシステム、例:BTFSそしてジブス普遍的なサポート圧縮

後期合併症

zfsやbtrfsなどの最新のファイルシステムの2つの主な機能、スナップショットと重複排除は、ファイルサイズとディスク使用量の関係をさらに遠くにします。

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

スナップショットが作成された後、または2つのスナップショット間で変更されていないファイルまたはブロックは、スナップショットとアクティブバージョン、または他のスナップショットの両方に同じように存在します。これは以下によって達成される。書き込み中のコピー。一部の極端なケースでは、空き容量が不足しているため、ファイルシステム全体からファイルを削除できません。ファイルを削除するには、ディレクトリにブロックをコピーする必要があり、そのブロックにはもはやスペースがありません。

重複排除同じブロックを保存しないストレージ最適化技術です。一般的なデータの場合、重複項目を見つけることが常に努力する価値があるわけではありません。両方ジブスそしてBTFSオプションの機能で重複排除をサポートします。

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

上記のように、各ファイルについて報告されるサイズは、通常、ファイルduで使用されるブロックまたは範囲のサイズを合計したものです。デフォルトでは、ls -lサイズはバイト単位でリストduされていますが、一部の既存のシステムではKiBまたは512バイト単位(セクタ)としてリストされています(du -kキロバイトは必須)。ほとんどの最新のユニスは、「人が読める」数字をサポートしてls -lh使用du -hします。 K、M、Gなどを使用するだけで十分です(KiB、MiB、GiBの場合)。

duディレクトリで実行すると、ディレクトリツリー内のすべてのファイルのディスク使用量が要約されます。ディレクトリを含める彼ら自身。ディレクトリにはデータ(ファイル名とファイルのメタデータがある場所を指すポインタ)が含まれているため、少しの記憶領域が必要です。小さなディレクトリは1つのブロックを占め、大きなディレクトリにはより多くのブロックが必要です。ディレクトリによって使用される記憶容量は、ディレクトリに含まれるファイルだけでなく、ディレクトリが挿入される順序と特定のファイルが削除される順序によって異なります(一部のファイルシステムでは、これによって穴が残る可能性があります)。ディスク容量とパフォーマンスの間に違いがあります)、違いはわずかです(ここで追加のチャンクが発生します)。を実行すると、ls -ld /some/directoryディレクトリサイズが一覧表示されます。 (出力上部の「total NNN」行はls -l無関係な数字であり、KiBまたはセクタで表されるリストされた項目のブロックサイズの合計です。)

duこれには含まれることに注意してください。ファイルをクリックls-Aまたは、オプションを使用しないと表示されません-a

du報告された金額が予想金額より少ない場合があります。あれば、このようなことが起こったでしょう。ハードリンクディレクトリツリー内:du各ファイルは一度だけカウントされます。スイッチを使用したdu -lファイル数の計算窒素時間があれば窒素ハードリンク。

一部のファイルシステム(ZFSLinuxなど)では、duファイルの拡張属性が占めるディスク容量全体が報告されません。

ディレクトリの下にマウントポイントがある場合、オプションがdu指定されていない限り、そのマウントポイントのすべてのファイルも計算されます-x。したがって、ルートファイルシステムのフルファイルサイズが必要な場合は、du -x /代わりに実行してくださいdu /

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

削除されたファイル

ファイルがあるとき削除済み、ファイル自体は削除せず、ディレクトリエントリのみを削除します。実際にファイルを削除してディスク容量を回復するには、2つの条件を満たす必要があります。

  • ファイルのリンク数はゼロにする必要があります。ファイルに複数のハードリンクがある場合、1つを削除しても他のリンクには影響しません。
  • 一部のプロセスでファイルが開いている限り、データは保持されます。ファイルは、すべてのプロセスがファイルを閉じたときにのみ削除されます。出力fuser -mまたはlsofそのファイルシステムでファイルを開くプロセスは、ファイルが削除されてもマウントポイントに含まれます。
  • 削除されたファイルを開くプロセスがない場合でも、そのファイルが本機のバックエンドの場合、ファイルスペースを回復できないことがありますlooplosetup -a(例:)は、現在どのデバイスがどのファイルに設定されているかをroot示します。ディスク容量を回復するには、まずループデバイスを破棄(使用)する必要があります。looplosetup -d

一部のファイルマネージャまたはGUI環境からファイルを削除すると、元に戻すことができるゴミ箱領域に入ることがあります。ファイルを回復できる限り、その領域は消費され続けます。

この数字はどこdfから来ましたか?

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

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

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

ext2/ext3/ext4のファイルシステム予約スペースの5%がrootユーザーに提供されます。これは、ルートファイルシステムがシステムがいっぱいになったときにシステムを実行し続けるのに役立ちます(特にロギングの場合とシステム管理者が問題の解決中にいくつかのデータを保存できるようにします)。などのデータパーティションの場合でも、ほとんどいっぱいの/homeファイルシステムが簡単に断片化される可能性があるため、予約済みスペースを残すことが便利です。 Linuxは、ファイルを作成するときに多数の連続ブロックを事前に割り当てて断片化を防止しようとしますが、これは特にハードドライブなどの回転式機械デバイスでファイルアクセスが遅くなる可能性がありますが、連続ブロックが多い場合は機能しません。

既存のファイルシステム(ext4を含む、btrfsを除く)は、固定数のファイルシステムを予約します。インデックスノードファイルシステムを作成するとき。これはファイルシステムの設計を大幅に簡素化しますが、inodeの数を適切に調整する必要があるという欠点があります。 inodeが多すぎるとスペースが無駄になり、inodeが不足する前にファイルシステムでinodeが不足する可能性があります。スペースの。このコマンドは、df -i使用中のinodeの数と使用可能な数を報告します(この概念が適用されないファイルシステムは0を報告することができます)。

ext2/ext3/ext4 ファイルシステムを含むボリュームで実行すると、tune2fs -l使用可能な inode とブロックの総数と数を含むいくつかの統計が報告されます。

物質を混同する可能性があるもう1つの特徴は次のとおりです。サブボリューム(サポートBTFSとzfsの名前の下でデータセット)。複数のサブボリュームは同じスペースを共有しますが、別々のディレクトリツリールートを持ちます。

ファイルシステムがネットワーク(NFS、Sambaなど)を介してマウントされ、サーバーがファイルシステムの一部(例:サーバーには/homeファイルシステムがあり、エクスポート/home/bob)、その後、dfクライアントにエクスポートしてインストールした部分だけでなく、クライアントの完全なファイルシステムデータも反映します。

私のディスク容量はどのような用途に使用されていますか?

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

ファイルシステムが作成されると、通常は含まれているパーティションまたはボリュームの空き容量がいっぱいになります。時には、ファイルシステムを移動したりボリュームのサイズを変更したりすると、ファイルシステムが小さくなることがあります。

Linuxでは、lsblk利用可能なストレージボリュームの良い概要が提供されています。詳細情報が必要な場合、またはパーティションがない場合は、lsblk特別なボリューム管理またはパーティション化ツールを使用してどのパーティションが存在するかを確認してください。 Linux にはlvs、、、vgspvsあります。左心室容積fdisk既存のPCスタイル(「MBR」)パーティション(最新システムのGPT)の場合、gdisk~のためGPT分割、disklabelBSDディスクラベルの場合別れたLinuxでcat /proc/partitions簡単にまとめてみましょう。一般的なインストールでは、オペレーティングシステムで使用される少なくとも2つのパーティションまたはボリューム、つまりファイルシステム(場合によってはそれ以上)と交換容量。

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

最後に、ほとんどのコンピュータプログラムは1024 = 2の10平方に基づいた単位を使用します(プログラマは2進数と2の重複が好きだからです)。したがって、1kB = 1024B、1MB = 1048576B、1GB = 1073741824、1TB = 1099511627776B、...公式にこれらの単位を呼び出します。キロバイト基本布、テラバイトMiBなどですが、ほとんどのソフトウェアはk、kB、M、MBなどを報告します。一方、ハードドライブメーカーは体系的にメートル法(1000に基づく単位)を使用しています。したがって、1TBドライブはわずか931GiBまたは0.904TiBです。

答え2

ファイルサイズとディスク容量の計算の複雑さの簡単な要約:

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

    ただし、ファイルが他のファイルへのハードリンクである場合は、追加のディレクトリエントリが1つだけ必要になることがあります。これは同じチャンクへの別の参照です。

  • ファイルの内容のサイズ。これがls表示されます。
  • 使用可能なディスク容量は、収めることができる最大のファイルのサイズでもなく、ディスクに収めることができるすべてのファイル内容のサイズを合計したものでもありません。その間どこかにあります。これは、ファイル数(inode占有)、ブロックサイズ、および各ファイルの内容がブロックをどれだけ満たすかによって異なります。

これはファイルシステムの外観に過ぎず、過度に単純化されたものです。また、他のファイルシステムは異なる動作をしていることを覚えておいてください。

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

答え3

df通常、ファイルシステムが何であるか、各ファイルシステムがどれだけ満たされているか、マウントされた場所を確認するために使用されます。これは、ファイルシステムの空き容量がなく、ファイルシステム間でコンテンツを移動したり、より大きなディスクを購入したい場合などに役立ちます。

du各ディレクトリが消費する累積ストレージの詳細を表示します(Windowsと同様windirstat)。ファイルのクリーンアップを試みるときにスペースが占める場所を見つけるのに適しています。

他の人が説明するマイナーな数値差を除いて、ユーティリティの目的はdu大きく異なると思います。df

答え4

duここでは違いをもたらすさまざまな状況について説明しますdf

dfdu各ファイルのサイズ情報を使用して、ファイルシステムが割り当てたブロック数を計算します。さまざまな理由で違いが発生する可能性があります。

  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

関連情報