Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
OSS開発勉強会-04
NEC OSS推進センター 海外浩平 <kaigai@ak.jp.nec.com>
OSS開発勉強会について
主旨
以下の目標に向けた活動です
① 個々のOSSに対する技術的知識を深める
② コミュニティと協力した開発の手法を共有する
NECからOSSコミュニティに参加・貢献できる人材の輩出
場所・日程
基本的に田町地区
第二...
FUSE - Filesystem in userspace (1/2)
/dev/fuse/dev/fuse
出典: http://fuse.sourceforge.net/
FUSE - Filesystem in userspace (2/2)
FUSEの利用に必要なパッケージ
kernel-2.6.14以上
fuse
fuse-devel (開発)
FUSE を使ったファイルシステム例
http://sourc...
FUSEアプリケーションの動作
mount
/dev/fuse をオープン
"fuse" ファイルシステムをマウントポイントにマウント
/dev/fuse のファイルディスクリプタをマウントオプションに含む
fd=%i,rootmode=%o,...
libfuse (1/2)
面倒な application <-> kernel 間のプロトコルを隠蔽
初期設定後、fuse_main() の呼び出し
典型的なプログラムの例
#define FUSE_USE_VERSION 26
#inclu...
libfuse (2/2)
application
libfuse
Linux kernel
main()
fuse_main()
argc, argv
fuse_operations
/dev/fuse
open(2)
fuse_sessio...
fuse_in_header/fuse_out_header
struct fuse_in_header {
__u32 len;
__u32 opcode; // FUSE_READ, etc...
__u64 unique;
__u64 n...
fuse_operations 構造体
struct fuse_operations {
/** Get file attributes.
*
* Similar to stat(). The 'st_dev' and 'st_blksize'...
実際に作ってみた (1/2)
kaigaifs
仕様
リモートホストの /sys 以下を参照するファイルシステム
NFSのRead-Onlyでいいじゃん禁止
REMOTE_HOST環境変数で指定
FUSEメソッドから ssh でリモートホストに...
実際に作ってみた (2/2)
$ gcc -D_FILE_OFFSET_BITS=64 kaigaifs.c -o kaigaifs -lfuse
$ mkdir test
$ env REMOTE_HOST=bdg ./kaigaifs te...
libfuseとマルチスレッド
イベントループへの突入
fuse_main_common()
→ fuse_session_loop_mt()
→ fuse_start_thread() → fuse_do_work()
→ スレッド終了待ち
...
おしまい
Upcoming SlideShare
Loading in …5
×

Oss dev-04

1,228 views

Published on

Published in: Technology, Business
  • Be the first to comment

  • Be the first to like this

Oss dev-04

  1. 1. OSS開発勉強会-04 NEC OSS推進センター 海外浩平 <kaigai@ak.jp.nec.com>
  2. 2. OSS開発勉強会について 主旨 以下の目標に向けた活動です ① 個々のOSSに対する技術的知識を深める ② コミュニティと協力した開発の手法を共有する NECからOSSコミュニティに参加・貢献できる人材の輩出 場所・日程 基本的に田町地区 第二第四水曜日 18:30~を予定 テーマ OSS開発に関するものなら何でもOK 過度に資料作成に手間をかけるのはNG No confidence, No commitment
  3. 3. FUSE - Filesystem in userspace (1/2) /dev/fuse/dev/fuse 出典: http://fuse.sourceforge.net/
  4. 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...
  5. 5. FUSEアプリケーションの動作 mount /dev/fuse をオープン "fuse" ファイルシステムをマウントポイントにマウント /dev/fuse のファイルディスクリプタをマウントオプションに含む fd=%i,rootmode=%o,user_id=%i,group_id=%i /dev/fuse からの read 待ち状態に call-back fuse_in_header 型のデータを読み込み opcode に応じた処理をユーザ空間で実行 実行結果を /dev/fuse に書き込み umount プロセスの終了 → /dev/fuseのclose → FSを閉塞 umount(2)の実行 → /dev/fuseのclose → プロセスの終了
  6. 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); }
  7. 7. libfuse (2/2) application libfuse Linux kernel main() fuse_main() argc, argv fuse_operations /dev/fuse open(2) fuse_session_loop hoge_read() hoge_write() read(2) VFS read(2)FUSE fuse_lib_read() fuse_lib_write()
  8. 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. 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. 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. 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
  12. 12. libfuseとマルチスレッド イベントループへの突入 fuse_main_common() → fuse_session_loop_mt() → fuse_start_thread() → fuse_do_work() → スレッド終了待ち ワーカースレッド fuse_do_work() fuse_chan_recv() if (--手の空いているスレッド数 = 0) → fuse_start_thread(); fuse_session_process() if (++手の空いているスレッド数 > 10) → スレッドの終了; 負荷に応じてスレッド数を変化させる (上限 10 固定) イベントハンドラ側で適切な排他処理の実装が必要に
  13. 13. おしまい

×