psqlfsはEdward Macnaghten氏によって書かれたツールで,ファイル・システムの実体として,PostgreSQLが使用できるというものである。

 Macnaghten氏「SQLエンジンがさらにスケーラブルになっていけば,何万ものユーザーが同時にテラバイト級の1つのファイル・システムを共有できるようになる。ストアド・プロジジャを使って,リアルタイムにクロス・リファレンスを取ることも可能になるかもしれない」と述べている。

 「もっとも,今のところはfunとproof of concept」とMacnaghten氏はいうが,このところ,米Microsoftが開発中のWinFSのように,ファイル・システム自体に検索機能を持たせるというトレンドがある。psqlfsは意外に可能性を秘めているかもしれない。

 psqlfsのライセンスはGPLである。psqlfsはLUFS(The Linux Userland File System)を利用して実装されているので,Linux上でのみ使用できる。

psqlfsの仕組み

 UnixやLinuxでは,ファイルやディレクトリは「ファイル・システム」を通じて管理される。ファイル・システムの実体は専用のプログラムを通じてアクセスされる何らかの記憶装置である。これらは,「マウント」という操作を通じてはじめて利用できるようになる。例えば,/usrというディレクトリは,ext3というファイル・システムを/usrという場所にマウントすることによって,特定のディスク装置などにマッピングされ,/usr以下へのアクセスは自動的にこのディスク装置へのアクセスに変換される。

図1●psqlfsとPostgreSQLとの関係
 同じファイル・システムでも,NFSではネットワーク上のディスクがアクセスの対象となる。このように,ファイル・システムを利用することにより,様々なデバイスがすべてディレクトリやファイルという統一した見え方になる。

 psqlfsでは,記憶デバイスとしてPostgreSQLを使用する。psqlfsとしてマウントされたディレクトリ以下へのアクセスは,すべてPostgreSQLへのアクセスに変換される。PostgreSQLへのアクセスは,PostgreSQLのC言語クライアントライブラリであるlibpqを通じて行われる(図1[拡大表示])。

psqlfsの利用目的

 このように書くと,psqlfsを使えばSQLを使わずにPostgreSQLのテーブルにアクセスできるようになるのではないかと期待されるむきもあるかも知れないが,それは間違いである。psqlfsでは,ファイル・システムのディスク・イメージをBYTEAを使って特定のテーブルに格納する。つまり,任意のテーブルをpsqlfsを通じてアクセスするということはできない。

 ただ,psqlfsでは個々のディレクトリやファイルはそれぞれテーブル内の各行に対応しているため,やり方によってはすべてのファイルの中身を横断的にSELECT文で検索することも可能だ(その方法については後で説明する)。

psqlfsのインストール

 前述のように,psqlfsはLUFSを利用して実装されているので,まずはLUFSを導入する必要がある。インストールにはroot権限が必要だ。以下,すべての操作はrootで行う。なお,検証はVine Linux 2.6r4上で行った(kernel 2.4.22)。

 本稿執筆時点のpsqlfsの最新版はバージョン0.01で,LUFS 0.9.7で開発されている。http://lufs.sourceforge.net/lufsよりlufs-0.9.7.tar.gzを入手しておく(ここでは/tmpに置くものとする)。そして適当な場所,ここでは ~/srcに展開するものとする。

# cd ~/src
# tar xfz /tmp/lufs-0.9.7.tar.gz

 次にpsqlfsをhttp://www.edlsystems.com/psqlfsから入手し,/tmpなどに置いておいたものを展開する。

# tar xfz /tmp/psqlfs-01.1.tar.gz

 展開してできたfilesystems/psqlfsをlufs/filesystemsに移動する。

# mv filesystems/psqlfs lufs-0.9.7/filesystems

 次にlufs-0.9.7/configure.inの次の部分:

AC_ARG_ENABLE(cardfs,
    [ --enable-cardfs     build cardfs support (default=no)],
    [ WITH_CARDFS=true ],)

のすぐ後に

AC_ARG_ENABLE(psqlfs,
    [ --enable-psqlfs     build psqlfs support (default=no)],
    [ opt_fs="$opt_fs psqlfs"],)

を挿入する。

最後の方に

    filesystems/wavfs/Makefile \

という行があるので,この直後に

    filesystems/psqlfs/Makefile \


を追加する。

 今回使用したPostgreSQLは,現時点で最新安定版の7.4.5で,標準の場所,すなわち/usr/local/pgsqlにインストールされている。これに合わせて,lufs-0.9.7/filessystems/psqlfs/Makefile.inを修正する。

CFLAGS := -O2 -Wall -lpq

という行があるので,これを

CFLAGS := -O2 -Wall -I/usr/local/pgsql/include -L/usr/local/pgsql/lib -lpq

に変更する。

 次に/etc/ld.so.confを変更する。

/usr/local/lib
/usr/local/pgsql/lib

を追加し,ldconfigコマンドを実行するか,システムを再起動する。

 実は,psqlfsのバージョン0.01にはrmdirできないバグがある。修正しよう。