Fuseを一般ユーザ権限で(修正版)

手を出したばかりとは言え、FUSEを一般ユーザ権限での記事はあまりにも酷かった。ココに修正版を記そうと思う。

まずFUSE・FuseFSのインストールに関しては、「FuseFSをyumでインストール」や、「DebianにFUSE・FuseFSを入れるまで」で言及してみた。。。けど、今見返すと前者の記事の内容がカナーリ怪しげ。

また今回FuseFSのスクリプトを動かすのが目的としているが、FUSEを使ったプログラム全般において適応できる内容だと思う。

問題

上記によってFuseFSをインストールした後、一般ユーザ権限でさっそくFuseFSのサンプルを使おうすると。。。

$ sudo modprobe fuse   # fuseモジュールを有効に
$ ruby hello.rb mnt
fuse: failed to exec fusermount: Permission denied
/usr/lib/ruby/site_ruby/1.8/fusefs.rb:13:in `for_fd': no implicit conversion from nil to integer (TypeError)
        from /usr/lib/ruby/site_ruby/1.8/fusefs.rb:13:in `run'
        from hello.rb:20

となる。
当然だがroot権限で実行する分にはこの問題は起きない。

解法

自分なりの注釈を加えつつ順に記述していく。
目的としては、ユーザ「hoge」がFuseFSのサンプル「hello.rb」を実行できることが目標。


  1. まず現在のスタート時の環境を示しておく。

    # whoami
    root
    # uname -a
    Linux debian 2.6.18-5-686 #1 SMP Wed Oct 3 00:12:50 UTC 2007 i686 GNU/Linux
    # 

    また、上のサンプルはroot権限で実行する限りでは問題無く動作する環境。



  2. グループfuseに、ユーザを追加する。

    # adduser hoge fuse

    これで、/usr/bin/fusermountと、/dev/fuseへのアクセス権限を手に入れたことになる。



  3. /usr/bin/fusermountと、/dev/fuseパーミッションを確認します。

    # ls -l /usr/bin/fusermount
    -rwsr-x--- 1 root fuse 18368 2007-03-11 22:22 /usr/bin/fusermount
    # ls -l /dev/fuse
    crw-rw---- 1 root fuse 10, 229 2007-12-02 11:29 /dev/fuse
    #


    違っていたら。。。


    • /usr/bin/fusermountに対しては、

      # chmod 4750 /usr/bin/fusermount
      #



    • /dev/fuseに対しては、単純に、

      # chmod 660 /dev/fuse
      #

      のみでもかまいませんが、これだとシステムの再起動が行われた時に元に戻ってしまいます。
      修正するには、udevの設定ファイルの中*1からfuseに関する設定を見つけ以下のように設定します。

      KERNEL=="fuse",                 MODE="0660",    OWNER="root",GROUP="fuse"

      この設定が効いてくるのは、次回システム起動時です。



  4. 動作テスト。サンプルのhello.rbを動かしてみませう。

    # mkdir mnt
    # ruby /usr/share/doc/libfusefs-ruby1.8/example/hello.rb mnt &  
    # ls mnt
    hello.txt
    # cat mnt/hello.txt
    Hello,World!
    # fg
    [1]  + 1984 runnning     ruby /usr/share/doc/libfusefs-ruby1.8/example/hello.rb mnt
    (Ctrl+Cで終了。なにやらメッセージが返ってくるけど問題無い。)
    #



  5. Debian4.0の人向けオマケ。
    fuseを使うたびにイチイチ

    # modprobe fuse

    ってやるのが面倒な人は、/etc/modulesって設定ファイルの末尾に「fuse」と入力し、改行し、ファイルを保存してみてください。これで次回システム起動時に「/etc/init.d/module-init-tools」と言うスクリプトがmodprobeしてくれます。


以上でした。


次書くのは、FuseFSのスクリプトでマウントしたディレクトリに、スクリプト実行者以外のユーザがアクセスする方法について書けたらいいなと思う。

*1:Debian4.0だと/etc/udev/rules.d/020_permissions.rulesです。RedHat系は調査中