PythonでFUSE
FUSEのPythonバインディングについて調べていたら下のような記述が見つかった。
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