NFS

分散システム

                                       電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/dsys-1998/1999-01-19 /nfs.html
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/
http://www.hlla.is.tsukuba.ac.jp/~yas/index-j.html

■NFS

■NFSとは

NFS ( Network File System ) は, Sunが開発したネットワークファイルシステムの名前(固有名詞, 商標)。 事実上の標準(de-fact standard)。

分散ファイル・システムまでは、行っていない。

■NFSの機能

NFSを使うと, ネットワークを通じて別のコンピュータ上のファイルシステム の一部分を, ローカルディスク上にあるファイルシステムと同じように, 自分 のファイルシステムの木に 接ぎ木( マウント(mount) ) することができる。

NFSによるファイルの共有

NFSによるファイルの共有

host1host2/home/home2 を自分自身の /home/home2 にマウントしている。host1/home/home2 の下のファイルをアクセスすると, host2 にあるファイルをアクセスすることになる。

普通のプログラムは, /home/home1 の下のローカルディスク 上のファイルと, /home/home2 の下の別のホストのディスク 上にあるファイルを区別できない。若干の制限が残る。

■NFSのアーキテクチャ

NFS では、サーバもクライアントもOSのカーネル。

NFSによるファイルの共有

NFSによるファイルの共有

■NFSの遠隔手続き呼び出し

NFSは、SunRPC 上で動いている。データの転送は、UDP/IP (V2/V3)または、 TCP/IP (V3) 。

◆NFSプロトコルの手続き

--------------------------------------------------------------------------------
手続き名	意味			関連するコマンド、 システムコール
--------------------------------------------------------------------------------
null()    	何もしない		rpcinfo -u hostname nfs コマンド 
getattr() 	属性の読み出し 		ls -l コマンド, stat システムコール , open システムコール
setattr() 	属性の設定 		chmod , chown コマンド
lookup()  	ファイルの検索	 	open システムコール
readlink() 	シンボリックリンクの読み出し
			 		ls -l コマンド, readlink システムコール
read() 		ファイルの読み出し	read システムコール
write() 	ファイルの書き込み 	write システムコール
create() 	ファイルの作成	 	creat システムコール, open システムコール
remove() 	ハードリンクの削除 	rm コマンド, unlink システムコール
rename() 	ファイル名前の変更 	mv コマンド, rename システムコール
link()		ハードリンクの作成 	ln コマンド, link システムコール
symlink() 	シンボリックリンクの作成
				 	ln -s コマンド, symlink システムコール
mkdir() 	ディレクトリの作成	mkdir コマンド
rmdir() 	ディレクトリの削除 	rmdir コマンド
readdir() 	ディレクトリの読み出し 	ls コマンド
statfs() 	ファイルシステムの利用状況
				 	df コマンド, statfs システムコール
commit()*	ディスクへの書き込み	fsync システムコール
access()*	アクセス権のチェック	access システムコール
--------------------------------------------------------------------------------
 は、NFS Version 3 の新しい手続き。

◆NFSファイルハンドル

NFS では、ファイルは、「NFSファイルハンドル」と呼ばれる32バイトの整 数で識別される。

const NFS_FHSIZE	= 32;

struct nfs_fh {
	opaque data[NFS_FHSIZE];
};

ファイルハンドルは、ディレクトリに対するlookup() 手続きで返される。

一番最初のファイルハンドルは、NFS マウントプロトコルで取られる。

◆NFSマウントプロトコルのRPCの手続き

--------------------------------------------------------------------------------
手続き名	意味			関連するコマンド、 システムコール
--------------------------------------------------------------------------------
null()		何もしない        	rpcinfo -u hostname mount コマンド 
mnt()		NFSファイルハンドルを返す
					mount コマンド
dump()		マウント一覧表    	showmount hostname コマンド
umnt()		アンマウント      	umount コマンド
umntall() 	全アンマウント		umount -h hostname コマンド
export() 	アクセス可能なディレクトリのリストを返す
--------------------------------------------------------------------------------

重要なのは、mnt() だけ。

◆/usr/include/rpcsvc/nfs_prot.x


----------------------------------------------------------------------
program NFS_PROGRAM {
	version NFS_VERSION {
		void 
		NFSPROC_NULL(void) = 0;
		attrstat 
		NFSPROC_GETATTR(nfs_fh) =	1;
...
		diropres 
		NFSPROC_LOOKUP(diropargs) = 4;
...
		readres 
		NFSPROC_READ(readargs) = 6;
...
		attrstat
		NFSPROC_WRITE(writeargs) = 8;
		diropres
		NFSPROC_CREATE(createargs) = 9;
	} = 2;
} = 100003;
----------------------------------------------------------------------

◆lookup


----------------------------------------------------------------------
typedef string filename<NFS_MAXNAMLEN>; 

struct fattr {
	ftype type;		/* file type */
	unsigned mode;		/* protection mode bits */
	unsigned nlink;		/* # hard links */
	unsigned uid;		/* owner user id */
	unsigned gid;		/* owner group id */
	unsigned size;		/* file size in bytes */
	unsigned blocksize;	/* prefered block size */
	unsigned rdev;		/* special device # */
	unsigned blocks;	/* Kb of disk used by file */
	unsigned fsid;		/* device # */
	unsigned fileid;	/* inode # */
	nfstime	atime;		/* time of last access */
	nfstime	mtime;		/* time of last modification */
	nfstime	ctime;		/* time of last change */
};

struct diropargs {
	nfs_fh	dir;	/* directory file handle */
	filename name;		/* name (up to NFS_MAXNAMLEN bytes) */
};

struct diropokres {
	nfs_fh file;
	fattr attributes;
};
----------------------------------------------------------------------

◆read


----------------------------------------------------------------------
struct readargs {
	nfs_fh file;		/* handle for file */
	unsigned offset;	/* byte offset in file */
	unsigned count;		/* immediate read count */
	unsigned totalcount;	/* total read count (from this offset)*/
};
struct readokres {
	fattr	attributes;	/* attributes, need for pagin*/
	opaque data<NFS_MAXDATA>;
};

union readres switch (nfsstat status) {
case NFS_OK:
	readokres reply;
default:
	void;
};
----------------------------------------------------------------------

◆write


----------------------------------------------------------------------
struct writeargs {
	nfs_fh	file;		/* handle for file */
	unsigned beginoffset;	/* beginning byte offset in file */
	unsigned offset;	/* current byte offset in file */
	unsigned totalcount;	/* total write count (to this offset)*/
	opaque data<NFS_MAXDATA>;
};

union attrstat switch (nfsstat status) {
case NFS_OK:
	fattr attributes;
default:
	void;
};
----------------------------------------------------------------------

◆create


----------------------------------------------------------------------
struct createargs {
	diropargs where;
	sattr attributes;
};
----------------------------------------------------------------------


[SunRPC] [NFS] [Pthread]
↑[もどる] ・[1月19日] →[1月26日]
Last updated: 1999/01/26 03:34:21
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>