fslintによるファイルシステムの整理
ファイルシステムのメンテナンスは管理者にとって煩わしい仕事だ。月日が経つと、同じファイルの複数のコピー、もはや存在しないファイルをポイントするソフトリンク、無意味に残留している一時ファイル、デバッグ情報がまだ取り去られていないインストール済みのバイナリなどが増えてくる。fslintは、こうした厄介なファイルを見つけてファイルシステムを整理するのに便利である。
fslintのパッケージは、Ubuntu HardyのUniverseコンポーネントに含まれており、Fedora 9のリポジトリでも入手できる。現在のところopenSUSE用のパッケージは存在しない。私は32ビットのFedora 9マシンでバージョン2.28のfslintを用いてソースからこれをビルドした。fslintはPythonで書かれており、GTK+2とlibglade2も利用するので、それらと、それらに対応するPythonバインディングを最初にインストールしておく必要がある。
fslintは、解凍されたtarアーカイブから直接実行できる(以下のリストの前半を参照)。また、手作業でシステムにインストールすることもできる(リストの後半を参照)。fslint-guiコマンドを実行すると、GTK+2グラフィカルユーザーインタフェース(GUI)が立ち上がる。その他のコマンドとしてfslintがあり、さらに接頭辞find
で始まる一連のコマンド(重複を見つけるfindup
など)がある。これらはいずれもコマンドラインツールである。
$ tar xzf /home/ben/Download/fslint-2.28.tar.gz $ cd ./fslint* $ ./fslint-gui $ su -l # prefix=/usr/local # sharedir=$prefix/share/fslint # mkdir -p $sharedir # chmod o+rx $sharedir # cp -av doc $sharedir # chown root.root $sharedir # chown -R root.root $sharedir # chmod o=rx $sharedir # chmod o=r $sharedir # install -m 444 fslint.desktop $prefix/applications # install -pm 644 fslint.glade fslint_icon.png $sharedir # ln -s $sharedir/fslint_icon.png $prefix/share/pixmaps/fslint.png # install -m 444 man/fslint* $prefix/man/man1 # make -C po install # install -m 755 fslint-gui $prefix/bin # cp -av fslint $sharedir # chmod -R 555 $sharedir/fslint # cd $prefix/bin # perl -pi -e 's|^liblocation=.*$|liblocation="/usr/local/share/fslint" |' fslint-gui # perl -pi -e 's|^locale_base=.*$|locale_base=None |' fslint-gui
上記の一連のインストールコマンドの前半で/usr/local/share/fslintに新しいディレクトリが作成され、ドキュメントファイルがインストールされる。その後、デスクトップ、glade、アイコン、manページがインストールされ、さらにmakeを使用してローカライズ用のファイルがインストールされる。最後の2つのperlコマンドはPythonコードfslint-guiにハードコードされたパスを変更するもので、これによりgladeファイルやその他のコマンドが正しいパスで探索されるようになる。fslint-guiはデフォルトでは、実行ディレクトリでgladeファイルを探す。このデフォルトの設定により解凍後のtarアーカイブで直接fslint-guiを実行できるわけだが、gladeファイルはコマンドと同じディレクトリに置かないのが普通である。
以下はfslintのメインウィンドウである。このウィンドウの一番上の部分で、検索対象パスを絞り込んだり、それらのディレクトリを再帰的に探索するかどうか指定したりできる。Advanced search parametersタブでは、検索から除外するパスと、実行するfind
コマンドに直接渡す特別なパラメータを設定できる。無視するパスのリストには、デフォルトで/tmp、.svn、CVS、.git、/dev、/sys、/procが含まれている。
このウィンドウの本体には縦に並んだ複数のタブがあり、各タブで定義されている特定のlintテストを実行できる。lintタブを変更したときは、Findボタンをクリックして検索を再度実行することを忘れないでもらいたい。特定のlintタブを表示している間にFindを実行した場合、その後、lintタブを変更しても前の検索の結果が現在のタブに表示されていると勘違いして思わぬ落とし穴にはまることがある。
Duplicatesタブでは、ファイルに複数のコピーが存在するか調べることができる。この重複ファイルの検出では、最初に2つのファイルのサイズが同じかチェックされ、次にファイルがハードリンクでないことが確認され、その上で、両ファイルのMD5を計算してファイルが同じかどうか調べられる。同じファイルについて1つ以上の重複が見つかったときは、同一ファイルのグループごとにヘッダー行が表示され、重複がいくつ存在し、複数のコピーを保存するためにどれだけのスペースが無駄に使われているかが報告される。上記のスクリーンショットでは、私の作成した少数のテストファイルについて重複結果が示されている。重複の1つを選択すると、コンテキストメニューでファイルの操作(open、copy、rename)を行える。fslintではファイルを開くためにxdg-openが使われるので、一般的な多くのファイルタイプについて、普段見慣れたアプリケーションが開始されるはずである。
Installed packagesタブが表示されているときFindをクリックすると、PCにインストールされているすべてのパッケージが表示される。Installed packagesリストに表示されるパッケージに関してコンテキストメニューは存在しない。fslintをroot権限で実行している場合は、選択したパッケージをDeleteボタンで削除できる。
Bad namesタブでは、ファイル名のUTF-8エンコーディングが正しくないファイルを見つけることができる。Name clashesタブでは、ファイルのすべてのエイリアス(名前は同じだが、別のディレクトリに存在するファイル)を見つけることができる。ファイルのすべてのソフトリンクとハードリンクもファイルのエイリアスとしてリストされる。名前が同じでディレクトリの異なるファイルを見つける機能は、ファイルを特定のディレクトリにコピーするときや、大文字と小文字が区別されないファイルシステムにコピーするときに便利である。残念ながら、コマンドライン版のfindsn
ユーティリティ(Name clash検索を実行)の-c
オプションはGUIには実装されていない。この-c
オプションを使用すると、同じディレクトリ内に存在するファイルで、大文字と小文字の違いを除いてファイル名が一致するファイルだけを表示するように検索の対象を絞り込むことができる。これらのファイルを、大文字と小文字が区別されないファイルシステムにコピーすると問題が生じる。ディレクトリツリーをフラッシュドライブ上のフラットな構造にコピーしたことがあるなら、名前の衝突(name clash)を検出する機能がいかに役立つか理解できるだろう。
Temp filesタブでは、残留している一時ファイルを見つけることができる。検索対象をコアファイルだけに制限し、さらに指定の日数を超えたファイルだけが報告されるようにすることもできる。通常、fslintでは一時ファイルかどうか確認するためにファイル名がチェックされる。たとえば、名前の末尾が~、.swp、.v、.bakで終わるファイルや名前の先頭に#文字が付くファイルである。コアファイルのテストでも最初にファイル名をチェックして、core
という文字列がファイル名のどこかに含まれていないか確認されるが、それに続く別のテストでファイルが本当にコアデバッグファイルであるか確認することが試みられる。
Bad symlinksタブでは、未決リンク(リンク先のファイルが削除されてしまっているシンボリックリンク)、不正リンク(絶対リンクのリンク先のパスが、そのリンク自体を含むディレクトリ内かディレクトリの配下にあるケース)、冗長リンク("/./"や"///,"を含むリンク)、あるいは単純にすべての絶対リンクまたは相対リンクを見つけることができる。
Bad IDsタブでは、システムに認知されていないユーザーIDもしくはグループIDを持つファイルまたはディレクトリを見つけることができる。この種のファイルはNFS共有に存在する可能性がある。あるいは、tarアーカイブを解凍したとき、tarアーカイブの作成者と同じユーザー名やグループ情報がPC上に存在しないときにも、この種のファイルが生じる可能性がある。しかし、GUIでBad IDs lintテストを実行すると、いつもexceptions.NameErrorが返され、このテストがうまくいったことはない。
Empty directoriesタブでは、名前の通り空のディレクトリが検索される。Redundant whitespaceタブでは、適切に字下げされていないファイルや行の最後に空白を含むファイルを見つけることができる。
Non stripped binariesタブでは、登録したパスまたは$PATHのディレクトリを検索して、デバッグ情報がまだ取り去られていない実行可能ファイルを見つけることができる。アプリケーションの開発中はバイナリにデバッグ情報を付加しておきたいものだが、バイナリからデバッグ情報を取り去ることで、メモリを節約し、起動時間を短縮することができる。
fslintでは、各lintタブに対応するコマンドラインユーティリティも提供されている。
重複するファイルや、ユーザーIDもしくはグループIDの正しくないファイルを見つけることは、ファイルシステムから余計なゴミを取り除くのに有効である。不良リンクを検出する機能には、よく使われる未決リンクの検出機能を初めとして、もっと完璧を期する人向けに、その定義自体が部分的に重複しているようなリンクを見つける機能まである。これらのリンクから冗長部分を自動的に取り除いてリンクを手際よく作り直す機能があれば、さらに完璧だったろう。
Ben Martinは、ここ10年以上ファイルシステムに取り組んできた。博士号を取得し、現在はlibferris、各種ファイルシステム、検索ソリューションを中心にコンサルティングサービスを手がけている。