nfs


詳解Linux NFS(Version 3)

編集中〜〜


NFSのファイルハンドル

すべてのNFS操作はファイルハンドル(NFS-FH)を使用して、処理対象のファイルまたは、ディレクトリを一意に抽出し、対象を操作する。

NFS-FHを構成するには大体以下の内容の物が含まれます。
なおNFS-FHを生成するのはNFSサーバ側です。
1.ファイルシステムID
2.エクスポートしているディレクトリID
3.対象ファイルを特定するID
4.世代番号

※NFS-FH構造

         ファイルハンドルタイプが0の場合(子のみの形式(親は含まない))
               fh[0]  :iノード番号等(FSファイルハンドル)
               fh[1]  :世代番号
         ファイルハンドルタイプが1の場合(親も含めた形式)
               fh[0]  :iノード番号等(ファイルハンドル)
               fh[1]  :世代番号
               fh[2]  :親のiノード番号等(ファイルハンドル)
               fh[3]  :親の世代番号等

NFS(Version 3)とは

開発したのは、Sun Microsystems社
Network File System ネットワーク型共有ファイル共有システム。
version 2やversion 4もある。

version 2とversion 3の違いは大きくは以下の3つ

NFSversion 2version 3
ファイルサイズ4GB(2GB)までサポート2^64-1までサポート
書き込み等常にシリアライズで書き込み(遅い)commitまで他の処理が可能(速い)
通信サイズ8192バイト制限クライアント/サーバ間で制限一致

※commit closeやバッファ空間枯渇によりcommitし、writeを完了させる。

一昔までversion 3が主流だった。1年前より徐々にversion 4が増えてきたらすぃ
でもversion 4はまだまだ不安定(*´Д`)ハァハァ セキュリティ関連難しすぎ。。

NFSの動き

kernle 2.6.12.1のnfsの動き(getattr)を用いて、他のファイルシステムとnfsがどのように関係しているかを説明する。

nfs3.jpg

kernel2.4系とkernel2.6系の動きの違い

以下の図参照のこと。

24to26.jpg

システムコール

sys_nfsservctl		//システムコールの入り口 (CONFIG_NFSD有効時)
+- switch (cmd)
  +- nfsctl_svc()		// This is a server process
  +- nfsctl_addclient()	// Add an NFS client
  +- nfsctl_delclient()	// Remove an NFS client
  +- nfsctl_export()		// export a file system
  +- nfsctl_unexport()		// unexport a file system
  +- nfsctl_getfh()		// get an fh by ino (used by mountd)
  +- nfsctl_getfd()		// get an fh by path (used by mountd)
  +- nfsctl_getfs()		// get an fh by path with max FH len

svc_procedure

NFSv3のRPCに登録する?
#define PROC(name, argt, rest, relt, cache)     \
{ (svc_procfunc) nfsd3_proc_##name,            \
  (kxdrproc_t) nfs3svc_decode_##argt##args,    \
  (kxdrproc_t) nfs3svc_encode_##rest##res,     \
  (kxdrproc_t) nfs3svc_release_##relt,         \
  sizeof(struct nfsd3_##argt##args),           \
  sizeof(struct nfsd3_##rest##res),            \
  0,                                           \
  cache                                        \
}
struct svc_procedure            nfsd_procedures3[22] = {
 PROC(null,     void,          void,           void,    RC_NOCACHE),
 PROC(getattr,  fhandle,       attrstat,       fhandle, RC_NOCACHE),
 PROC(setattr,  sattr,         wccstat,        fhandle,  RC_REPLBUFF),
 PROC(lookup,   dirop,         dirop,          fhandle2, RC_NOCACHE),
 PROC(access,   access,        access,         fhandle,  RC_NOCACHE),
 PROC(readlink, fhandle,       readlink,       fhandle,  RC_NOCACHE),
 PROC(read,     read,          read,           fhandle, RC_NOCACHE),
 PROC(write,    write,         write,          fhandle,  RC_REPLBUFF),
 PROC(create,   create,        create,         fhandle2, RC_REPLBUFF),
 PROC(mkdir,    mkdir,         create,         fhandle2, RC_REPLBUFF),
 PROC(symlink,  symlink,       create,         fhandle2, RC_REPLBUFF),
 PROC(mknod,    mknod,         create,         fhandle2, RC_REPLBUFF),
 PROC(remove,   dirop,         wccstat,        fhandle,  RC_REPLBUFF),
 PROC(rmdir,    dirop,         wccstat,        fhandle,  RC_REPLBUFF),
 PROC(rename,   rename,        rename,         fhandle2, RC_REPLBUFF),
 PROC(link,     link,          link,           fhandle2, RC_REPLBUFF),
 PROC(readdir,  readdir,       readdir,        fhandle,  RC_NOCACHE),
 PROC(readdirplus,readdirplus, readdir,        fhandle,  RC_NOCACHE),
 PROC(fsstat,   fhandle,       fsstat,         void,     RC_NOCACHE),
 PROC(fsinfo,   fhandle,       fsinfo,         void,     RC_NOCACHE),
 PROC(pathconf, fhandle,       pathconf,       void,     RC_NOCACHE),
 PROC(commit,   commit,        commit,         fhandle,  RC_NOCACHE)
};

パス名lookup

nfsd3_proc_lookup
+- nfsd_lookup
  + fh_verify
  +- fh_lock
  +- lookup_one			// in "fs/namei.c"
  |  +- lookup_hash			// in "fs/namei.c"
  |     +- cached_lookup		// in "fs/namei.c"
  |     +- if (NULL) base->d_inode->i_op->lookup()
  +- fh_compose

read

I/Oの度にfileを作っている
nfsd3_proc_read
+- nfsd_read
  +- nfsd_open(rqstp, fhp, S_IFREG, MAY_READ, &file)	//dentryからfile作成
  +- nfsd_get_raparms			// Get readahead parameters
  +- set_fs(KERNEL_DS)
  +- file.f_op->read(&file, buf, *count, &file.f_pos)
  +- nfsd_close(&file)

write

nfsd3_proc_write
+- nfsd_write
  +- nfsd_open(rqstp, fhp, S_IFREG, MAY_WRITE, &file)	//dentryからfile作成
  +- (svc_exportの状態によってはO_SYNC)
  +- set_fs(KERNEL_DS)
  +- file.f_op->write(&file, buf, cnt, &file.f_pos)
  +- nfsd_close(&file)

最新の20件

2006-12-20 2005-11-17 2005-11-09 2005-10-28 2005-10-24 2005-10-13

  • counter: 5120
  • today: 1
  • yesterday: 0
  • online: 1