compFUSEd:ディスクスペースの節約に役立つ圧縮ファイルシステム

 Filesystem in Userspace(FUSE)とは、Linuxカーネルに手を付けることなく独自ファイルシステムのインストールを可能にすることを目的としたモジュールだ。こうして追加されるファイルシステムは通常のプログラムの1つとして動作するので、共有ライブラリを使用できる他、Linuxカーネル内部からでは実行困難な処理を行わせることも可能であるのと同時に、当該マシン上のアプリケーション群から見た場合のFUSEファイルシステムは、ごく通常のファイルシステムとして認識されるのである。そして本稿で解説する compFUSEd は、自動圧縮機能を備えたFUSEファイルシステムを提供するためのツールであり、特にテキストドキュメントや実行可能ファイルといった圧縮性の高いファイルを多数扱う場合、compFUSEdの使用はディスクスペースの大幅な節約を持たらしてくれる。

 compFUSEdはオーバーレイファイルシステムの一種として設計されている。これは既存のファイルシステムを“ベース”として、それと同一のファイルシステムを若干の変更を加えた上で提示するという機構だ。そしてcompFUSEdにおける若干の変更とは、ファイルの圧縮/展開処理を意味する。つまりcompFUSEdはターゲットとなるファイルシステムへの書き込み処理に介在して、そうしたデータに圧縮を施し、その結果を“ベース”ファイルシステムに書き込むのである。こうした処理はベースファイルシステムからのファイル読み込み時においても同様に機能し、ファイルの読み出し結果としてはcompFUSEdにより展開された状態のデータが提示されることになる。しかもcompFUSEdファイルシステムによる処理の恩恵は、固有の圧縮機能を有しないアプリケーションであっても享受でき、ディスクへの保存時に自分のデータが圧縮されていたことを意識する必要すらないのだ。

 残念ながら現状でcompFUSEdのパッケージは、Ubuntu、Fedora、openSUSEのリポジトリには収録されておらず、本稿の執筆においてもバージョン200712321のソースを入手した上で、後述する手順による64ビット版Fedora 8マシンを用いたソースからのコンパイルを行っている。ダウンロードページで公開されているcompFUSEdのtarボールはcf-GISMO-date(date部は日付)という名称にされており、おそらくcfというプレフィックスはcompFUSEdを示す略号だろうが、このtarボールを展開して得られるのはCompFusedというディレクトリで、このディレクトリ名に日付やバージョン情報は付けられていない。

 compFUSEdは圧縮ライブラリの、zlib、bzip2、lzo、lzo2をサポートしているが、Fedora 8に関しては、最後2つのライブラリのコンパイルはサポートされていなかった。このように各自のLinux環境でコンパイルできなかったり不具合の生じた圧縮ライブラリをサポート対象外とさせるには、Makefileの編集が必要となる。またデフォルト設定下でビルドされたcompFUSEdは、プロファイラライブラリへのリンク作成を試みるので、こうしたリンクの依存性を取り除くにはRules.makeファイルを編集しなくてはならないようだ。更にこのビルドの場合、シンボルや共有オブジェクトに関するエラーおよび、位置独立コード(PIC:Position-Independent Code)を示す-fPICオプションの未指定時に生じる問題も解決しなくてはならなかった。PICコードの特長はメモリ上の異なる位置に読み込み可能というもので、共有ライブラリのコードをコンパイルする場合に役立つが、それは複数のライブラリが同一のアドレスを使用する場合に必要に応じた移動が行えるからである。実際私の環境では、Rules.makeのCFLAGSに-fPICオプションを追加してから「make clean all」を実行することで正常にコンパイルできるようになってくれた。

$ tar xzvf /.../cf-GISMO-200712321.tgz
$ cd ./CompFused/Gismo/
$ vi Makefile
...
#
# Set to 1 to include support
#
USE_ZLIB=1
USE_BZIP2=1
USE_LZO=0
USE_LZO2=0
...

$ vi Rules.make
CC=gcc
AR=
CFLAGS= -Wall -pedantic -g -D_FILE_OFFSET_BITS=64  -fPIC

LIBS= -lfuse
...

$ make
...

 この場合「make install」のターゲットは存在しないので、ここでのステップは手作業にて行う必要がある。

# mkdir -p /usr/local/etc/
# cp compFUSEd.conf /usr/local/etc/compFUSEd.conf
# cp cf_main /usr/local/bin/compFUSEd
# mkdir /usr/local/lib/compFUSEd/
# cp -av plugins /usr/local/lib/compFUSEd/