Linuxのファイルシステムを詳解します

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を完了させる。~

NFS(Version 4)とは

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

/etc/init.d/rpcidmapd stop
/etc/init.d/nfs stop
/etc/init.d/rpcgssd stop
/etc/init.d/portmap stop
/etc/init.d/nfslock stop

/etc/init.d/nfslock start
/etc/init.d/portmap start
/etc/init.d/rpcgssd start
/etc/init.d/nfs start
/etc/init.d/rpcsvcgssd restart
/etc/init.d/rpcidmapd restart

NFSの動き

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


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

以下の図参照のこと。~


システムコール
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)

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

関連ソフト/文書

Firefox3 Meter  Use OpenOffice.org

管理人/副管理人のみ編集できます