NFSと分散オブジェクト

情報学類 分散システム					2008年01月22日

                                       筑波大学システム情報工学研究科
                                       コンピュータサイエンス専攻, 電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/dsys-2007/2008-01-22
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■復習

■SunRPC

NFS は、SunRPC 上で動作している。

■NFS(Network File System)

NFS ( Network File System ) は, Sun Microsystems 社が 開発したネットワーク・ファイル・システムの名前(固有名詞, 商標)。

ネットワーク・ファイル・システム(一般名詞)
ネットワークを通じて他のコンピュータ上にあるファイルを あたかも自分自身のローカルディスクにあるファイ ルと同じように扱えるようにしたファイルシステム
分散ファイルシステム
ネットワーク・ファイル・システムが発展して 「分散透明性(分散透過性、network transparency)」 が実現されたもの。
NFS は、Unix 系の OS (MacOSX 含む) では、事実上の標準。

その他のネットワーク・ファイル・システム(用のプロトコル)

◆NFSの機能

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

図? NFSによるファイルの共有

図? NFSによるファイルの共有

相互に参照し合える。

NFSの仕組み

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

NFSは、 SunRPC を利用している。 データの転送には, UDP/IP または、TCP/IP (NFS v3以降) を利用している。

RPCのサーバ
ディスクを持っているホストのカーネル
RPCのクライアント
参照しているホストのカーネル
サーバ側で nfsd というプログラムが 動いているように見える( ps コマンドで表示される) が、それは普通のプロセスではない。

/usr/include/rpcsvc/nfs_prot.x

表? NFSで使われているRPCの手続き

手続き名 意味 関連するコマンド、システムコール
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 v3 の新しい手続き。

◆NFSファイルハンドル

NFS でファイルやディレクトリを区別するための識別子。32バイト。

const NFS_FHSIZE	= 32;
...
/*
 * File access handle
 */
struct nfs_fh {
	opaque data[NFS_FHSIZE];
};

一番最初のNFSファイル・ハンドルをどうやって入手するか。

◆NFSマウントのためのRPCプログラム

一番 NFS v2, NFS v3 では、NFS 本体とは別にディレクトリ木のルートを得るため のRPC のプログラム(MOUNTPROG)がある。 /usr/include/rpcsvc/mount.x
手続き名 意味 関連するコマンド、 システムコール
null() 何もしない rpcinfo -u hostname mount コマンド
mnt() NFSファイルハンドルを返す mount コマンド
dump() マウント一覧表 showmount hostname コマンド
umnt() アンマウント umount コマンド
umntall() 全アンマウント umount -h hostname コマンド
export() アクセス可能なディレクトリのリストを返す  

◆lookup-read-write

NFS (v2,v3) には、次の手続きがない。 open() -- while(...) {read() or write()} -- close() のようなプログラムは、 NFS のレベルでは、lookup(); while( ... ) {read() or write()} になる。 read(), write() の引数は、必ずファイル中の読み書きする位置が含まれる。

◆lookup()

引数
検索対象のディレクトリの NFSファイルハンドルとファイル名
結果
ファイル、または、ディレクトリの NFS ファイル・ハンドルと属性
ファイル名には、区切り「/」は含まれない。要素ごとに lookup する。

2.2.5.  Look Up File Name

	diropres
	NFSPROC_LOOKUP(diropargs) = 4;

If the reply "status" is NFS_OK, then the reply "file" and reply
"attributes" are the file handle and attributes for the file "name"
in the directory given by "dir" in the argument.

2.3.10.  diropargs

    struct diropargs {
	fhandle  dir;
	filename name;
    };

The "diropargs" structure is used in directory operations.  The
"fhandle" "dir" is the directory in which to find the file "name".
A directory operation is one in which the directory is affected.

2.3.11.  diropres

    union diropres switch (stat status) {
    case NFS_OK:
	struct {
	    fhandle file;
	    fattr   attributes;
	} diropok;
    default:
	void;
    };

The results of a directory operation are returned in a "diropres"
structure.  If the call succeeded, a new file handle "file" and
the "attributes" associated with that file are returned along with
the "status".

◆read()

