google code でFUSEのOSXバージョンmacFUSEがリリースされる - to the early (earliest) adopters

なぜいまさらwindowsのドライバ開発なのか - bits and bytes で触れていたFUSEのOSXバージョンがリリースされました。それもgoogleから!Google Code Blog で MacFUSE: FUSE for Mac OS X というポストが出ていて知りました。 簡単にFUSEを説明すると、いろんなサービスを仮想的にディレクトリやファイルとして、ファインダー(OSXでいうwindowsのエクスプローラです)から操作するようなプログラムを簡単に作るためのものです。FUSEなしでサービスを仮想的にディレクトリとしてみせるようなものを作ろうとすると、デバイスドライバの知識が必要になり非常に困難なのですがFUSEがあるとふつうにflickrのAPIを叩くアプリケーションを作るのと同じくらい簡単に作ることができるのです。もうサービスごとに使いにくいへんなアップローダを使ってアップロードしたり、ちまちまボタンを押したりしなくても、ファインダーでドラッグアンドドロップするだけ!(それ用のFUSEのアプリケーションをインストールしたら、ですが) というわけでさっそく触ってみました。ざっと読んだところ、動作するOSXのバージョンについては特に書かれていません。試したところFUSEのインストール自体はOSX10.3(Panther)でもできましたが、新しいXCodeでないとユーザモードで動くプログラムのコンパイルができなさそうです。OSX10.4(Tiger)についていたXCodeではコンパイルできました。 以下レポートです。

1. カーネルモジュールのダウンロード

まず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を再起動してください。

2. hello world FUSE

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をてきとうなディレクトリにマウントして動作を確認してみましょう。

3. 動作の確認

まずてきとうなディレクトリを作ってマウントします。

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! と書かれています!

4. まとめ

動作が分かったところでソースコードを見ると、本当にそのまんまな記述がされていることが分かります。これなら自分でいろいろ作れそうな気持ちになれるのではないでしょうか。ふつうはこういうドライバを書こうとすると(というか、カーネルモードで動くドライバを書こうとすると)、まず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だから難しいんでしょうか...

tags

  • FUSE
  • OSX
  • tool
  • 「google code でFUSEのOSXバージョンmacFUSEがリリースされる - to the early (earliest) adopters」のはてなブックマーク数
  • 「google code でFUSEのOSXバージョンmacFUSEがリリースされる - to the early (earliest) adopters」deliciousブックマーク数
  • 「google code でFUSEのOSXバージョンmacFUSEがリリースされる - to the early (earliest) adopters」をはてなブックマークに追加
  • save "google code でFUSEのOSXバージョンmacFUSEがリリースされる - to the early (earliest) adopters" to del.icio.us
  • 「google code でFUSEのOSXバージョンmacFUSEがリリースされる - to the early (earliest) adopters」をリアルタイムブログ検索
  • permalink
  • Widowsドライバ開発キット(WDK)のセットアップ
  • vimのシンタックスハイライトのキーワードを追加する

comments

TypeKey Enabled
スタイル用のHTMLタグが使えます。
*required

trackbacks

トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。

http://labs.gmo.jp/mt/mt-tb.cgi/24
©2010 Kentaro Kumagai, GMO Internet Labs., GMO Internet, inc.
bits and bytes
2007 .01. 12 11:32

tagcloud

  • API1
  • C/C++2
  • E4X1
  • FUSE2
  • Firefox18
  • HTML4
  • IE1
  • MySQL1
  • OSX4
  • Opera2
  • PHP4
  • XML1
  • XPCOM4
  • XPath3
  • apache2
  • binary2
  • book1
  • data11
  • debug4
  • design1
  • experiments3
  • extension10
  • google gears1
  • google maps API1
  • greasemonkey3
  • httpd5
  • javascript17
  • linux1
  • logging2
  • mobile3
  • perl4
  • tips4
  • tool11
  • vim2
  • visualization2
  • widget1
  • wii1
  • windows7
  • サービス6
  • 和訳1

Archives

  • 2008.02 (6)
  • 2008.01 (3)
  • 2007.12 (4)
  • 2007.11 (5)
  • 2007.10 (4)
  • 2007.09 (4)
  • 2007.08 (4)
  • 2007.07 (8)
  • 2007.06 (7)
  • 2007.05 (4)
  • 2007.04 (5)
  • 2007.03 (6)
  • 2007.02 (4)
  • 2007.01 (6)

about

  • bits and bytesのXML
  • 「bits and bytes」のCreative Commons
  • Powered by Movable Type
  • イベントと地図 - モグ
  • Use ecto to blog!
  • bits and bytesのはてなブックマーク数
  • bits and bytesをMy Yahoo!に追加
  • Subscribe with Bloglines