悪魔のごとき技術 - FUSE

ログファイルを大量に抱える必要のあるホストなんだけど、大きいディスクが調達できなかったために圧縮ファイルシステムの利用を検討する。
以前はext2に圧縮機能を付加するようなpatchがあったのだけど、最近のkernelに対してはメンテされていないようで、使えそうになかった。むしろ最近はFUSEというユーザーランドのプロセスでファイルシステムを実現する仕組みを使うのが流儀であるようだった。
ということで、圧縮ファイルシステムFUSEで使ってみた。

GitHub - libfuse/libfuse: The reference implementation of the Linux FUSE (Filesystem in Userspace) interface

こちらはFUSEの本体。普通のconfigureしてmakeするとkernelのmoduleとユーザランドで使うライブラリが出来る。

http://www.miio.net/fusecompress/

あとはこのソフトで圧縮ファイルシステムを作るだけ。ファイルシステムを作るといっても既存のファイルシステム上のディレクトリを指定してmountすることもできて、その場合は既存のファイルは透過的にopenできる。全く新しいファイルシステムを作り出すというよりは既存のファイルシステムへのアクセスに中間層を作ってそこで圧縮する感じ。
まだ実装の詳細は読み切れていないが、ファイルの状態を保持するデータベースをメモリー上に持つようで、openしたファイルの状態を覚えておいたり、バックグラウンドで圧縮するthreadを実行する機能まであったりする。
圧縮しているかしていないかはファイルの先頭に独自のシグネチャを付加して管理する方式。書式はREADMEに載っているので、こいつをmagic(5)に足しておけばfile(1)で判別も可能。umountした後はこのシグネチャが付いた圧縮済みのファイルが元のファイルシステム上に残されているという次第。特に変なsystem callを使っているわけではないので、下敷になるファイルシステムは何でも行けそう。最悪シグネチャを頼りに圧縮形式を判断して展開することも出来るだろうから、問題があってもそれほど酷い事にはならないんじゃないかな。
しかし、fusecompressはそれほど大きなソフトではないもののかなり強力な機能を提供すると感心させられた。FUSEの仕組み自体がかなり強力ということかな。