引数
対象ファイルの NFSファイルハンドル、読み込む位置(先頭からのオフセット)、バイト数
結果
属性、データ(opaque型)
2.2.7.  Read From File

	struct readargs {
		fhandle file;
		unsigned offset;
		unsigned count;
		unsigned totalcount;
	};

	union readres switch (stat status) {
	case NFS_OK:
		fattr attributes;
		nfsdata data;
	default:
		void;
	};

	readres
	NFSPROC_READ(readargs) = 6;

Returns up to "count" bytes of "data" from the file given by "file",
starting at "offset" bytes from the beginning of the file.  The first
byte of the file is at offset zero.  The file attributes after the
read takes place are returned in "attributes".

Notes:  The argument "totalcount" is unused, and is removed in the
next protocol revision.

◆write()

引数
対象ファイルの NFSファイルハンドル、書き込む位置(先頭からのオフセット)、データ(バイト数数含む)
結果
属性
2.2.9.  Write to File

	struct writeargs {
		fhandle file;
		unsigned beginoffset;
		unsigned offset;
		unsigned totalcount;
		nfsdata data;
	};

	attrstat
	NFSPROC_WRITE(writeargs) = 8;

Writes "data" beginning "offset" bytes from the beginning of "file".
The first byte of the file is at offset zero.  If the reply "status"
is NFS_OK, then the reply "attributes" contains the attributes of the
file after the write has completed.  The write operation is atomic.
Data from this "WRITE" will not be mixed with data from another
client's "WRITE".

Notes:  The arguments "beginoffset" and "totalcount" are ignored and
are removed in the next protocol revision.

◆cookie

RPC のようにコネクションが作られない通信サービスを使う時に冪等や無状態 といった性質を実現する時に必要になる技術。

例:NFSでのディレクトリの読み込み手続き nfsproc_readdir() で、1回の RPC で全部のデータを返せないことが起きる。 ディレクトリのどの位置まで読み込んだかを 示す中間状態を クッキー(cookie) という形でクライアントに返す。

クライアントは、次の RPC の呼び出しで、 前回受けとった応答の中のクッキーを、サーバへの要求に含めて送す。

◆readdir()

