ファイルシステムの保守において、デフラグメンテーションとは、ストレージ媒体上で連続していない複数のセグメントに格納されているファイルの断片化の度合いを低減するプロセスです。これは、ファイルを格納するために使用される大容量ストレージデバイスの内容を、最小限の連続した領域(フラグメント、エクステント)に物理的に整理することによって実現されます。また、圧縮によってより大きな空き領域を作成し、断片化の再発を抑制しようとします。
デフラグは、電気機械式ディスクドライブ(ハードディスクドライブ、フロッピーディスクドライブ、光ディスクメディア)上のファイルシステムにとって有益かつ重要な処理です。断片化されたファイルにアクセスする際に、ハードドライブの読み書きヘッドがディスク上の異なる領域を移動するため、読み書きヘッドを移動させて他の断片を探すことなく、断片化されていないファイルの内容全体に順次アクセスする場合よりも処理速度が遅くなります。
断片化とは、ファイルシステムが完全なファイルを一つの単位として格納するのに十分な連続領域を確保できず、既存ファイル間の隙間にファイルの一部を配置してしまう現象です。通常、隙間はファイルが削除されたときに発生しますが、場合によってはファイルに過剰な領域が割り当てられた場合にも発生します。ログファイルのように頻繁に追記されるファイル、ファイルの追加と削除、そしてファイル数の増加は、断片化とそれに伴うパフォーマンス低下の原因となります。デフラグメンテーションは、これらの問題を軽減するために行われます。

