
ファイルのサイズを合計すると、1 つの数字が得られます。 を実行するとdu
、別の数字が得られます。du
パーティション上のすべてのファイルに対して を実行すると、 が使用されている主張と一致しませんdf
。 ファイルの合計サイズにこれほど多くの異なる数字が表示されるのはなぜですか? コンピューターは加算できないのですか?
追加といえば、 の「使用済み」列と「使用可能」列を追加してもdf
、合計数値が得られません。また、その合計数値はパーティションのサイズよりも小さくなります。パーティション サイズを合計しても、ディスク サイズが得られません。一体何が起こっているのでしょうか。
答え1
数字を足し合わせるのは簡単です。問題は、足し合わせる数字がたくさんあることです。
ファイルはどのくらいのディスク容量を使用しますか?
基本的な考え方は、んバイト使用んバイトのディスク容量と、制御情報(ファイルのメタデータ(権限、タイムスタンプなど))のためのビット、およびシステムがファイルの保存場所を見つけるために必要な情報のためのオーバーヘッドが少しあります。ただし、多くの複雑な問題があります。
顕微鏡的合併症
各ファイルを図書館の一連の本と考えてください。小さなファイルは 1 巻だけを構成しますが、大きなファイルは百科事典のように多数の巻から構成されます。ファイルを見つけられるように、各巻を参照するカード カタログがあります。各巻には、表紙があるため、多少のオーバーヘッドがあります。ファイルが非常に小さい場合、このオーバーヘッドは比較的大きくなります。また、カード カタログ自体も、ある程度のスペースを占有します。
もう少し技術的に言えば、典型的な単純なファイルシステムでは、スペースは次のように分割されます。ブロック一般的なブロック サイズは 4KiB です。各ファイルは整数個のブロックを占有します。ファイル サイズがブロック サイズの倍数でない限り、最後のブロックは部分的にしか使用されません。したがって、1 バイトのファイルと 4096 バイトのファイルはどちらも 1 ブロックを占有しますが、4097 バイトのファイルは 2 ブロックを占有します。これは、ls
またはを使用して確認できますdu
。ファイル システムのブロック サイズが 4KiB の場合、およびls -s
はdu
1 バイトのファイルに対して 4KiB を報告します。
ファイルが大きい場合、ファイルを構成するブロックのリストを格納するためだけに追加のブロックが必要になります(これらは間接ブロック; より洗練されたファイルシステムでは、これを次のように最適化するかもしれません。範囲)。これらは、ls -l
または GNUによって報告されるファイル サイズには表示されませんdu --apparent-size
。サイズではなくディスク使用量を報告する と では、これらが考慮されます。du
ls -s
いくつかのファイルシステムは、最後のブロックに残っている空き領域を再利用して複数のファイル末尾を同じブロックにパックする一部のファイルシステム(Linux 3.8 以降の ext4inode に完全に収まる小さなファイル (わずか数バイト) には 0 ブロックを使用します。
肉眼的合併症
通常、上記のように、 によって報告される合計サイズは、du
ファイルによって使用されるブロックまたはエクステントのサイズの合計です。
ファイルが圧縮されている場合、によって報告されるサイズはdu
小さくなる場合があります。Unix システムは伝統的に、圧縮の粗雑な形式をサポートしています。ファイル ブロックにヌル バイトのみが含まれている場合、ゼロのブロックを格納する代わりに、ファイルシステムはそのブロックを完全に省略することができます。このように省略されたブロックを持つファイルは、スパースファイルファイルに大量のヌルバイトが含まれている場合、スパース ファイルは自動的に作成されないため、アプリケーションでファイルをスパースにする必要があります。
次のようなファイルシステムbtrfsそしてゼフス汎用性をサポート圧縮。
高度な合併症
zfs や btrfs などの最新のファイルシステムの 2 つの主要機能、スナップショットと重複排除により、ファイル サイズとディスク使用量の関係が大幅に離れます。
スナップショット特定の日付におけるファイルシステムの凍結状態です。この機能をサポートするファイルシステムには、異なる日付で作成された複数のスナップショットを含めることができます。もちろん、これらのスナップショットは領域を占有します。極端な例として、ファイルシステムのアクティブ バージョンからすべてのファイルを削除しても、スナップショットが残っている限り、ファイルシステムは空になりません。
スナップショット以降、または2つのスナップショット間で変更されていないファイルまたはブロックは、スナップショットとアクティブバージョンまたは他のスナップショットに同一に存在します。これは次のように実装されます。コピーオンライト極端なケースでは、使用可能なスペースが不足しているために、いっぱいになったファイルシステム上のファイルの削除が失敗する可能性があります。これは、そのファイルを削除するにはディレクトリ内のブロックのコピーを作成する必要があり、その 1 つのブロックにもスペースが残っていないためです。
重複排除は、同一のブロックを保存しないようにするストレージ最適化技術です。一般的なデータでは、重複を探すことは必ずしも労力に見合うものではありません。ゼフスそしてbtrfsオプション機能として重複排除をサポートします。
合計がdu
ファイル サイズの合計と異なるのはなぜですか?
上で見たように、各ファイルについて が報告するサイズdu
は、通常、ファイルで使用されるブロックまたはエクステントのサイズの合計です。デフォルトでは、 はls -l
サイズをバイト単位でリストしますが、du
KiB または一部のより伝統的なシステムでは 512 バイト単位 (セクター) でサイズをリストします (du -k
はキロバイトの使用を強制します)。ほとんどの最新の unice は、必要に応じて K、M、G などの「人間が読める」数値 (KiB、MiB、GiB など) を使用することをサポートしls -lh
、du -h
使用しています。
du
ディレクトリ上で実行すると、ディレクトリツリー内のすべてのファイルのディスク使用量が合計されます。ディレクトリを含むディレクトリ自体にはデータ(ファイル名とファイルのメタデータの場所へのポインタ)が含まれているため、多少のストレージスペースが必要です。小さなディレクトリは 1 ブロックを占め、大きなディレクトリはより多くのブロックを必要とします。ディレクトリが使用するストレージの量は、含まれるファイルだけでなく、ファイルが挿入された順序や一部のファイルが削除された順序(一部のファイルシステムでは、ディスク容量とパフォーマンスの妥協点として、これによって空き領域が残る場合があります)によっても異なりますが、その差はごくわずかです(あちこちに余分なブロックが 1 つずつあります)。 を実行するとls -ld /some/directory
、ディレクトリのサイズが表示されます( からの出力の先頭にある「total NNN」行はls -l
無関係な数字であることに注意してください。これは、リストされた項目のブロック サイズの合計で、KiB またはセクターで表されます)。
du
以下が含まれることを覚えておいてくださいドットファイルまたはオプションls
を使用しない限り表示されません。-A
-a
du
予想よりも少ない金額が報告されることがあります。これは、ハードリンクディレクトリツリー内:du
各ファイルを1回だけカウントします。du -l
スイッチを使用してファイルをカウントします。いいえ彼らが持っている場合いいえハードリンク。
ZFS
Linuxなどの一部のファイル システムでは、du
ファイルの拡張属性によって占有されるディスク領域全体が報告されません。
ディレクトリの下にマウント ポイントがある場合、オプションdu
を指定しない限り、 はこれらのマウント ポイント上のすべてのファイルもカウントすることに注意してください-x
。したがって、たとえばルート ファイル システム内のファイルの合計サイズが必要な場合は、du -x /
ではなく を実行しますdu /
。
ファイルシステムが空でないディレクトリにマウントされている場合、そのディレクトリ内のファイルはマウントされたファイルシステムによって隠されています。ファイルは依然としてスペースを占有していますが、du
見つけることはできません。
削除されたファイル
ファイルが削除されました、これはディレクトリ エントリのみを削除し、必ずしもファイル自体は削除しません。実際にファイルを削除してディスク領域を再利用するには、次の 2 つの条件が必要です。
- ファイルのリンク数は 0 にする必要があります。ファイルに複数のハード リンクがある場合、1 つを削除しても他のリンクには影響しません。
- ファイルが何らかのプロセスによって開かれている限り、データは残ります。すべてのプロセスがファイルを閉じたときにのみ、ファイルは削除されます。出力
fuser -m
またはlsof
マウント ポイント上のプロセスには、ファイルが削除された場合でも、そのファイル システム上でファイルを開いているプロセスが含まれます。 - 削除されたファイルを開いているプロセスがない場合でも、そのファイルがデバイスのバックエンドである場合は、ファイルのスペースが再利用されないことがあります
loop
。losetup -a
(としてroot
) は、現在どのデバイスがどのファイルに設定されているかを示しますloop
。ディスク スペースを再利用するには、ループ デバイスを (を使用して) 破棄する必要がありますlosetup -d
。
一部のファイル マネージャーまたは GUI 環境でファイルを削除すると、そのファイルはゴミ箱に移動され、復元できるようになります。ファイルが復元できる限り、そのファイルのスペースは消費され続けます。
これらの数字はdf
正確には何からのものですか?
典型的なファイルシステムには以下が含まれます。
- ファイル (ディレクトリを含む) データと一部のメタデータ (間接ブロック、一部のファイルシステムの拡張属性を含む) を含むブロック。
- 空きブロック。
- ルート ユーザー用に予約されているブロック。
- スーパーブロックおよびその他の制御情報。
- iノード
- あジャーナル
によって報告されるのは最初の種類だけですdu
。 に関してはdf
、「使用済み」、「使用可能」、および合計列に何が含まれるかはファイルシステムによって異なります (もちろん、使用済みブロック (間接的なものを含む) は常に「使用済み」列に含まれ、未使用ブロックは常に「使用可能」列に含まれます)。
ext2/ext3/ext4のファイルシステム予約するスペースの 5% をルート ユーザーに割り当てます。これは、ルート ファイル システムで、システムがいっぱいになった場合にシステムを継続させるのに役立ちます (特に、ログ記録や、システム管理者が問題を修正する間に少量のデータを格納できるようにするため)。 などのデータ パーティションの場合でも/home
、予約済みのスペースを保持しておくと便利です。これは、ほぼいっぱいのファイル システムは断片化しやすいためです。Linux は、ファイルの書き込み時に多数の連続ブロックを事前に割り当てることで断片化 (特にハードディスクなどの回転する機械装置でファイル アクセスが遅くなる) を回避しようとしますが、連続するブロックがあまりない場合は機能しません。
従来のファイルシステム(ext4まで含むがbtrfsは除く)は、固定数のiノードファイルシステムの作成時に、inode の数を適切に設定する必要があります。これにより、ファイルシステムの設計が大幅に簡素化されますが、inode の数を適切に設定する必要があるという欠点があります。inode が多すぎると、スペースが無駄になり、inode が少なすぎると、スペースがなくなる前にファイルシステムの inode がなくなる可能性があります。このコマンドは、df -i
使用中の inode の数と使用可能な inode の数を報告します (この概念が適用できないファイルシステムでは、0 が報告される場合があります)。
tune2fs -l
ext2/ext3/ext4 ファイルシステムを含むボリューム上で実行すると、空き inode とブロックの合計数や数などの統計情報が報告されます。
物質を混乱させるもう一つの特徴はサブボリューム(サポートされているbtrfs、zfsでは次の名前でデータセット複数のサブボリュームは同じスペースを共有しますが、ディレクトリ ツリーのルートは別々です。
ファイルシステムがネットワーク(NFS、Sambaなど)経由でマウントされ、サーバーがそのファイルシステムの一部をエクスポートする場合(例:サーバーには/home
ファイルシステムがあり、エクスポートします/home/bob
)を実行すると、df
クライアント上では、エクスポートされてクライアントにマウントされた部分だけでなく、ファイルシステム全体のデータが反映されます。
ディスクのスペースを使用しているのは何ですか?
上で見たように、 が報告する合計サイズは、df
必ずしもファイルシステムのすべての制御データを考慮しているわけではありません。 必要に応じて、ファイルシステム固有のツールを使用して、ファイルシステムの正確なサイズを取得します。 たとえば、ext2/ext3/ext4 の場合、 を実行して、tune2fs -l
ブロック サイズとブロック数を掛けます。
ファイルシステムを作成すると、通常は、そのファイルシステムを囲むパーティションまたはボリュームの使用可能なスペースがいっぱいになります。ファイルシステムを移動したり、ボリュームのサイズを変更したりすると、ファイルシステムが小さくなる場合があります。
Linux では、lsblk
利用可能なストレージボリュームの概要が表示されます。詳細情報が必要な場合、または がない場合はlsblk
、専用のボリューム管理ツールまたはパーティションツールを使用して、どのパーティションがあるかを確認してください。Linux では、lvs
、vgs
、pvs
があります。ライトVM、fdisk
従来のPCスタイル(「MBR」)パーティション(最近のシステムではGPTも)の場合、gdisk
のためにGPTパーティション、disklabel
BSDディスクラベルの場合、別れたLinuxでは、cat /proc/partitions
簡単な概要を示します。一般的なインストールでは、オペレーティングシステムによって使用されるパーティションまたはボリュームが少なくとも2つあります。ファイルシステム(場合によってはそれ以上)とスワップ音量。
一部のコンピュータには、BIOSまたはその他の診断ソフトウェア。UEFI専用のブートローダ パーティションがあります。
最後に、ほとんどのコンピュータプログラムは1024の累乗 = 2 10に基づく単位を使用していることに注意してください(プログラマーは2進数と2の累乗を好むため)。つまり、1 kB = 1024 B、1 MB = 1048576 B、1 GB = 1073741824、1 TB = 1099511627776 B、… 正式には、これらの単位は次のように知られています。キビバイトKiB、メビバイトMiB などですが、ほとんどのソフトウェアは k または kB、M または MB などを報告するだけです。一方、ハードディスクの製造元は、体系的にメートル法 (1000 ベースの単位) を使用します。そのため、1 TB ドライブは 931 GiB または 0.904 TiB にすぎません。
答え2
ファイル サイズとディスク容量の計算の複雑さの簡単な概要:
ファイルがディスク上で占めるスペースは、ファイルが占めるブロック数と各ブロックのサイズ + ファイルが占める inode の数の乗数です。1 バイトの長さのファイルは、少なくとも 1 つのブロック、1 つの inode、および 1 つのディレクトリ エントリを占めます。
ただし、ファイルが別のファイルへのハード リンクである場合は、追加のディレクトリ エントリは 1 つだけ必要になります。これは、同じブロック セットへの別の参照にすぎません。
- ファイルの内容のサイズ。これが
ls
表示されます。 - 空きディスク容量は、ディスクに収まる最大のファイルのサイズでも、ディスクに収まるすべてのファイル コンテンツ サイズの合計でもありません。その中間のサイズです。空きディスク容量は、(i ノードを占める) ファイルの数、ブロック サイズ、および各ファイルの内容がブロックをどの程度完全に埋めているかによって異なります。
これはファイル システムの表面に触れただけであり、過度に単純化されています。また、ファイル システムによって動作が異なることにも注意してください。
stat
こうした情報を見つけるのに非常に役立ちます。 stat の使用方法とその利点の例をいくつか示します。http://landoflinux.com/linux_stat_command_examples.html
答え3
df
一般的には、ファイルシステムが何であるか、それぞれの使用状況はどの程度か、どこにマウントされているかを確認するために使用されます。ファイルシステムのスペースが不足し、ファイルシステム間でデータを移動したり、より大きなディスクを購入したりしたい場合に非常に便利です。
du
各ディレクトリが消費している累積ストレージ容量の詳細を表示します ( windirstat
Windows に似ています)。ファイルのクリーンアップを行うときに、どこでスペースを消費しているかを見つけるのに最適です。
他の人が説明した小さな数値の違いは別として、du
とdf
ユーティリティは非常に異なる目的を果たすと思います。
答え4
du
ここでは、 と異なる原因となるさまざまなケースについて説明しますdf
。
df
ファイルシステムに割り当てられたブロックをカウントし、du
各ファイルのサイズ情報を使用します。違いには多くの原因が考えられます。
アプリケーションによってまだ開かれている、リンクされていない (削除された) ファイル。ファイル情報は失われ、ブロックは割り当てられたままです。
lsof +aL1 <filesystem>
プロセスを識別するのに役立ちます。ほとんどの場合、スペースを解放するにはプロセスを強制終了する必要があります (プロセスによって異なりますが、構成の再読み込みで十分な場合もあります)。マウント ポイントの下のファイルは、 には隠されている
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
スパースファイル実際よりも大きく見えます。割り当てられていないブロックは ではカウントされません
df
が、見かけ上のファイル サイズは でカウントされますdu
。
ハードリンクは騙されないことに注意してくださいdu
。