回答:
数字の加算は簡単です。問題は、追加する多くの異なる番号があることです。
基本的な考え方は、nバイトを含むファイルはnバイトのディスク領域に加えて、ファイルのメタデータ(アクセス許可、タイムスタンプなど)、およびシステムが必要とする情報のオーバーヘッドのビットなどの制御情報のビットを使用することです。ファイルが保存されている場所を見つけます。しかし、多くの合併症があります。
各ファイルを図書館の一連の本と考えてください。小さなファイルは1つのボリュームのみを構成しますが、大きなファイルは百科事典のように多くのボリュームで構成されます。ファイルを見つけることができるように、すべてのボリュームを参照するカードカタログがあります。各ボリュームには、カバーのために少しオーバーヘッドがあります。ファイルが非常に小さい場合、このオーバーヘッドは比較的大きくなります。また、カードカタログ自体がいくらかのスペースを占有します。
もう少し技術的に言えば、典型的な単純なファイルシステムでは、スペースはブロックに分割されます。典型的なブロックサイズは4KiBです。各ファイルは整数個のブロックを占有します。ファイルサイズがブロックサイズの倍数でない限り、最後のブロックは部分的にしか使用されません。したがって、1バイトのファイルと4096バイトのファイルは両方とも1ブロックを占有しますが、4097バイトのファイルは2ブロックを占有します。これはdu
コマンドで確認できます。ファイルシステムのブロックサイズdu
が4KiBの場合、1バイトファイルの4KiBが報告されます。
ファイルが大きい場合、ファイルを構成するブロックのリストを保存するためだけに追加のブロックが必要です(これらは間接ブロックです。より洗練されたファイルシステムは、エクステントの形でこれを最適化できます)。ls -l
またはGNU によって報告されたファイルサイズには表示されませんdu --apparent-size
。du
、サイズではなくディスク使用量を報告するが、それらを考慮します。
一部のファイルシステムは、最後のブロックに残った空きスペースを再利用して、同じブロックに複数のファイルテールをパックしようとします。一部のファイルシステム(Linux 3.8以降のext4など)は、iノードに完全に収まる小さなファイル(わずか数バイト)に0ブロックを使用します。
一般に、上記のように、レポートされる合計サイズdu
は、ファイルで使用されるブロックまたはエクステントのサイズの合計です。
du
ファイルが圧縮されている場合、レポートされるサイズは小さくなる可能性があります。Unixシステムは従来、粗い形式の圧縮をサポートしています。ファイルブロックにnullバイトのみが含まれる場合、ゼロのブロックを格納する代わりに、ファイルシステムはそのブロックを完全に省略できます。このようなブロックが省略されたファイルは、スパースファイルと呼ばれます。ファイルに大量のヌルバイトが含まれている場合、スパースファイルは自動的に作成されません。アプリケーションは、ファイルがスパースになるように調整する必要があります。
btrfsやzfsなどの一部のファイルシステムは、汎用圧縮をサポートしています。
zfsやbtrfsなどの非常に現代的なファイルシステムの2つの主要な機能により、ファイルサイズとディスク使用量との関係は、スナップショットと重複排除により大きく異なります。
スナップショットは、特定の日付におけるファイルシステムの凍結状態です。この機能をサポートするファイルシステムには、異なる日付に撮影された複数のスナップショットを含めることができます。もちろん、これらのスナップショットにはスペースが必要です。極端な場合、アクティブバージョンのファイルシステムからすべてのファイルを削除しても、スナップショットが残っていてもファイルシステムは空になりません。
スナップショット以降、または2つのスナップショット間で変更されていないファイルまたはブロックは、スナップショットとアクティブバージョンまたは他のスナップショットにまったく同じように存在します。これはcopy-on-writeを介して実装されます。エッジケースによっては、使用可能なスペースが不足しているため、ファイルシステム全体でファイルを削除できないことがあります。そのファイルを削除するには、ディレクトリ内にブロックのコピーを作成する必要があり、その1つのブロックでさえ余地がないためです。
重複排除は、同一ブロックの保存を回避することで構成されるストレージ最適化手法です。典型的なデータでは、重複を探すことは必ずしも努力する価値があるとは限りません。zfsと btrfsは両方とも、オプション機能として重複排除をサポートしています。
du
合計がファイルサイズの合計と異なるのはなぜですか?上で見たように、du
各ファイルについて報告されるサイズは通常、ファイルで使用されるブロックまたはエクステントのサイズの合計です。デフォルトでls -l
は、サイズはバイト単位でリストされますが、du
サイズはKiB、または従来のシステムでは512バイト単位(セクター)でリストされます(du -k
強制的にキロバイトを使用します)。最新のユニックスは、K、M、Gなどを使用した「人間が読める」数値をサポートls -lh
しdu -h
、使用するのに適切です(KiB、MiB、GiBの場合)。
du
ディレクトリで実行すると、ディレクトリ自体を含む、ディレクトリツリー内のすべてのファイルのディスク使用量が合計されます。ディレクトリにはデータ(ファイルの名前、およびファイルのメタデータがある場所へのポインター)が含まれているため、少しのストレージスペースが必要です。小さなディレクトリは1ブロックを占有し、大きなディレクトリはより多くのブロックを必要とします。ディレクトリで使用されるストレージの量は、ディレクトリに含まれるファイルだけでなく、挿入された順序と削除されるファイルの順序にも依存する場合があります(ファイルシステムによっては、ディスクスペースとパフォーマンスの妥協点となる場合があります) )、しかし違いはわずかです(あちこちに余分なブロックがあります)。走るときls -ld /some/directory
、ディレクトリのサイズが一覧表示されます。(出力の上部にある「合計NNN」行ls -l
は無関係な数値であり、リストされたアイテムのブロック内のサイズの合計であり、KiBまたはセクターで表されます。)
覚えておいてくださいdu
含まれるドットファイルls
は、使用しない限り、表示されません-A
か、-a
オプションを選択します。
du
予想される合計よりも少ない場合があります。これは、ディレクトリツリー内にハードリンクがある場合に発生しdu
ます。各ファイルを1回だけカウントします。
ZFS
Linux などの一部のファイルシステムdu
では、ファイルの拡張属性が占めるディスクスペース全体を報告しません。
ディレクトリの下にマウントポイントがある場合du
、-x
オプションを指定しない限り、これらのマウントポイント上のすべてのファイルもカウントすることに注意してください。たとえば、ルートファイルシステム内のファイルの合計サイズが必要な場合はdu -x /
、ではなくを実行しますdu /
。
ファイルシステムが空でないディレクトリにマウントされている場合、そのディレクトリ内のファイルはマウントされたファイルシステムによって隠されます。彼らはまだ彼らのスペースを占有しますが、du
それらを見つけません。
ファイルが削除されると、これはディレクトリエントリのみを削除し、必ずしもファイル自体を削除するわけではありません。ファイルを実際に削除し、ディスクスペースを再利用するには、2つの条件が必要です。
fuser -m
またはlsof
マウントポイントには、ファイルが削除された場合でも、そのファイルシステムでファイルが開かれているプロセスが含まれます。loop
デバイスのバックエンドである場合、ファイルのスペースは再利用されません。losetup -a
(as root
)loop
は、現在セットアップされているデバイスとファイルを示します。losetup -d
ディスクスペースを再利用するには、ループデバイスを(withで)破棄する必要があります。一部のファイルマネージャーまたはGUI環境でファイルを削除すると、そのファイルはゴミ箱に置かれ、元に戻すことができます。ファイルの削除を取り消すことができる限り、そのスペースは引き続き消費されます。
df
正確に何ですか?典型的なファイルシステムには以下が含まれます。
によって報告されるのは最初の種類のみdu
です。になるとdf
、「使用済み」、「使用可能」、および合計の列はファイルシステムに依存します(もちろん使用済みブロック(間接ブロックを含む)は常に「使用済み」列にあり、未使用ブロックは常に「使用可能」列)。
EXT2 / EXT3 / ext4のファイルシステムの中に予備ルートユーザに空間の5%。これは、ルートファイルシステムで役立ちます。システムがいっぱいになった場合でも動作を維持します(特にログ記録のため、およびシステム管理者が問題を修正しながら少しのデータを保存できるようにします)。のようなデータパーティションであっても/home
、ほぼ満杯のファイルシステムは断片化の傾向があるため、その予約スペースを維持すると便利です。Linuxは、ファイルの書き込み時に多くの連続したブロックを事前に割り当てることで、断片化(特にハードディスクなどの回転する機械デバイスでのファイルアクセスを遅くする)を回避しようとしますが、連続したブロックがあまりない場合は機能しません。
btrfsではなくext4までの従来のファイルシステムは、ファイルシステムの作成時に一定数のiノードを予約します。これにより、ファイルシステムの設計が大幅に簡素化されますが、iノードの数を適切にサイズ設定する必要があるという欠点があります。iノードが多すぎると、スペースが無駄になります。iノードが少なすぎると、ファイルシステムはスペースが不足する前にiノードが不足する可能性があります。このコマンドdf -i
は、使用中のiノードの数と使用可能なiノードの数を報告します(概念が適用されないファイルシステムは0を報告する場合があります)。
tune2fs -l
ext2 / ext3 / ext4ファイルシステムを含むボリュームで実行すると、空きiノードとブロックの総数と数などの統計情報が報告されます。
問題を混乱させる可能性のある別の機能は、サブボリュームです(btrfsおよびzfsで、名前がdatasetsでサポートされています)。複数のサブボリュームは同じスペースを共有しますが、個別のディレクトリツリールートがあります。
ファイルシステムがネットワーク(NFS、Sambaなど)経由でマウントされ、サーバーがそのファイルシステムの一部をエクスポートする場合(サーバーに/home
ファイルシステムがあり、エクスポートする場合/home/bob
)、df
クライアントではファイルシステム全体ではなく、ファイルシステム全体のデータを反映しますエクスポートされてクライアントにマウントされる部分のみ。
上で見たように、によって報告される合計サイズdf
は、ファイルシステムのすべての制御データを常に考慮するとは限りません。必要に応じて、ファイルシステム固有のツールを使用して、ファイルシステムの正確なサイズを取得します。たとえば、ext2 / ext3 / ext4を使用して実行tune2fs -l
し、ブロックサイズにブロック数を掛けます。
ファイルシステムを作成すると、通常はそれが含まれるパーティションまたはボリュームの利用可能なスペースを埋めます。ファイルシステムを移動したり、ボリュームのサイズを変更したりすると、ファイルシステムが小さくなる場合があります。
Linuxでは、lsblk
利用可能なストレージボリュームの概要がわかりやすく表示されます。追加情報については、または持っていない場合はlsblk
、専用のボリューム管理ツールまたはパーティション分割ツールを使用して、所有しているパーティションを確認してください。Linuxでは、ありますlvs
、vgs
、pvs
のためのLVM、fdisk
(「MBR」)パーティション(だけでなく、最近のシステムでGPT)伝統的なPCスタイルのため、gdisk
用のGPTパーティション、disklabel
BSDディスクラベルのため、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のみです。
du
ない間接ブロックのアカウントを。これが、で報告されているファイルサイズとの主な違いls -l
です。
ファイルサイズとディスク領域の計算の複雑さの短い要約:
ファイルがディスク上で占有するスペースは、各ブロックのサイズに対する占有ブロック数+占有するiノード数の乗数です。1バイトのファイルには、少なくとも1つのブロック、1つのiノード、1つのディレクトリエントリが必要です。
ただし、ファイルが別のファイルへのハードリンクである場合、追加のディレクトリエントリは1つだけで済みます。これは、同じブロックセットへの単なる別の参照になります。
ls
表示されます。これはファイルシステムの表面をひっかいているだけであり、非常に単純化されています。また、異なるファイルシステムは異なる動作をすることを覚えておいてください。
stat
この情報のいくつかを見つけるのに非常に役立ちます。statの使用方法とその用途の例を次に示します。http://landoflinux.com/linux_stat_command_examples.html
私はここに原因別の例を示しますdu
と異なるがdf
。
df
ファイルシステムに割り当てられたブロックをカウントし、du
各ファイルのサイズ情報を使用します。違いには多くの原因があります。
1)アプリケーションによってまだ開いているリンクされていない(削除された)ファイル。ファイル情報が欠落していますが、ブロックはまだ割り当てられています。 lsof +aL1 <filesystem>
プロセスを特定するのに役立ちます。ほとんどの場合、プロセスを強制終了してスペースを解放する必要があります(プロセスによって異なりますが、構成の再読み込みで十分な場合もあります)。
2)マウントポイントの下に隠されているdu
が隠されていないファイルdf
。debugfs
ファイルシステムを読むのに役立ちます。
$ 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
df
一般に、ファイルシステムが何であるか、それぞれがどのくらいいっぱいで、どこにマウントされているかを確認するために使用されます。ファイルシステムのスペースが不足していて、ファイルシステム間での移動や、より大きなディスクの購入などを行う場合に非常に便利です。
du
各ディレクトリが消費している累積ストレージの詳細を表示します(windirstat
Windows のようなもの)。ファイルのクリーンアップを試みるときに、スペースを占有している場所を見つけるのに最適です。
他の人によって説明された小さな数値の違いは別として、私du
とdf
ユーティリティは非常に異なる目的に役立つと思います。
tune2fs
は、ファイルシステムを含むブロックデバイスへの読み取りアクセス権が必要です。これは、一般にルートである必要があります。これにより、任意のファイルのコンテンツを読み取ることができます。