それ以外は空のディスクには、それぞれ 10 ブロックの領域を使用する 5 つのファイル A から E があります (このセクションでは、ブロックはファイルシステムの割り当て単位です。ブロック サイズはディスクのフォーマット時に設定され、ファイルシステムがサポートする任意のサイズにすることができます)。空のディスクでは、これらのファイルはすべて順番に割り当てられます (図の例 1 を参照)。ファイル B が削除される場合、2 つのオプションがあります。ファイル B の領域を後で再び使用できるように空としてマークするか、B 以降のすべてのファイルを移動して、空いている領域が最後に来るようにします。移動する必要のあるファイルが多い場合、ファイルの移動には時間がかかる可能性があるため、通常は空いている領域はそのまま残され、新しいファイル用に使用可能な領域としてテーブルにマークされます (図の例 2 を参照)。[注 1 ] 6 ブロックの領域を必要とする新しいファイル F が割り当てられると、以前ファイル B があった領域の最初の 6 ブロックに配置され、それに続く 4 ブロックは使用可能なままになります (図の例 3 を参照)。別の新しいファイルGが追加され、4ブロックしか必要としない場合、Fの後、Cの前にスペースを占有することができます(図の例4)。各ファイルセクションはドライブ全体に個別のパケットとして保存されます。ファイルが削除されると、未使用のスペースが残り、ディスクの断片化につながります。
しかし、ファイルFを拡張する必要がある場合、直後の領域が使用できなくなるため、3つの選択肢があります。
さらに、「断片化」の概念は、ディスク上に複数のエクステントを持つ個々のファイルだけに限定されるものではありません。たとえば、特定の順序で読み込まれるファイル群(プログラムの読み込み時にアクセスするファイルなど。これには、特定のDLL、各種リソースファイル、ゲームのグラフィックやオーディオなどが含まれます)は、個々のファイルが断片化されていなくても、ディスク上で順番に読み込まれていない場合は断片化されているとみなされます。読み書きヘッドは、これらの(断片化されていない)ファイルを順番にアクセスするためにランダムにシークする必要があります。ファイル群の中には、当初は正しい順序でインストールされていたものでも、グループ内の特定のファイルが削除されるにつれて、時間の経過とともにばらばらになってしまうものがあります。これは、ファイルの更新が一般的な原因です。ほとんどの更新ツールは、ファイルを更新するために、まず古いファイルを削除し、その場所に新しい更新されたファイルを書き込みます。しかし、ほとんどのファイルシステムは、新しいファイルをディスク上の同じ物理的な場所に書き込みません。そのため、無関係なファイルが、空いたスペースを埋めてしまう可能性があります。
デフラグメンテーションとは、ファイルエクステント(物理的な割り当てブロック)を移動させて、最終的にそれらを統合し、できれば1つのブロックにまとめる操作です。通常、この操作には少なくとも2つのコピー操作が必要です。1つは、ブロックをディスク上の空きスクラッチ領域に移動させて、さらに移動できるようにする操作、もう1つは、ブロックを最終的に目的の場所に移動させる操作です。このような方式では、ディスクからデータが削除されることは一切ないため、停電が発生した場合でも安全に操作を停止できます。記事の図は、その一例を示しています。
ディスクをデフラグするには、デフラグソフトウェア(「デフラグツール」とも呼ばれます)は、利用可能な空き領域内のファイルのみを移動できます。これは負荷の高い操作であり、空き領域がほとんどない、またはまったくないファイルシステムでは実行できません。デフラグ中はシステムのパフォーマンスが低下するため、ファイルシステムへの予期しない変更によってデフラグツールが混乱しないように、処理中はコンピュータを操作しないのが最善です。使用するアルゴリズムによっては、複数回実行することが有利な場合とそうでない場合があります。デフラグに伴う再編成では、ファイルの論理的な位置(ディレクトリ構造内の位置として定義されます)は変更されません。
デフラグツールは、プログラム ファイルのデフラグに加えて、プログラムの読み込みやファイルのオープンにかかる時間を短縮することもできます。たとえば、Windows 9x デフラグツールには Intel Application Launch Accelerator が含まれており、デフラグされたプログラム ファイルとその依存関係をプログラムが読み込む順序で隣り合わせに配置することで、ディスク上のプログラムを最適化し、これらのプログラムをより速く読み込むことができました。[ 1 ] Windows では、優れたデフラグツールは、プリフェッチファイルを読み込んで、これらのファイル グループをできるだけ多く識別し、アクセス シーケンスでその中のファイルを配置します。
ハードドライブの先頭では、外側のトラックは内側のトラックよりもデータ転送速度が速い。頻繁にアクセスされるファイルを外側のトラックに配置するとパフォーマンスが向上する。[ 2 ] MyDefragなどのサードパーティ製のデフラグツールは、頻繁にアクセスされるファイルを外側のトラックに移動して、これらのファイルをデフラグする。[ 3 ]
RAMキャッシュ、プラッタ回転速度の向上、コマンドキューイング(SCSI / ATA TCQまたはSATA NCQ )、データ密度の向上など、最新のハードドライブの改良により、断片化がシステムパフォーマンスに及ぼす悪影響はある程度軽減されますが、一般的に使用されるデータ量の増加により、これらの利点は相殺されます。しかし、部分的に使用されたディスクは完全に使用されたディスクよりも断片化がはるかに少ないため[ 4 ] 、最新のシステムは、現在利用可能な巨大なディスク容量から大きな恩恵を受けています。また、大容量HDDでは、同じパーティションがより狭い範囲のシリンダを占有するため、シークが速くなります。ただし、平均アクセス時間はプラッタの半回転より短くすることはできず、プラッタ回転(rpmで測定)は、過去数十年間で最も成長が遅いHDDの速度特性であるため(データ転送速度とシーク時間と比較して)、シーク回数を最小限に抑えることは、ほとんどのストレージ負荷の高いアプリケーションで依然として有益です。デフラグメンテーションとは、まさにその名の通り、ファイルごとにシーク回数を最大1回に抑え、隣接していないトラックへのシークのみをカウントすることです。
デフラグを最適化し、断片化の影響を軽減するための一般的な戦略は、書き込みよりも読み取りがはるかに多いファイルシステムのパーティションと、ファイルが頻繁に作成および削除されるより不安定な領域を分離するようにハードディスクをパーティション分割することです。ユーザープロファイルを含むディレクトリは常に変更されます(特に、Temp ディレクトリと Web ブラウザーのキャッシュは、数日で削除される数千のファイルを作成します)。ユーザープロファイルのファイルが専用のパーティションに保持されている場合(UNIX推奨ファイルシステムで一般的に行われているように、通常は /var パーティションに格納されます)、デフラグツールは他のディレクトリのすべての静的ファイルを処理する必要がないため、より効率的に動作します。(または、デフラグツールに特定のファイルパスを除外するように指示することもできます。)書き込みアクティビティが比較的少ないパーティションの場合、デフラグツールは今後少数の新しいファイルのみをデフラグする必要があるため、最初のデフラグ後にデフラグ時間が大幅に改善されます。
移動できないシステムファイル、特にスワップファイルが存在すると、デフラグが妨げられることがあります。これらのファイルは、オペレーティングシステムが使用されていないときに安全に移動できます。たとえば、ntfsresize はこれらのファイルを移動してNTFSパーティションのサイズを変更します。Pag eDefragツールは、 GUI がロードされる前の起動時に実行することで、スワップファイルやWindows レジストリを格納するファイルなどの Windows システムファイルをデフラグできます。Windows Vista 以降、この機能は完全にはサポートされておらず、更新もされていません。
NTFSでは、ディスクにファイルが追加されると、新しいファイルの情報を格納するためにマスターファイルテーブル(MFT)が拡張されます。ファイルが邪魔をしてMFTを拡張できない場合、MFTにフラグメントが追加されます。初期のWindowsバージョンでは、パーティションがマウントされている間は安全にデフラグできなかったため、MicrosoftはデフラグAPIにハードブロックを実装しました。しかし、Windows XP以降、WindowsのデフラグAPIが改良され、移動操作をサポートするようになったため、MFTをデフラグできるデフラグツールが増えています。[ 5 ]改善が加えられたにもかかわらず、MFT の最初の 4 つのクラスターは Windows デフラグメンテーション API では移動できないため、一部のデフラグツールは MFT を 2 つのフラグメントに格納します。最初の 4 つのクラスターはディスクがフォーマットされたときに配置された場所に、残りの MFT はディスクの先頭 (またはデフラグツールの戦略が最適と判断した場所) に格納されます。
従来の電気機械式ハードディスクドライブからデータを読み取る場合、ディスクコントローラはまず、特定のフラグメントが存在するトラックにヘッドを比較的ゆっくりと移動させ、次にディスクプラッタが回転してフラグメントがヘッドに到達するまで待機する必要があります。ソリッドステートドライブ(SSD)は可動部品のないフラッシュメモリに基づいているため、フラッシュメモリ上のファイルフラグメントへのランダムアクセスはこの遅延の影響を受けず、アクセス速度を最適化するためのデフラグは不要です。さらに、フラッシュメモリは故障する前に書き込みできる回数が限られているため、デフラグは実際には有害です(壊滅的な故障の緩和を除く)。ただし、Windowsはファイルシステムが最大断片化許容値(メタデータがこれ以上ファイルフラグメントを表現できなくなる状態)に達するのを防ぐために、SSDを自動的に(ただしそれほど強力ではない方法で)デフラグします。最大断片化制限に達すると、その後のディスクへの書き込み試行は失敗します。[ 6 ]

e2defrag ext2は、後継のext3では動作しないオフラインデフラグツールを使用します。ただし、ext3ファイルシステムのデフラグには、他のプログラム、または[ 17 ]などのファイルシステムに依存しないプログラムを使用できます。ext4はext3とある程度下位互換性がdefragfsあり、そのため、デフラグメンテーションプログラムからのサポートは概ね同じです。現在、e4defragを使用して、オンラインデフラグメンテーションを含むext4ファイルシステムのデフラグメンテーションを行うことができます。fsadmには、デフラグ操作を含むユーティリティが搭載されています。defragfsはIBMオペレーティングシステム上でユーティリティとして利用できます。 [ 18 ]reallocate。xfs_fsr。ほとんどのハードディスクでは、ハードディスクの先頭は末尾よりもかなり高速で、場合によっては200パーセントも速くなります。* HD Tuneなどのユーティリティを使用して、これを自分で測定できます。そのため、MyDefragはすべてのファイルをディスクの先頭に移動するように設計されています。
これまで見てきたように、HFS+ ボリュームは Mac OS X 10.3.x 上で断片化にかなり強いようで、断片化が積極的な対策 (デフラグツールなど) を必要とするほど深刻な問題になるとは考えていません。