編集中〜〜
すべての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] :親の世代番号等
開発したのは、Sun Microsystems社
Network File System ネットワーク型共有ファイル共有システム。
version 2やversion 4もある。
version 2とversion 3の違いは大きくは以下の3つ
NFS | version 2 | version 3 |
ファイルサイズ | 4GB(2GB)までサポート | 2^64-1までサポート |
書き込み等 | 常にシリアライズで書き込み(遅い) | commitまで他の処理が可能(速い) |
通信サイズ | 8192バイト制限 | クライアント/サーバ間で制限一致 |
※commit closeやバッファ空間枯渇によりcommitし、writeを完了させる。
一昔までversion 3が主流だった。1年前より徐々にversion 4が増えてきたらすぃ
でもversion 4はまだまだ不安定(*´Д`)ハァハァ セキュリティ関連難しすぎ。。
kernle 2.6.12.1のnfsの動き(getattr)を用いて、他のファイルシステムとnfsがどのように関係しているかを説明する。
以下の図参照のこと。
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
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) };
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
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)
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)