FUSE - Filesystem in Userspace
カーネル空間ではなく、ユーザ空間で仮想のファイルシステムを構築しちゃいましょうというAPIらしいです。
FUSEはモジュールとしてカーネルに組み込んでおき、あとはFUSEのライブラリを使えばいろいろな仮想ファイルシステムが使えるもよう。
sshfsなんかもあるみたいですね。
FUSEを使った仮想ファイルシステムであるAVFSを導入してみます。
AVFS - A Virtual File System
とある通り、linuxの仮想ファイルシステムで、圧縮ファイルを展開することなくそのまま開いてしまおうというものです。
圧縮ファイルを展開せずに、普段と変わることなくディレクトリ移動してファイルを開いたりコピーしたりできるようになるので、とっても便利…かも。
DOSのファイラーで圧縮ファイルを仮想ディレクトリとして扱うのと同じですね。 :-)
どんなファイルに対応しているかは avfs のリリースページや、 /usr/lib/avfs/extfs/{README,extfs.ini} あたりを見ると書いてあります。
AVFS導入のため、以下を用意します。
kernel 2.6.10(14?) 以上であれば、カーネルコンフィグで CONFIG_FUSE_FS=y,m にしてfuseを組み込んじゃいましょう。
うちでは CONFIG_FUSE_FS not set にしていて、カーネルのリビルドが面倒くさかったのでtar-ballを持って来てmakeしました。 ;-P
$ tar xzf fuse-2.7.4.tar.gz $ cd fuse-2.7.4/
$ ./configure $ make $ su # make install
# vi /etc/ld.so.conf /usr/local/lib ★libfuse.soはここに入るので、ld.so.confにパスを追加 # ldconfig
$ tar xjf avfs-0.9.8.tar.bz2 $ avfs-0.9.8
$ ./configure --enable-fuse : : checking whether fuse is new enough... no : Building library : yes Building avfsd for fuse : no ★ :何ぞ...
25046 pkg-config --atleast-version=2.6.0 fuse >/dev/null 2>/dev/nullここでfuseのテストフラグが失敗になってるっぽいので、configureのオプションを追加します。
$ ./configure --enable-fuse --disable-fuse-test : : checking whether fuse is new enough... yes : Building library : yes Building avfsd for fuse : yes ★ :となってくれればOKです。
$ make $ su # make installbindir等をいじらなければ、以下に主なバイナリとスクリプトが入ります。
$ ls -l /usr/bin/*avfs* -rwxr-xr-x 1 root root 1239 11月 7 07:35 /usr/bin/avfs-config -rwxr-xr-x 1 root root 784848 11月 7 07:35 /usr/bin/avfsd -rwxr-xr-x 1 root root 466 11月 7 07:35 /usr/bin/mountavfs -rwxr-xr-x 1 root root 411 11月 7 07:35 /usr/bin/umountavfs
avfsのmountには mountavfs を使用します。
$ cd ~ $ mkdir .avfs
$ mountavfs Mounting AVFS on $HOME/.avfs...mount済みなのに mountavfs を実行すると
fuse: mountpoint is not empty fuse: if you are sure this is safe, use the 'nonempty' mount optionと怒られます。
$ cat /proc/mounts rootfs / rootfs rw 0 0 : fuse $HOME/.avfs fuse rw,nosuid,nodev,user_id=***,group_id=**** 0 0 ★
$ cd .avfs/hogehoge/avfs-0.9.8.tar.bz2#/ avfs-0.9.8.tar.bz2# $ ls avfs-0.9.8と中身が覗ければOKです。
avfsを解除するには umountavfs を使用します。
#!/bin/sh # umountavfs -- program to unmount avfs file system # and unload avfsd daemon. # companion program to mountavfs # will check to see if avfsd is mounted and then # unmount using fusermount. # last updated 20051201 # suggested use: in a logout script or wm exit routine MntDir=${HOME}/.avfs grep -q "avfsd ${MntDir}" /proc/mounts && { ★ echo unMounting AVFS on $MntDir... fusermount -u $MntDir }修正します。
$ su # cp -a /usr/bin/umountavfs /usr/bin/umountavfs.org修正は以下diffイメージで。
# diff -brNup /usr/bin/umountavfs.org /usr/bin/umountavfs --- /usr/bin/umountavfs.org 2008-11-07 07:35:17.000000000 +0900 +++ /usr/bin/umountavfs 2008-11-08 16:06:53.000000000 +0900 @@ -9,7 +9,7 @@ # suggested use: in a logout script or wm exit routine MntDir=${HOME}/.avfs -grep -q "avfsd ${MntDir}" /proc/mounts && { +grep -q "fuse ${MntDir}" /proc/mounts && { echo unMounting AVFS on $MntDir... fusermount -u $MntDir }
$ umountavfs unMounting AVFS on $HOME/.avfs...
$ cat /proc/mounts rootfs / rootfs rw 0 0 : : ★ $HOME/.avfs のmount情報が無ければOK
$ diff -brNup avfs-0.9.8.tar.bz2#/avfs-0.9.8/extfs/extfs.ini /usr/lib/avfs/extfs/extfs.ini --- avfs-0.9.8.tar.bz2#/avfs-0.9.8/extfs/extfs.ini 2006-04-06 02:19:05.000000000 +0900 +++ /usr/lib/avfs/extfs/extfs.ini 2009-04-13 00:07:58.000000000 +0900 @@ -5,7 +5,7 @@ u7z .7z # Popular pc archivers # uzip .zip .jar uzoo .zoo -ulha .lha .lhz +ulha .lzh .lha .lhz # urar .rar uha # For arj usage you need special patch to unarj
$ tar xzf lha-1.14i-ac20050924p1.tar.gz $ cd lha-1.14i-ac20050924p1 $ make $ su # make install
$ umountavfs $ mountavfs $ lha l test.lzh PERMISSION UID GID SIZE RATIO STAMP NAME ---------- ----------- ------- ------ ------------ -------------------- -rw-r--r-- ****/**** 10 100.0% Apr 13 21:13 test.txt ---------- ----------- ------- ------ ------------ -------------------- Total 1 file 10 100.0% Apr 13 21:13 $ cat .avfs/hogehoge/test.lzh#/test.txt TEST FILE
あんまりオープンすぎる http サーバでやるのはどうかな? と思いますが、ブラウザベースで AVFS 経由のファイルアクセスも可能です。
参考になるのはこちら HOWTO: setup avfs / fuse on debian (etch) です。
apache の RewriteRule を使用することで、 AVFS 経由のファイルアクセスで必要な hogehoge.tar.gz#/ のようなパスを生成します。 (アーカイヴの中にさらにアーカイヴが... とかだと上手く rewrite できないかな)
# avfsd -o allow_other -o modules=subdir -o subdir=/opt/TGZS -o rellinks /var/www/html/vfs |~~~~~~~~~~ ~~~~~~~~~~~~~~ |~~~~~~~~~~~~~~~ |~~~~~~~~~~~~~~~~~~~~~~~~~ | | +- apache の公開可能ディレクトリ (もちろん各自のサーバ設定に合わせて) | +- AVFS のルートになるディレクトリ (この配下にアクセスできるようにする) +- マウントしたユーザ以外でも参照できるよう allow_other を付ける
Options +Indexes RewriteEngine On RewriteBase /vfs RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^(.*?.zip)$ $1/avfs/ [R,L] RewriteRule ^(.*?.tar.[bg]z2*)$ $1/avfs/ [R,L] RewriteRule ^(.*?.t[bg]z2*)$ $1/avfs/ [R,L] RewriteRule ^(.*)/avfs/(.*)$ $1\%23/$2 [NS,L,NE]
こうしておくと、ブラウザで http://hogehoge/vfs/fugafuga.tar.gz を開くと、自動で http://hogehoge/vfs/fugafuga.tar.gz#/ の Index を出してくれるようになります。 (ちょっと便利!!)