address Logo

MacFUSE 9P Bridge

目次

Aug 2007

夏休みになって時間が取れたので懸案であった問題に取り組んでみた。
MacFUSE を使って Plan 9 ホストのファイルシステムを Mac のノートブックにマウントする実験である。ノートブックは PowerBook と MacBook を試した。いずれもマウントに成功した。

FUSE

FUSE とは

FUSE(Filesystem in Userspace) を使うと、ユーザースペースのプログラムによってファイルシステムを構成できる。このメリットは計り知れない。例えば

などを挙げる事ができる。ユーザはファイルシステムに対して多様なニーズとアイデアを持っており、カーネルを拡張する事なく、必要に応じてファイルシステムの一部として使えるようになった訳である。FUSE は現在カーネルに組み込まれている多くのファイルシステムを時代遅れのものとし、カーネルのスリム化に役立つであろう。

ファイルシステムをユーザスペースで構成するアプローチは Plan 9 由来のものである。

FUSE に関する Russ Cox の批評

現在 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.edu

There 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/28f2y

There 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

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$ 

これは使い方の説明が悪いのだ。ネット上の次の記事を見つけて解決:

正しい SpotlightFS の使い方

まず SpotlightFS を立ち上げておいて

    Finder ⇒ ファイル ⇒ 新規スマートフォルダ

によって検索する。それを「保存済みの検索条件」に名前を付けて保存する。するとその結果が

    /Volumes/SpotlightFS/

に反映する。

macwiki http://macwiki.sourceforge.jp/wiki/index.php/MacFUSE の説明

SporlightFS を起動すると、「SpotlightFS」というボリュームがマウントされます。このボリューム内にディレクトリを作成すると、作成したディレクトリ名を使って Spotlight の検索がおこなわれ、その結果がディレクトリ中にファイルとして表示されるようになります。

が悪い! 次のように書き換えるべきであろう。

SporlightFS を起動すると、「SpotlightFS」というボリュームがマウントされます。ファインダーから新規スマートフォルダを実行し Spotlight の検索を行い、その結果を「保存済みの検索条件」に名前を付けて保存すると、その名前が「SpotlightFS」に生成されます。

References

MacFUSE 9P Bridge

ネットの記事を見ていると 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

を実行し、後は

だけでよい*。僕は OSX のシェルでは bash を使っている。以下は僕の $HOME/.profile (の一部)である。

PLAN9=/usr/local/plan9 export PLAN9
PATH=$PATH:$PLAN9/bin export PATH
注 *: これは Plan 9 のコマンドだけを使う一番簡単なケースである。ネットワークに関した問題に関しては更に $PLAN9/ndb/local の設定が必要になる。

実験環境

クライアントは Mac のノートブック。僕は Mac のノートブックを2つ持っている。PowerBook と MacBook である。いずれも OSX 10.4 環境下で動いている。以下それらを各々 pbookmbook と呼ぶ。どちらで行っても動作に違いはない。そこで、ここでは pbook での実験のみを示す。

マウントするリモートホストは 3 つを試した。

pc
自宅のデスクトップの Plan 9 端末で、端末と言っても実際にはサーバと同様なサービスを行っている。認証サーバを持たずに、単体で動いている。Factotum と venti を備えている。
ar
大学の Plan 9 の CPU サーバー
pmac
自宅のデスクトップの Mac で u9fs が動いている。

太字で示したのはマシン名であり、以下この名前で説明する。

pbook のディレクトリ構成

ここでは Plan 9 端末風にディレクトリを構成する。メリットは

注意: X11 は intel Mac ではサポートされていない。また X11 のユーザーインターフェースは Mac ユーザにとっては使いやすいとは言えない。

逆にディメリットは、

事にある。最後に述べたディメリットに関しては、ノートパソコンであるから問題にはならない。

pc のマウント

実験した日には研究室にある認証サーバ 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 を示す。

macfuse1

Finder に反映された MacFUSE

Factotum の ctl にアクセスする。

-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 のマウント

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 のマウント

pmac は自宅の PowerMac G4 で、ここでは u9fs が動いている。pmac は Plan 9 端末からはマウントできる。しかし不思議な事に pbook からは(pmac からも)マウントできない。

-bash$ 9fs pmac
authdial: Connection refused

原因不明

取り消し

mount

マウント

    9 mount /srv/ar /n/ar

の効果は unmount

    9 unmount /n/ar

で取り消せる。

9fs

    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

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 は削除しなくてはならない。

診断

以下に実験中に出会ったエラーについて解説と対処法を付ける。

unknown host

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 に属する事を知らせる方法もあったはずである。

unable to find common key

-bash$ factotum
-bash$ 9fs ar
srv: authproxy: auth_proxy rpc: p9any client ask for keys: unable to find common key
-bash$ 

この問題は $PLAN9/ndb/local の設定を行う事で解決したはずである。

Result too large

-bash$ echo key 'dom=aichi-u.ac.jp proto=p9sk1 user=arisawa !password=xxxxxxxx'>/mnt/factotum/ctl
-bash: /mnt/factotum/ctl: Result too large

この問題は ">>" を使う事によって解決する。

authentication disabled

9fs io
rx: authentication disabled

なお io は自宅のサーバー名

can't mount on Darwin

-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 でも同様であろう。

注*: http://plan9.aichi-u.ac.jp/webdav/osx.html

Plan 9 のマウント機能は軽快で、安定しており素晴らしい。原理的にはこれに近いところまで持って行けるはずである。Linux など他の OS の FUSE は試していないので、比較の意味で試してみる価値がある。

References