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」を実行できることが目標。
まず現在のスタート時の環境を示しておく。# 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権限で実行する限りでは問題無く動作する環境。
グループfuseに、ユーザを追加する。# adduser hoge fuse
これで、/usr/bin/fusermountと、/dev/fuseへのアクセス権限を手に入れたことになる。
/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 #
違っていたら。。。
動作テスト。サンプルの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で終了。なにやらメッセージが返ってくるけど問題無い。) #
Debian4.0の人向けオマケ。
fuseを使うたびにイチイチ# modprobe fuse
ってやるのが面倒な人は、/etc/modulesって設定ファイルの末尾に「fuse」と入力し、改行し、ファイルを保存してみてください。これで次回システム起動時に「/etc/init.d/module-init-tools」と言うスクリプトがmodprobeしてくれます。
次書くのは、FuseFSのスクリプトでマウントしたディレクトリに、スクリプト実行者以外のユーザがアクセスする方法について書けたらいいなと思う。