まずFUSEのカーネルモジュールをダウンロードしてきます。macfuse - Google Code にあるtarballを持ってきてください。インストール方法はmacfuseのwikiに書かれています。それによると、そんなむちゃくちゃなというかんじですけどこう。
sudo tar -C / -jxvf fuse-0.1.0b004.tar.bz2
ちなみにこのバイナリパッケージは
this binary distribution available as a one-time thing for convenience to the early (earliest) adoptersだそうなので early adopter になるべくぜひ試してみてください。
We do not intend to maintain binary distributions on this project page.とも書いてあるので early majolity になってしまったあなたはご注意を。 インストール後はちゃんと起動してくることを祈りながらOSXを再起動してください。
FUSEのカーネルモジュールをいれて再起動をして無事ブートできたら次はFUSEの hello wolrd を作ってみましょう。ソースコードはFUSEの hello world ページにあります。
これをhello.cppという名前にして保存します。手元のg++ではgccの独自拡張でエラーが出たため
static struct fuse_operations hello_oper = {
.getattr = hello_getattr,
.readdir = hello_readdir,
.open = hello_open,
.read = hello_read,
};
int main(int argc, char *argv[])
{
return fuse_main(argc, argv, &hello_oper);
}
の部分を
static struct fuse_operations hello_oper = { 0 };
int main(int argc, char *argv[])
{
hello_oper.getattr = hello_getattr;
hello_oper.readdir = hello_readdir;
hello_oper.open = hello_open;
hello_oper.read = hello_read;
return fuse_main(argc, argv, &hello_oper);
}
に書き換えました。
またFUSE内部でインクルードしているstatfs.hがないというエラーが出るので、シンボリックリンクを張ってごまかしました。(この対処法が正しいのかはわかりません。でも動いてます)
sudo ln -s /usr/include/sys/statvfs.h /usr/local/include/sys/statfs.h
先ほどのドキュメントに
When running the configure script for a file system, you need to have -D__FreeBSD__=10 in CFLAGS.This is critical!
と書かれているので、忘れずにコンパイルする時にこれをつけます。
g++ -DFUSE_USE_VERSION=25 -D_FILE_OFFSET_BITS=64 -D__FreeBSD__=10 hello.cpp -o hello -lfuse
コンパイルが通ったら、このhelloをてきとうなディレクトリにマウントして動作を確認してみましょう。
まずてきとうなディレクトリを作ってマウントします。
kuma@sawtooth:~/hellofs% mkdir /tmp/fuse
kuma@sawtooth:~/hellofs% ./hello /tmp/fuse
kextload: /System/Library/Extensions/fusefs.kext loaded successfully
マウントできたら中身をのぞいてみましょう。
kuma@sawtooth:~/hellofs% ls -l /tmp/fuse
total 0
-r--r--r-- 1 root wheel 13 Jan 1 1970 hello
さっき新しく作ったディレクトリの中に、いつのまにかhelloというファイルができていて
kuma@sawtooth:~/hellofs% cat /tmp/fuse/hello
Hello World!
中には Hello World! と書かれています!
動作が分かったところでソースコードを見ると、本当にそのまんまな記述がされていることが分かります。これなら自分でいろいろ作れそうな気持ちになれるのではないでしょうか。ふつうはこういうドライバを書こうとすると(というか、カーネルモードで動くドライバを書こうとすると)、まずnewできないとかmallocも無理とか、渡されたメモリに書き込んだら落ちることがあるとか、落ちるならいいけど、へんなところに書いてたのに落ちなくて実はデータが壊れてたとか、ユーザーモードのプログラムを作る時にはない苦労が山盛りで開発するのがとても大変です。 それに比べると、このFUSEを使って作るとそんな苦労とは無縁のいつも通りのコードを書くだけで、cronを使ってflickrにファイルをコピーするとか、vimでwikipediaを編集するとか、ちょうどWeb2.0でいう野良APIを書く感覚でBinary2.0なかんじ(ちょっとちがう?)のおもちゃをつくれてしまいます。 バイナリはちょっと....というヤワなあなたも大丈夫!FUSEにはスクリプト言語バインディングが用意されているのでC/C++のようなバイナリ言語でなくても perl, ruby, python といった一般的なLLからシェルスクリプトにhaskellまでマニアックなのまであります。(PHPはないところがうけますね!)
というわけであとはx86FUSEの登場が待たれるところです。 が、中身がBSDのOSXと違ってwindowsはwindowsだから難しいんでしょうか...トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。
http://labs.gmo.jp/mt/mt-tb.cgi/24
comments