3年半ほど前に、デフラグに関して下記の記事を書きました。
【参考】独学Linux:Linuxでデフラグが必要のない理由
その後、いろいろな方からのご意見があり、「まったく必要がないわけではなくサーバ用途ではある程度断片化は起こる」「Windowsでも現在のNTFSではLinuxと同様な処置がなされているので記事内容は古い情報に基づいている」「ただしWindowsの方が断片化が起こりやすいという傾向はある」ということがわかりました。

普段は気にしていなかったし、気にする必要はないのかも知れません。ただ、実際に確認する手段を知らないのもどうかなと思い、調べてみたところ、どの程度正確かはわかりませんが、Gentoo Linuxのフォーラムでディレクトリ単位で断片化されている割合を表示するperlスクリプトを見つけました。また、これもちゃんと機能している保証はありませんが、デフラグを実行するスクリプトもありましたので、実際にUbuntu11.04とFedora15で試してみました。

断片化の測定とデフラグの実行


defrag/bootディレクトリに対して、frag.plで断片化の割合を測定し、defragでデフラグを実行し、再度frag.plで断片化の割合を測定し直したところ。はじめから「約0.448%」と低い値ですが、デフラグの実行後、「0%」の表示になりました。

なお、UbuntuではShakeというパッケージがPPAで配布されていましたが、Maverickまでしか対応していないので、そちらは使えません。

断片化の測定

断片化の状態を測定するには、下記のperlスクリプトを使います。これはGentooのフォーラムからの転載です。

#!/usr/bin/perl -w

#this script search for frag on a fs
use strict;

#number of files
my $files = 0;
#number of fragment
my $fragments = 0;

#number of fragmented files
my $fragfiles = 0;

#search fs for all file
open (FILES, "find " . $ARGV[0] . " -xdev -type f |");
while (defined (my $file = <FILES>)) {
        #quote some chars in filename
        $file =~ s/!/\\!/g;
        $file =~ s/#/\\#/g;
        $file =~ s/&/\\&/g;
        $file =~ s/>/\\>/g;
        $file =~ s/</\\</g;
        $file =~ s/\$/\\\$/g;
        $file =~ s/\(/\\\(/g;
        $file =~ s/\)/\\\)/g;
        $file =~ s/\|/\\\|/g;
        $file =~ s/'/\\'/g;
        $file =~ s/ /\\ /g;
        #nb of fragment for the file
        open (FRAG, "filefrag $file |");
        my $res = <FRAG>;
        if ($res =~ m/.*:\s+(\d+) extents? found/) {
                my $fragment = $1;
                $fragments+=$fragment;
                if ($fragment > 1) {
                        $fragfiles++;
                }
                $files++;
        } else {
                print ("$res : not understand for $file.\n");
        }
        close (FRAG);
}
close (FILES);
print ( $fragfiles / $files * 100 . "% non contiguous files, " . $fragments / $files . " average fragments.\n");


このスクリプトを「frag.pl」という名称でホームディレクトリに保存して、実行するユーザに対して実行権を与えます。

$ chmod 750 ~/frag.pl

このコマンドは、次のように測定するディレクトリを指定することで、ディレクトリ内のファイルに対して断片化の測定を行います。

$ sudo ~/frag.pl /tmp (←/tmpディレクトリ内のファイルに対して実行する場合)

(出力例1)約0.496%のファイルが断片化されている
  0.496277915632754% non contiguous files, 1.00992555831266 average fragments.

(出力例2)断片化されているファイルがない
  0% non contiguous files, 1 average fragments.

デフラグの実行

デフラグを実行するスクリプトは、下記のサイトで配布されています。現在もメンテナンスされているかどうかは不明ですが、最新版は2010年3月29日付けの「deflag-0.08」というバージョン名になっています。

■ 配布サイト:defrag-0.08

ここで配布されているdefragというファイルを、同名のdefragという名称でホームディレクトリに保存し、実行権を与えます。

$ chmod +x defrag

このコマンドは、測定するディレクトリに移動して実行することで、ディレクトリ内のファイルに対してデフラグを実行します。

$ cd /tmp (←/tmpディレクトリ内のファイルに対して実行する場合、/tmpに移動する)
$ sudo ~/defrag (←カレントディレクトリでデフラグを実行する)

ディレクトリ内に含まれるファイル数が多かったり、ファイルサイズの大きなファイルが含まれていると、長時間を要する場合があります。終了後、frag.plで確認して効果が見られない場合は、もう一度実行してみるといいでしょう。

デスクトップ用途で普通に使用している分には、デフラグする必要はないです。というのも、デフラグが必要になる頃には、新しいバージョンに入れ替えたり、新しいPCに乗り換えたりしていると思われるためです。また、今回の記事はあくまで参考ということですので、商用のサーバなどでは専用のツールを利用された方がいいと思います。