More Related Content Similar to Oss dev-04 (20) More from Kohei KaiGai (20) Oss dev-043. FUSE - Filesystem in userspace (1/2)
/dev/fuse/dev/fuse
出典: http://fuse.sourceforge.net/
4. FUSE - Filesystem in userspace (2/2)
FUSEの利用に必要なパッケージ
kernel-2.6.14以上
fuse
fuse-devel (開発)
FUSE を使ったファイルシステム例
http://sourceforge.net/apps/mediawiki/fuse/index.php?title=FileSystems
アーカイブ、圧縮、暗号化
RDBMS、KVSアクセス
postgresqlfs
http://git.postgresql.org/gitweb?p=postgresqlfs.git
ネットワーク/分散FS、Non-native FS、etc...
6. libfuse (1/2)
面倒な application <-> kernel 間のプロトコルを隠蔽
初期設定後、fuse_main() の呼び出し
典型的なプログラムの例
#define FUSE_USE_VERSION 26
#include <fuse/fuse.h>
:
static struct fuse_operations hoge_ops = {
.getattr = hoge_getattr,
.read = hoge_read,
.readdir = hoge_readdir,
};
:
int main(int argc, char *argv[])
{
/*
* We can add initialization code here
*/
return fuse_main(argc, argv, &hoge_ops, NULL);
}
8. fuse_in_header/fuse_out_header
struct fuse_in_header {
__u32 len;
__u32 opcode; // FUSE_READ, etc...
__u64 unique;
__u64 nodeid; // inode-number
__u32 uid;
__u32 gid;
__u32 pid;
__u32 padding;
};
struct fuse_out_header {
__u32 len;
__s32 error;
__u64 unique;
};
ユーザ定義関数には、nodeidを
文字列のパス名に変換してから
渡す構造になっている。
(libfuseが対応関係を保持)
9. fuse_operations 構造体
struct fuse_operations {
/** Get file attributes.
*
* Similar to stat(). The 'st_dev' and 'st_blksize' fields are
* ignored. The 'st_ino' field is ignored except if the
* 'use_ino' mount option is given.
*/
int (*getattr) (const char *, struct stat *);
/** Read the target of a symbolic link
*
* The buffer should be filled with a null terminated string.
* The buffer size argument includes the space for the terminating
* null character. If the linkname is too long to fit in the
* buffer, it should be truncated. The return value should
* be 0 for success.
*/
int (*readlink) (const char *, char *, size_t);
:
10. 実際に作ってみた (1/2)
kaigaifs
仕様
リモートホストの /sys 以下を参照するファイルシステム
NFSのRead-Onlyでいいじゃん禁止
REMOTE_HOST環境変数で指定
FUSEメソッドから ssh でリモートホストにログインし情報取得
リモートへの証明書ログインが前提
実装したメソッド
getattr ... ssh stat コマンド
read ... ssh cat コマンド
readlink ... ssh stat コマンド
readdir ... ssh ls コマンド
11. 実際に作ってみた (2/2)
$ gcc -D_FILE_OFFSET_BITS=64 kaigaifs.c -o kaigaifs -lfuse
$ mkdir test
$ env REMOTE_HOST=bdg ./kaigaifs test
$ ls -l test/
total 0
drwxr-xr-x. 25 root root 0 Aug 6 09:50 block
drwxr-xr-x. 14 root root 0 Aug 6 09:50 bus
drwxr-xr-x. 29 root root 0 Aug 6 09:50 class
drwxr-xr-x. 7 root root 0 Aug 6 18:49 devices
drwxr-xr-x. 3 root root 0 Aug 6 18:49 firmware
drwxr-xr-x. 2 root root 0 Aug 6 18:49 fs
drwxr-xr-x. 4 root root 0 Aug 23 14:50 kernel
drwxr-xr-x. 92 root root 0 Aug 6 09:50 module
drwxr-xr-x. 2 root root 0 Aug 6 09:50 power
$ $ cat test/class/net/eth0/address
00:0c:29:f3:6a:ab
$ cat /sys/class/net/eth0/address
00:0c:29:ff:a5:bb