![]() |
![]() |
Aug 2007
夏休みになって時間が取れたので懸案であった問題に取り組んでみた。
MacFUSE を使って Plan 9 ホストのファイルシステムを Mac のノートブックにマウントする実験である。ノートブックは PowerBook と MacBook を試した。いずれもマウントに成功した。
FUSE(Filesystem in Userspace) を使うと、ユーザースペースのプログラムによってファイルシステムを構成できる。このメリットは計り知れない。例えば
などを挙げる事ができる。ユーザはファイルシステムに対して多様なニーズとアイデアを持っており、カーネルを拡張する事なく、必要に応じてファイルシステムの一部として使えるようになった訳である。FUSE は現在カーネルに組み込まれている多くのファイルシステムを時代遅れのものとし、カーネルのスリム化に役立つであろう。
ファイルシステムをユーザスペースで構成するアプローチは Plan 9 由来のものである。
現在 Plan 9 の開発の中心になって活躍している Russ Cox は次のように述べている。
From: rsc@plan9.bell-labs.com Subject: [9fans] user-level file systems for Linux Date: 2004年2月19日 10:57:42:JST To: 9fans@cse.psu.edu Reply-To: 9fans@cse.psu.eduThere is a user-level file system driver for Linux called FUSE that has just released a new stable version:
http://sourceforge.net/forum/forum.php?forum_id=350517
They have user-level servers to mount various archives and various network protocols (http, ftp, smb).The protocol itself looks fairly similar to the old 9P:
http://tinyurl.com/28f2yThere is another similar project called LUFS
http://lufs.sourceforge.net/lufs/
though it seems more complicated than necessary and makes at least one (imo) critical mistake: no fids.Actually there have been a handful of projects doing similar things over the past few years, and they've all died out. I'm optimistic about FUSE because it's almost an exact translation of the VFS layer, meaning that it's simple and as expressive as possible.
Russ
MacFUSE は OS X 10.4 以降で使える。発行元の Google のページには次のように書かれている。
Examples of file systems that work and have been tested (to varying degrees) include sshfs, ntfs-3g (read/write NTFS), ftpfs (read/write FTP), wdfs (WebDAV), cryptofs, encfs, bindfs, unionfs, beaglefs (yes, including the entire Beagle paraphernalia), and so on.
(http://code.google.com/p/macfuse/)
SpotlightFS と sshfs しか Google のページには見つからないが、これらのプロジェクトに関しては
http://fuse.sourceforge.net/wiki/index.php/FileSystems
に詳しい一覧が載っている。
http://code.google.com/p/macfuse/
から
MacFUSE-Core-0.4.0.dmg
をダウンロードする。
インストールすると /dev/fuse0, ..., /dev/fuse15 までが作成される。
動作確認には SpotlightFS を使うのが簡便であろう。
Gogle のページには次の例が載ってはいるが...
$ mkdir /Volumes/SpotlightFS/Hasselhoff $ ls -lrt /Volumes/SpotlightFS/Hasselhoff [... output omitted to avoid embarrassment ...]
mkdir が効かない!
-bash$ mkdir /Volumes/SpotlightFS/Google mkdir: /Volumes/SpotlightFS/Google: Permission denied -bash$ ls -ld /Volumes/SpotlightFS dr-x------ 2 arisawa arisawa 0 Aug 20 11:58 /Volumes/SpotlightFS -bash$ ls -l /Volumes/SpotlightFS total 0 dr-x------ 2 arisawa arisawa 0 Aug 20 11:58 SmarterFolder -bash$
chmod も効かない!
-bash$ chmod 700 /Volumes/SpotlightFS -bash$ ls -ld /Volumes/SpotlightFS dr-x------ 2 arisawa arisawa 0 Aug 20 12:08 /Volumes/SpotlightFS -bash$
これは使い方の説明が悪いのだ。ネット上の次の記事を見つけて解決:
http://www.mail-archive.com/macfuse-devel@googlegroups.com/msg00202.html
まず SpotlightFS を立ち上げておいて
Finder ⇒ ファイル ⇒ 新規スマートフォルダ
によって検索する。それを「保存済みの検索条件」に名前を付けて保存する。するとその結果が
/Volumes/SpotlightFS/
に反映する。
macwiki http://macwiki.sourceforge.jp/wiki/index.php/MacFUSE の説明
SporlightFS を起動すると、「SpotlightFS」というボリュームがマウントされます。このボリューム内にディレクトリを作成すると、作成したディレクトリ名を使って Spotlight の検索がおこなわれ、その結果がディレクトリ中にファイルとして表示されるようになります。
が悪い! 次のように書き換えるべきであろう。
SporlightFS を起動すると、「SpotlightFS」というボリュームがマウントされます。ファインダーから新規スマートフォルダを実行し Spotlight の検索を行い、その結果を「保存済みの検索条件」に名前を付けて保存すると、その名前が「SpotlightFS」に生成されます。
http://journal.mycom.co.jp/column/osx/235/index.html
http://journal.mycom.co.jp/column/osx/213/index.html
http://code.google.com/p/macfuse/
http://fuse.sourceforge.net/
http://macwiki.sourceforge.jp/wiki/index.php/MacFUSE
http://code.google.com/p/macfuse/wiki/MACFUSE_FS_SPOTLIGHTFS
http://code.google.com/p/macfuse/downloads/list
ネットの記事を見ていると FUSE の能力を示すデモとして sshfs が注目されているようだ。確かに sshfs は UNIX ユーザにとっては驚きであろう。しかし僕としてはこのようなまがい物ではなく、リモートファイルシステムとの本物のリンクが欲しい。Plan 9 の 9P2000 は本物だ。
Mac の FUSE を使って Plan 9 のファイルシステムをマウントするには MacFUSE の他に aka plan9port が必要である。aka plan9port は PowerPC Mac、intel Mac 共にサポートしている。
aka plan9port は http://swtch.com/plan9port/ で手に入る。
plan9port のインストールは簡単で /usr/local/plan9 にソースを展開して
./INSTALL
を実行し、後は
/usr/local/plan9 を環境変数 PLAN9 に設定し
/usr/local/plan9/bin を環境変数 PATH に追加する
だけでよい*。僕は OSX のシェルでは bash を使っている。以下は僕の $HOME/.profile (の一部)である。
PLAN9=/usr/local/plan9 export PLAN9 PATH=$PATH:$PLAN9/bin export PATH
$PLAN9/ndb/local の設定が必要になる。クライアントは Mac のノートブック。僕は Mac のノートブックを2つ持っている。PowerBook と MacBook である。いずれも OSX 10.4 環境下で動いている。以下それらを各々 pbook と mbook と呼ぶ。どちらで行っても動作に違いはない。そこで、ここでは pbook での実験のみを示す。
マウントするリモートホストは 3 つを試した。
太字で示したのはマシン名であり、以下この名前で説明する。
ここでは Plan 9 端末風にディレクトリを構成する。メリットは
逆にディメリットは、
事にある。最後に述べたディメリットに関しては、ノートパソコンであるから問題にはならない。
実験した日には研究室にある認証サーバ hera は停電のためにダウンしていた。しかし pc は認証サーバーと関係なく動いているので問題はない。
pc に接続するためには、pc の factotum には次の内容が必要である。
key dom=pc proto=p9sk1 user=arisawa !password=xxxxxxxx
xxxxxxxx はパスワードである。
以下にマウントに至るまでの pbook で実行するコマンド手順を示す。
-bash$ mkdir /srv # needs only once -bash$ mkdir -p /n/pc # needs only once -bash$ NAMESPACE=/srv -bash$ export NAMESPACE -bash$ factotum # then /srv/factotum is created -bash$ 9fs pc !adding key: role=client proto=p9sk1 dom=pc user[arisawa]: password: ! -bash$ 9 mount /srv/pc /n/pc kextload: /System/Library/Filesystems/fusefs.fs/Support/fusefs.kext loaded successfully -bash$ ls /n/pc 386 NOTICE cfg lp rc 68000 acme cron mail sparc 68020 adm dist mips sys LICENSE alpha env mnt tmp LICENSE.afpl amd64 fd n update LICENSE.gpl arm lib power usr -bash$
ディレクトリ /srv と /n/pc はあらかじめ作成しておく。また NAMESPACE の設定と export は .profile で行うのが良いであろう。
9 コマンドは plan9port のコマンド名が UNIX のコマンド名と衝突する場合に plan9port のコマンドを実行してくれる。
factotum を実行すると /srv/factotum が生成される。"9fs pc" を実行すると /srv/pc が生成される。/srv に生成されたものはソケットである。
Plan 9 の 9fs はマウントまでやってくれるが、plan9port の 9fs はやらない。9fs は rc スクリプトで内部で srv を実行している。また、plan9port の mount も rc スクリプトで、ソースを見るに BSD 系の OS に対しては 9pfuse を実行している。
以下にマウントされた時の Mac の Finder を示す。

Finder に反映された MacFUSE
-bash$ mkdir -p /mnt/factotum # needs only onece -bash$ 9 mount /srv/factotum /mnt/factotum -bash$ ls /mnt/factotum confirm conv ctl log needkey proto rpc -bash$ cat /mnt/factotum/ctl key dom=pc proto=p9sk1 role=client user=arisawa !password? -bash$
factotum にデータを追加するには
echo key 'dom=aichi-u.ac.jp proto=p9sk1 role=client user=arisawa !password=xxxxxxxx' >> /mnt/factotum/ctl
のように ">>" を使う必要がある。(Plan 9 の factotum の場合には ">" で構わない。)
削除するときにも同様である。
ls -l を実行してみると UNIX の限界がよく分かる。
-bash$ ls -l /n/pc total 85 drwxrwxr-x 1 arisawa arisawa 0 Jun 27 17:24 386 drwxrwxr-x 1 arisawa arisawa 0 Jan 31 2007 68000 drwxrwxr-x 1 arisawa arisawa 0 Jan 31 2007 68020 -r--r--r-- 1 arisawa arisawa 13006 Jul 13 2005 LICENSE -rw-rw-r-- 1 arisawa arisawa 14333 Jun 29 2003 LICENSE.afpl -rw-rw-r-- 1 arisawa arisawa 15081 Jun 26 2003 LICENSE.gpl -r--r--r-- 1 arisawa arisawa 63 Apr 15 2002 NOTICE drwxrwxr-x 1 arisawa arisawa 0 Jan 31 2007 acme ...
オーナーやグループはどれも arisawa になっているが、本来は sys である。UNIX ではファイルシステム毎にファイルのユーザとグループを決める事ができないので、リモートファイルをマウントした時にローカルファイルシステムのユーザとグループで適当にマッピングする他ない。ここでは全て arisawa にマッピングされているのだ。その場合にはファイルに対する arisawa の本来のアクセス権を知る事ができない。
コマンドでファイルにアクセスする限り、実際にアクセスして拒否されれば知らせてくれる。しかし Mac の Finder を通じてマウスでクリックしていると状況が異なる。Finder は余計な親切をしているのだ。それがあだになって読み取れるはずのファイルが読み取れない事もある。(Finder は正しいメッセージを出していない!)
このような問題は UNIX と Plan 9 と言う異質な OS を結んだから発生したのではない。 UNIX 相互でも管理者ドメインが異なれば同じ問題が発生する。UNIX がネットワーク環境に適合しないと言われる根拠の一つになっている。
参考のために Plan 9 端末から u9fs を使って UNIX (Mac OSX) をマウントした場合の ls -l を示す
--rwxrwxrwx M 29 arisawa staff 6148 Apr 24 22:05 .DS_Store d-rw------- M 29 root ??? 272 Aug 29 06:34 .Spotlight-V100 d--wx-wx-wx M 29 root admin 170 Feb 23 2006 .Trashes [中略] d-rwxr-xr-x M 29 arisawa staff 1360 Jan 26 2003 システムフォルダ d-rwxrwxr-x M 29 root admin 340 Sep 13 2002 書類 d-rwxr-xr-x M 29 arisawa admin 68 Jan 26 2003 起動時に消去する項目
グループ名の欄の "???" は元は数字であった。この変更以外は本来のユーザ名とグループ名が正しく表示される。Plan 9 の場合にはマッピングの必要はないのである。
ar は研究室に置かれている Plan 9 システムの CPU サーバである。ファイルサーバーの /lib/ndb/local で、ar の認証サーバーとして hera が指定されている。また ar の factotum は
key dom=aichi-u.ac.jp proto=p9sk1 user=arisawa !password=xxxxxxxx
である。(xxxxxxxx はパスワード)
ar の認証ドメインは aichi-u.ac.jp であるが、factotum には認証サーバーに関する情報が含まれていない。従って pbook から ar をマウントするには ar の認証サーバーが何であるかを知らせる必要がある。この事は $PLAN9/ndb/local で行える。僕のケースでは
authdom=aichi-u.ac.jp
auth=hera.aichi-u.ac.jp
を追加した。これを追加すれば、マウントまでの手順は pc と同じである。
hera.aichi-u.ac.jp は NetInfo に登録しておかなくてはならない。
pmac は自宅の PowerMac G4 で、ここでは u9fs が動いている。pmac は Plan 9 端末からはマウントできる。しかし不思議な事に pbook からは(pmac からも)マウントできない。
-bash$ 9fs pmac authdial: Connection refused
原因不明
マウント
9 mount /srv/ar /n/ar
の効果は unmount
9 unmount /n/ar
で取り消せる。
9fs ar
の効果を取り消すには次のようにする。
-bash$ ps PID TT STAT TIME COMMAND 24157 p1 S 0:00.46 -bash 24276 p1 S 0:00.51 factotum 24278 p1 S 0:02.51 9pserve -u unix!/srv/factotum 24289 p1 S 0:40.18 9pserve -u -M 8192 -A 0 unix!/srv/ar 24306 p1 S 0:11.60 9pserve -u -M 8192 -A 0 unix!/srv/pc 24198 p2 S+ 0:00.07 -bash -bash$ kill 24289 -bash$ ls /srv ar factotum pc -bash$ rm /srv/ar -bash$
Plan 9 の場合には /srv/ar だけを消せば良かったが、プロセスも落とさなくてはならない。
factotum を取り消すには
-bash$ ps PID TT STAT TIME COMMAND 24157 p1 S 0:00.53 -bash 24751 p1 S 0:00.01 factotum 24753 p1 S 0:00.01 9pserve -u unix!/srv/factotum 24198 p2 S+ 0:00.07 -bash -bash$ kill 24751 -bash$ rm /srv/factotum -bash$
"9pserve -u unix!/srv/factotum" は factotum によって生成されたプロセスで factotum を落とせば自動的に落ちるが、/srv/factotum は削除しなくてはならない。
以下に実験中に出会ったエラーについて解説と対処法を付ける。
bash$ 9fs pc !adding key: role=client proto=p9sk1 dom=home user[arisawa]: password: ! authdial: unknown host home bash$
原因: pc 側の factotum の誤設定
dom=pc とすべき所を dom=home となっていた。
pc 側の factotum で dom=home としたまま、$PLAN9/ndb/local で pc が dom=home に属する事を知らせる方法もあったはずである。
-bash$ factotum -bash$ 9fs ar srv: authproxy: auth_proxy rpc: p9any client ask for keys: unable to find common key -bash$
この問題は $PLAN9/ndb/local の設定を行う事で解決したはずである。
-bash$ echo key 'dom=aichi-u.ac.jp proto=p9sk1 user=arisawa !password=xxxxxxxx'>/mnt/factotum/ctl -bash: /mnt/factotum/ctl: Result too large
この問題は ">>" を使う事によって解決する。
9fs io rx: authentication disabled
なお io は自宅のサーバー名
-bash$ 9 mount /srv/pc /n/pc can't mount on Darwin -bash$
これは pmac から pc をマウントするときに出た。原因は pmac の plan9port が古い事による。最新の版をダウンロードしてインストールすれば解決する。
Finder への表示は遅い! イライラする!
安定していない! 何度かファイルの保存を試みたが、どれもハングした。この不安定性が Finder との関係で発生しているなら、Finder への表示を止めたい。現状では実用の域には達していない。
Mac OSX は WebDAV に関しても極めて不合理な振る舞いをしており*、そのために Mac OSX での WebDAV の使用を堪え難いものにしている。この遅さがカーネルによって発生しているなら、FUSE でも同様であろう。
Plan 9 のマウント機能は軽快で、安定しており素晴らしい。原理的にはこれに近いところまで持って行けるはずである。Linux など他の OS の FUSE は試していないので、比較の意味で試してみる価値がある。
http://swtch.com/plan9port/
http://swtch.com/plan9port/man/man3/9pclient.html
http://swtch.com/plan9port/man/man4/intro.html
http://swtch.com/plan9port/man/man4/9pfuse.html
http://swtch.com/plan9port/man/man4/factotum.html