ls コマンドは、opendir() ライブラリ関数、getdirentries() システムコール (MacOSX, FreeBSD) を経て、NFS のレベルでは、readdir() になる。
引数
対象ディレクトリの NFSファイルハンドル、クッキー、バイト数
結果
エントリのリスト
各エントリは、名前、クッキー、inode番号からなる。
const NFS_COOKIESIZE	= 4;
typedef opaque nfscookie[NFS_COOKIESIZE];
2.2.17.  Read From Directory

	 struct readdirargs {
		 fhandle dir;
		 nfscookie cookie;
		 unsigned count;
	 };

	 struct entry {
		 unsigned fileid;
		 filename name;
		 nfscookie cookie;
		 entry *nextentry;
	 };

	 union readdirres switch (stat status) {
	 case NFS_OK:
		 struct {
			 entry *entries;
			 bool eof;
		 } readdirok;
	 default:
		 void;
	 };

	 readdirres
	 NFSPROC_READDIR (readdirargs) = 16;

 Returns a variable number of directory entries, with a total size of
 up to "count" bytes, from the directory given by "dir".  If the
 returned value of "status" is NFS_OK, then it is followed by a
 variable number of "entry"s.  Each "entry" contains a "fileid" which
 consists of a unique number to identify the file within a filesystem,
 the "name" of the file, and a "cookie" which is an opaque pointer to
 the next entry in the directory.  The cookie is used in the next
 READDIR call to get more entries starting at a given point in the
 directory.  The special cookie zero (all bits zero) can be used to
 get the entries starting at the beginning of the directory.  The
 "fileid" field should be the same number as the "fileid" in the the
 attributes of the file.  (See section "2.3.5. fattr" under "Basic
 Data Types".)  The "eof" flag has a value of TRUE if there are no
 more entries in the directory.

nfsproc_readdir() で、1回目と2回目の RPC の間にディレクトリの内容が 更新された場合、どのような結果になるのか不明。

◆NFS Version 3

◆NFS Version 4

2003年

◆CIFS (Common Internet File System)

CIFS は、Microsoft Windows で用いられているネットワーク・ファイル・ システム。

昔の名前は、 SMB (Server Message Block) プロトコル。 Samba は、 CIFS/SMB を、Unix 系のオペレーティング・システムで実現したプログラム。

Samba の利用法

■分散オブジェクト

◆プログラミング手法の発展

◆(分散ではない)オブジェクト

データとそれを操作する手続き(メソッド)を1つにまとめたもの。 オブジェクト指向のプログラミングでは、 プログラム全体をオブジェクトの集合として記述する。

オブジェクトは、専門家(人間)と対比される。

この性質は、分散システムを構築する時に有用。

図? スタック・オブジェクト、push、popメソッド、内部に配列、sp、クライアントとなるオブジェクト

図? スタック・オブジェクト

◆分散オブジェクト

オブジェクト指向で分散システムを構築する。 別のコンピュータ上のオブジェクトを、 コンピュータ間の境界をまたいで アクセス可能にする。

図? スタック・オブジェクト、ホスト1、ホスト2、ネットワーク

図? スタック・オブジェクト(分散システム)

◆分散オブジェクトの目的

◆RPCと分散オブジェクト

分散オブジェクトの個々のメソッド呼出しは、RPCの手続き呼出しとまったく同じものである。 RPCと分散オブジェクトは、何が違うのか。
RPC (Remoe Procedure Call) 分散オブジェクト
手続き型言語 オブジェクト指向言語
手続き メソッド
クライアント側スタブ スタブ
サーバ側スタブ スケルトン
インタフェース記述言語 インタフェース記述言語
バインディング 発見(discovery)
ポインタ、参照がない オブジェクトへの参照が渡せる
オブジェクト指向が入った RPC を、Object Request Broker (ORB) という。

◆CORBA(コルバ)

Common Object Request Broker Architecture。 業界団体 OMG (Object Management Group) による標準化された分散オブジェクトの仕組み。

様々なプログラミング言語のオブジェクトを相互に接続できる。

様々なメーカが、標準に従って CORBA の実装を製品として出荷している。 標準に従った製品間では、異なるメーカ間のものでも相互に接続できる。

◆Middleware

OSとアプリケーションの間に位置するシステムソフトウェア。 (複数の(分散)アプリケーションの間に位置するシステムソフトウェア。)

RPC, ORB は、middleware の一種。 分散OSなどでは、RPC を直接 OS が実装することもある。

Middleware == CORBA という思想の人もいた。

◆CORBA IDL (Interface Definition Language)

CORBA IDL は、CORBA でアクセス可能なオブジェクトのインタフェースを記述 するための言語(標準)。 コンパイラに掛けると、スタブ(クライアント側)とスケルトン(サーバ側) が生成される。

CORBA は、C++風のインタフェース定義言語を持つ。

特徴

例:

   1: module Counter
   2: {
   3:     interface Counter
   4:     {
   5:         void up();
   6:         long getValue();
   7:         void reset(in long newVal);
   8:     };
   9: };

◆idlj -- Java 言語用 CORBA IDL コンパイラ

idlj は、CORBA の IDL (言語独立) を読み込み、Java 言語用のスタブとスケ ルトンを出力する。
% ls [←]
Counter.idl
% idlj Counter.idl [←]
% ls -l [←]
total 8
drwxr-xr-x   7 yas  prof  238 Jan 21 19:14 Counter
-rw-r--r--   1 yas  prof  114 Feb  7  2002 Counter.idl
% ls Counter [←]
Counter.java            CounterHolder.java      _CounterStub.java
CounterHelper.java      CounterOperations.java
% []
Counter.idl を元にして、ディレクトリ Counter/ 以下にい くつかのファイルが作られる。

◆Java tnameserv

Java には、tnameserv と呼ばれる、CORBA 用の名前サーバがついている。

◆CORBA IIOP (nternet Inter-ORB Protocol)

TCP/IP で CORBA のメッセージをやりとりするためのプロトコル。 CORBA では、TCP/IP 以外も使える。 一般的な形式は、General Inter-ORB Protocol で定義している。

◆Microsoft COM (Component Object Model)

集中システム(Windows 95以降) での、分散オブジェクト技術の利用。 RPC の Remote (別のコンピュータ) の概念を、別のプログラム(アドレス空間) に拡張する。 同一コンピュータで、ネットワークを使わないで積極的に RPC を行う。 COM は、当初、OLE (Object Linking and Embedding) ととも呼ばれた。

COM の利用法

Windows のアプリケーションは、COM の固まりになっている。たとえば、 「Internet Explore」も同様。単体のアプリケーションはさほど意味がない。

COM では、別プロセス(別のアドレス空間)にRPCをする方法の他に、 同一アドレス空間内で、動的リンク技術で動作させられるものもある。

◆Microsoft DCOM (Distributed COM)

COM は、単一コンピュータ内のコンポーネントが使える。 DCOM は、別のコンピュータのコンポーネントが使える。

◆HORB

Java に RMI が入ったのは、JDK 1.1 から。それ以前に、電総研(現在の産電総 研)の平野氏によるHORBが開発された。 http://horb.aist.go.jp/horb-j/

◆Java RMI (Remote Method Invocation)

Java 言語専用の ORBで、 別の Java 仮想計算機間オブジェクトのメソッドを呼び出す仕組みを提供する。

RMI は、いくつかの層を見えなくする。

RPC(ORB) としての特徴   他の言語のプログラムとはつながらない。

◆XML Web サービス

Web サービスとは、本来の意味は、 Web of services であり、XML 技術を用い てソフトウェア・コンポーネント(部品)をネットワークを通じて利用可能に したもの。

Web サービスを、一般の World Wide Web と紛れないように呼ぶ時には、「XML Web サービス」と 頭に XML を使う。

XML は、歴史的に、HTML の反省で作られた。 メッセージの送受信には、HTTP が使われる。

XML サービスでよく使われている遠隔手続き呼出しの仕組みは、 XML-RPC と SOAP である。

Web サービスでは、異なるプログラミング言語で書かれたコンポーネントも相 互に接続できる。

◆XML-RPC と SOAP

XML-RPC と SOAP は、両方とも、 XML の技術を使って遠隔手続き呼出しを実現したもの。 XML-RPC の方が古い。

XML-RPCは、クライアントとサーバの間で交換されるメッセージとして XML を 用いる RPC の標準の一種である。一般的な概念というよりは、特定の標準を意 味する。

XML-RPC では、クライアントとサーバの間の通信は、XML により行われる。ク ライアントは、手続きの名前や入力パラメタを XML の形式にまとめて、サーバ へ送る。サーバでは、手続きが実行され、その結果もXMLの形でクライアントへ 返される。 XML-RPC では、クライアントとサーバの間の通信には、WWW で使わ れている HTTP が使われる。

XML-RPC では、メッセージが長くなり過ぎたり、型付けに問題があった。これ を解決するために、SOAP が作られた。

SOAP は、最初は、Simple Object Access Protocol の略であったが、 Object-Oriented ではないということで、この略は捨てられた。

XML-RPC では、データを交換するための中間形式として XML を使っていただけ であったが、SOAP では、XML のデータを直接 XML として渡すことができる。

SOAP では、HTTP の他に電子メールも通信媒体として使う事ができる。 SOAP 用に、HTTP のヘッダがいくつか拡張されたが、実際問題として活用しに くい。 SOAP は、Microsoft 社などにより提案され、その後、W3C で標準化が行われ ている。

http://www.w3.org/TR/soap/

◆WebサービスとWorld Wide Web

一般的な WWW
Web サービス

■練習問題

練習問題(9) NFS mountクライアント

/usr/include/rpcsvc/mount.x にある手続きのうち、次のどれかを実行するク ライアント側のプログラムを書きなさい。 サーバとしては、orchid-fs1 、または、orchid-fs2 を用いなさい。

練習問題(10) NFSクライアント

/usr/include/rpcsvc/nfs_prot.x にある手続きのうち、次のどれかを実行するク ライアント側のプログラムを書きなさい。 サーバとしては、orchid-fs1 を用いなさい。 ただし、この実験では、ディレクトリのファイル・ハンドルとして、次のどれ かを使いなさい。
Last updated: 2008/01/21 22:24:06
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>