Linux

FUSE

FUSEとは

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

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

 

AVFS

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

 

AVFSとは

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

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

 

介入行動の対象

 どんなファイルに対応しているかは 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 とかいろいろ
 

必要ファイルの準備

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

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

make

  • 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
 

avfsを使用する

 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です。
 

avfsを解除する

 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
 

extfs で ulha を使用する

  • ファイル拡張子が足りなかったりしたら、以下のファイルをいじくる
    • /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
 

http で AVFS を経由したファイルアクセス - &new([nodate]){date}: Invalid date string;

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

 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 を出してくれるようになります。 (ちょっと便利!!)

 

更新履歴

  • 2011/02/22 http で AVFS を経由したファイルアクセス を追記
  • 2009/04/13 lhaも覗けるようにしたので追記
  • 2008/11/08 作成

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-02-22 (火) 22:42:14 (2916d)