私の理解によると、du
フォルダのフルサイズを取得するために使用されるコマンドは、各(サブ)フォルダ内の各ファイルを列挙して追加します。
yann@p:~$ du /var/log
4 /var/log/ntpstats
...
148 /var/log/apt
564 /var/log/installer
8 /var/log/cups
91748 /var/log
しかし、コマンドはどのようにdf
すぐに結果を返すことができますか?
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 35209808 18707476 14694008 57% /
ドライブのすべてのファイルを列挙する必要はありませんか?
ドライブ全体で使用されているスペースをすばやく知る方法がある場合は、フォルダのサイズをすばやく知る方法はありませんか?それともありますか?
よろしくお願いします。
答え1
df
システムコールを使用しstatvfs()
、ファイルシステムに現在の空間統計を要求します。もちろん、ファイルシステムを管理するときにファイルシステムで使用されているスペースを常に追跡するため、高速です。
したがって、速度が速いのは、df
ファイルシステムで事前計算されたキャッシュ値を使用するためです。
履歴は次のとおりです。
1970年代には、df
実際にはrawディスクデバイスにアクセスし、スーパーブロックからファイルシステム統計を取得するsuidルートプログラムがありました。
1980年代半ば、SunOSはシステムstatfs()
コールと最初のVFS実装を導入しました。この呼び出しには権限が必要なくなります。このインターフェースは、Tahoe会議で最後のSunOS / BSDコード交換中に* BSDに提供されました。
1989年、SVr4/Solarisはシステムコールの名前をstatvfs().
このバージョンに。このバージョンのシステムコールがPOSIXに追加され、さまざまなオペレーティングシステムからインターフェイスをコピーしました。
df
完全なファイルシステム値のみを持つスーパーブロックから間接的にデータを取得するため、単一のディレクトリの番号をすばやく取得する方法はありません。
答え2
通常の操作の一部として、ファイルシステムは使用されているデータブロックと利用可能なデータブロックの数を保持できます。df
この情報を活用してください。
ファイルシステムがリアルタイムカウンタを維持していなくても、新しいデータが書き込まれるときに空きブロックを見つけるための簡単な方法が必要であり、同じデータを使用して空きブロック数を見つけることができます。
理論的には、一部のファイルシステムはディレクトリごとに使用されているスペースカウンタを保持することもできます。しかし、いくつかの問題があります。
サブツリー全体の数が繰り返し保持される場合、ファイルシステムは使用数をすべての深さに伝播する必要があります。これにより、すべての書き込み操作が遅くなる可能性があります。ディレクトリに直接隣接するファイルだけを保持している場合でも、ツリーのフルサイズを見つけるには、ツリーを再帰的に巡回する必要があります。
Unixファミリーのファイルシステムでは、ハードリンクはより大きな障害です。ファイルが複数のディレクトリ(または同じディレクトリに複数回)リンクできる場合は、一意の親ディレクトリはありません。ファイルサイズはどこで計算する必要がありますか?リンクされているすべてのディレクトリで計算を実行すると、ファイルが複数回計算されるため、合計使用量が膨張します。 1つのディレクトリでのみ計算を実行することも明らかに間違っています。
実際、従来のUnixファイルシステムのファイル(例えばinode)は、自分が持っているディレクトリさえ知らず、リンクの数(ガーデン名)だけを知ることができます。ほとんどの場合、ファイルは主に名前でアクセスされるため、この情報は必要ありません。また、リポジトリはinodeに必要な量のデータを格納する必要があるため、ディレクトリにデータが複製されます。