[[Linux]]

#contents

* FUSE [#u3980507]

** FUSEとは [#v66864a8]

 FUSE - Filesystem in Userspace~
 カーネル空間ではなく、ユーザ空間で仮想のファイルシステムを構築しちゃいましょうというAPIらしいです。

 FUSEはモジュールとしてカーネルに組み込んでおき、あとはFUSEのライブラリを使えばいろいろな仮想ファイルシステムが使えるもよう。~
 sshfsなんかもあるみたいですね。

#br

* AVFS [#b86b7f73]

 FUSEを使った仮想ファイルシステムであるAVFSを導入してみます。

#br

** AVFSとは [#ja929ac3]

 AVFS - A Virtual File System~
 とある通り、linuxの仮想ファイルシステムで、圧縮ファイルを展開することなくそのまま開いてしまおうというものです。~

 圧縮ファイルを展開せずに、普段と変わることなくディレクトリ移動してファイルを開いたりコピーしたりできるようになるので、とっても便利…かも。~
 DOSのファイラーで圧縮ファイルを仮想ディレクトリとして扱うのと同じですね。 :-)

#br

** 介入行動の対象 [#qab6eba8]
 どんなファイルに対応しているかは avfs のリリースページや、 /usr/lib/avfs/extfs/{README,extfs.ini} あたりを見ると書いてあります。 

- 対応ファイル
-- tar
-- gzip
-- bzip2
-- zip
-- ar
-- rar
- extfs で対応
-- cpio
-- rpm
-- lha
-- arj
-- dpkg
-- apt
-- zoo
-- 7z
--- 他にも ftp とか audio とかいろいろ

#br

** 必要ファイルの準備 [#ged2ac80]

 AVFS導入のため、以下を用意します。

- fuse~
#ref(http://fuse.sourceforge.net/,FUSE);
- avfs~
#ref(http://avf.sourceforge.net/,AVFS);

 kernel 2.6.10(14?) 以上であれば、カーネルコンフィグで CONFIG_FUSE_FS=y,m にしてfuseを組み込んじゃいましょう。~
 うちでは CONFIG_FUSE_FS not set にしていて、カーネルのリビルドが面倒くさかったのでtar-ballを持って来てmakeしました。 ;-P

** make [#kc90d77e]

- fuseのmake~
特に何も考えずそのままmake; make installします。

-- tar-ballを展開して
 $ tar xzf fuse-2.7.4.tar.gz
 $ cd fuse-2.7.4/

-- confiture 〜 make install まで実施
 $ ./configure
 $ make
 $ su
 # make install

-- ldconfig実施
 # vi /etc/ld.so.conf
 /usr/local/lib ★libfuse.soはここに入るので、ld.so.confにパスを追加
 # ldconfig

- avfsのmake~

-- tar-ballを展開して
 $ tar xjf avfs-0.9.8.tar.bz2
 $ avfs-0.9.8

-- ''--enable-fuse'' 付きでconfigure
 $ ./configure --enable-fuse
  :
  :
 checking whether fuse is new enough... no
  :
   Building library                          : yes
   Building avfsd for fuse                   : no ★
  :
 何ぞ...~
 avfsdがmake対象にならないのでconfigure眺めて行ったら
   25046     pkg-config --atleast-version=2.6.0 fuse >/dev/null 2>/dev/null
 ここでfuseのテストフラグが失敗になってるっぽいので、configureのオプションを追加します。

-- ''--disable-fuse-test'' も付けてconfigure
 $ ./configure --enable-fuse --disable-fuse-test
  :
  :
 checking whether fuse is new enough... yes
  :
   Building library                          : yes
   Building avfsd for fuse                   : yes ★
  :
 となってくれればOKです。

-- make; make install
 $ make
 $ su
 # make install
 bindir等をいじらなければ、以下に主なバイナリとスクリプトが入ります。
 $ 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

#br

** avfsを使用する [#b8dac9a7]

 avfsのmountには mountavfs を使用します。

- vfsのmountpointを作成
 $ cd ~
 $ mkdir .avfs

- mount実施
 $ 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
 と怒られます。

- mount確認
 $ cat /proc/mounts
 rootfs / rootfs rw 0 0
  :
 fuse $HOME/.avfs fuse rw,nosuid,nodev,user_id=***,group_id=**** 0 0 ★

- 圧縮ファイルへ介入行動を開始する~
圧縮ファイルをそのままファイルシステムとして使用するには、 $HOME/.avfs/ を通して( $HOME/.avfs/ が / のイメージになる)対象ファイルを開きます。~
このとき圧縮ファイルのファイル名末尾に # を付けてアクセスすることで、その中へ入ることができます。
 $ cd .avfs/hogehoge/avfs-0.9.8.tar.bz2#/
 avfs-0.9.8.tar.bz2# $ ls
 avfs-0.9.8
 と中身が覗ければOKです。

#br

** avfsを解除する [#b8d7e285]

 avfsを解除するには umountavfs を使用します。

- umountavfsの修正~
mount確認は /proc/mounts を見ていますが、どうもgrep対象が違っているので
 #!/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
  }

- umount実施
 $ umountavfs
 unMounting AVFS on $HOME/.avfs...

- umount確認
 $ cat /proc/mounts
 rootfs / rootfs rw 0 0
  :
  :
 ★ $HOME/.avfs のmount情報が無ければOK

#br
** extfs で ulha を使用する [#b27d284c]

- ファイル拡張子が足りなかったりしたら、以下のファイルをいじくる
-- /usr/lib/avfs/extfs/extfs.ini

- lhaで固めたファイルの拡張子は普通 .lzh のはずなのでこんな感じに追加
 $ 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

- lha自体がなかったので持ってきて make install しとく~
lhaのソースはここから http://sourceforge.jp/projects/lha/
 $ tar xzf lha-1.14i-ac20050924p1.tar.gz
 $ cd lha-1.14i-ac20050924p1
 $ make
 $ su
 # make install

- mountavfs し直して適当なファイルで確認
 $ 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

#br
** http で AVFS を経由したファイルアクセス - &new(){2011/02/22}; [#b93bd629]

 あんまりオープンすぎる http サーバでやるのはどうかな? と思いますが、ブラウザベースで AVFS 経由のファイルアクセスも可能です。~
 参考になるのはこちら [[HOWTO: setup avfs / fuse on debian (etch)>http://buechse.de/HOWTO/avfs_fuse_and_apache/]] です。

 apache の RewriteRule を使用することで、 AVFS 経由のファイルアクセスで必要な hogehoge.tar.gz#/ のようなパスを生成します。 (アーカイヴの中にさらにアーカイヴが... とかだと上手く rewrite できないかな)

- avfsd の subdir module を使ってマウント
 # avfsd -o allow_other -o modules=subdir -o subdir=/opt/TGZS -o rellinks /var/www/html/vfs
            |~~~~~~~~~~    ~~~~~~~~~~~~~~    |~~~~~~~~~~~~~~~    |~~~~~~~~~~~~~~~~~~~~~~~~~
            |                                |                   +- apache の公開可能ディレクトリ (もちろん各自のサーバ設定に合わせて)
            |                                +- AVFS のルートになるディレクトリ (この配下にアクセスできるようにする)
            +- マウントしたユーザ以外でも参照できるよう allow_other を付ける

- .htaccess もしくは httpd.conf に RewriteRule を作成する
 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]
-- たとえばこんな感じ。~
.htaccess で指定する場合は、あらかじめ httpd.conf で AllowOverride FileInfo Indexes など指定しておくことが必要です。

 こうしておくと、ブラウザで http://hogehoge/vfs/fugafuga.tar.gz を開くと、自動で http://hogehoge/vfs/fugafuga.tar.gz#/ の Index を出してくれるようになります。 (ちょっと便利!!)

#br
* 更新履歴 [#h9cf5ba9]
- 2011/02/22 ''http で AVFS を経由したファイルアクセス'' を追記
- 2009/04/13 lhaも覗けるようにしたので追記
- 2008/11/08 作成

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS