PythonでFUSE

FUSEPythonバインディングについて調べていたら下のような記述が見つかった。

python-fuse
これが前からあるやつ。ただし、ドキュメントがほとんどない
ソースを読め、という硬派なアプローチ。
軟弱者の私には荷が重い

FUSE - skobayasの日記

確かに少ない。公式にはサンプルがあるのみ。しかもこのサンプルは古い実装に基づいているので新しい実装では動作しない。

日本語での情報として有益そうなのは
ここいらでfuseを一区切り - KoshigoeBLOG
かな。動くサンプルとして非常に有用。

あとは、http://fuse4bsd.creo.hu/fuse-python-0.2-doc/を参照。"Fuse._attrs"に実装すればいい関数名が記述されている。この関数名は同名のシステムコールとほぼ同じなので特に説明不要かと思う。ただ、引数が異なる場合があるので調べたいものについて

class sample(fuse.Fuse):
    def some_call(self, *args, **kw):
        print "*** some call :", args, kw
        return -fuse.ENOSYS

とやった上で"-d"オプションつきでためしにマウントしてみて得られたデバックメッセージから推測する。とだけ言うのもなんなので、そのうち試した結果をまとめてどこかに書く。しばしお待ちあれ。
ちなみにこんな出力が得られる。これは"readdir"に対してやってみた例。

unique: 1, opcode: INIT (26), nodeid: 0, insize: 56
INIT: 7.11
flags=0x0000003b
max_readahead=0x00020000
   INIT: 7.8
   flags=0x00000001
   max_readahead=0x00020000
   max_write=0x00020000
   unique: 1, error: 0 (Success), outsize: 40
unique: 2, opcode: GETATTR (3), nodeid: 1, insize: 56
*** getattr : /
   unique: 2, error: 0 (Success), outsize: 112
unique: 3, opcode: OPENDIR (27), nodeid: 1, insize: 48
   unique: 3, error: 0 (Success), outsize: 32
unique: 4, opcode: READDIR (28), nodeid: 1, insize: 80
*** readdir / (0L,) {}
   unique: 4, error: 0 (Success), outsize: 48
unique: 5, opcode: LOOKUP (1), nodeid: 1, insize: 42
LOOKUP /a
*** getattr : /a
   unique: 5, error: -2 (No such file or directory), outsize: 16
unique: 6, opcode: READDIR (28), nodeid: 1, insize: 80
   unique: 6, error: 0 (Success), outsize: 16
unique: 7, opcode: RELEASEDIR (29), nodeid: 1, insize: 64
   unique: 7, error: 0 (Success), outsize: 16
unique: 8, opcode: GETATTR (3), nodeid: 1, insize: 56
*** getattr : /
   unique: 8, error: 0 (Success), outsize: 112
unique: 9, opcode: GETATTR (3), nodeid: 1, insize: 56
*** getattr : /
   unique: 9, error: 0 (Success), outsize: 112
unique: 10, opcode: OPENDIR (27), nodeid: 1, insize: 48
   unique: 10, error: 0 (Success), outsize: 32
unique: 11, opcode: READDIR (28), nodeid: 1, insize: 80
*** readdir / (0L,) {}
   unique: 11, error: 0 (Success), outsize: 48
unique: 12, opcode: LOOKUP (1), nodeid: 1, insize: 42
LOOKUP /a
*** getattr : /a
   unique: 12, error: -2 (No such file or directory), outsize: 16
unique: 13, opcode: READDIR (28), nodeid: 1, insize: 80
   unique: 13, error: 0 (Success), outsize: 16
unique: 14, opcode: RELEASEDIR (29), nodeid: 1, insize: 64
   unique: 14, error: 0 (Success), outsize: 16
unique: 15, opcode: FORGET (2), nodeid: 1, insize: 48
FORGET 1/1