% Studienarbeit von Lukas Gorzynski
%
% Universitaet Hamburg
% Fachbereich Informatik
% Arbeitsbereich DBIS
%
% Kapitel: NFS - Ein hierarchisches Filesystem


\chapter{NFS - Ein hierarchisches Filesystem}
\label{Kap. NFS}

Das Sun Network Filesystem (NFS) Protokoll erlaubt transparenten, entfernten Zugriff auf geshared Dateien in einem Netzwerk. Das NFS Protokoll ist mit dem Ziel entworfen worden, auf verschiedene Rechnerarchitekturen, Betriebsysteme, Netzwerkarchitekturen und Transportprotokolle portabel zu sein. Diese Portabilit"at wird durch die Nutzung der Remote Procedure Call (RPC) Primitiven, die auf der External Data Represantation (XDR) basieren, erreicht. Die RPC Grundlagen sowie die XDR Datenrepr"asentation werden im Kapitel 4 er"ortert.


\section{Architektur des NFS Filesystems}
\label{Abs. NFS Architektur}

Dateien in einem Dateisystem sind ein Abstraktionsmechanismus. Sie dienen der transparenten Speicherung von Informationen auf einem Speichermedium. Eine Datei selbst ist eine unstructurierte Sequenz von Bytes. \unix\ System unterstutzt folgende Dateitypen: regul"are Dateien, Verzeichnisse, Character special files und block special files. 


\section{Zustandsloser Server}
\label{Abs. Protokolle}


\section{Definition des NFS Protokolls}
\label{Abs. NFS-Definition}

Die Protokolldefinition der Version 2 von NFS ist durch ein Tupel von achtzehn Prozeduren mit ihren formalen Parametern und Resultaten bestimmt. Die Parameter und Resultate werden unter benutzung von Remote Procedure Call (RPC) definiert. RPC stellt auch Versionsnummern zur Verf"ugung, um die gleichzeitige Existenz mehrerer Versionen einer Prozedur in einem Server zu erm"oglichen. (FusSN: zu den Programmnummer + RPC wird im Kapitel ... beschrieben , verweise auf das Kapitel?)

/* Remote file service routines */

program NFS\_PROGRAM \{\\
	version NFS\_VERSION \{

		void 
		NFSPROC\_NULL(void) = 0;

		attrstat 
		NFSPROC\_GETATTR(nfs\_fh) = 1;

		attrstat 
		NFSPROC\_SETATTR(sattrargs) = 2;

		void 
		NFSPROC\_ROOT(void) = 3;

		diropres 
		NFSPROC\_LOOKUP(diropargs) = 4;

		readlinkres 
		NFSPROC\_READLINK(nfs\_fh) = 5;

		readres 
		NFSPROC\_READ(readargs) = 6;

		void 
		NFSPROC\_WRITECACHE(void) = 7;

		attrstat
		NFSPROC\_WRITE(writeargs) = 8;

		diropres
		NFSPROC\_CREATE(createargs) = 9;

		nfsstat
		NFSPROC\_REMOVE(diropargs) = 10;

		nfsstat
		NFSPROC\_RENAME(renameargs) = 11;

		nfsstat
		NFSPROC\_LINK(linkargs) = 12;

		nfsstat
		NFSPROC\_SYMLINK(symlinkargs) = 13;

		diropres
		NFSPROC\_MKDIR(createargs) = 14;

		nfsstat
		NFSPROC\_RMDIR(diropargs) = 15;

		readdirres
		NFSPROC\_READDIR(readdirargs) = 16;

		statfsres
		NFSPROC\_STATFS(nfs\_fh) = 17;

	\} = 2;\\
\} = 100003;

Weiter unten werden die Funktionen aller dieser Prozeduren kurz vorgestellt. Diese Beschreibung und die Definition der Basisdatentypen des NFS Servers, die im Kapitel ... detaliert eingegangen werden, sind die Grundlage der Implementierung des TFS Servers.



\section{Serverprozeduren}

Alle NFS Prozeduren sind synchron. Das bedeutet, da"s der Client erst nach Erhalt der Antwort sicher sein kann, da"s die von ihm aufgerufene NFS Prozedur erfolgreich ausgef"uhrt wurde. Diese Eigenschaft ist durch die Zustandslosigkeit des NFS Servers bedingt und bewirkt, da"s sich der Client die Aufrufe der NFS Prozeduren merken mu"s, um im Falle eines Server-Crashs diese wiederholt abschicken zu k"onnen.

Allen Prozeduren, die nicht void zur"uckliefern, gemeinsam ist, da"s die Resultatstruktur eine Statusvariable ''status'' vom Typ ''nfsstat'' enth"alt. Sie Informiert dar"uber, ob die Prozedur erfolgreich ausgef"uhrt wurde oder, ob Fehler oder Probleme aufgetreten sind, die das Erf"ullen der Aufgabe der Prozedur hindern. Die Definition dieser Variablen, sowie anderer Datenstrukturen, finden Sie im Anhang ....

\subsection{Do Nothing}
void NFS\_PROC\_NULL(void)
Die NULL Prozedur ist in allen RPC Diensten verf"ugbar und erlaub das Antwortverhalten und das Timing des Servers zu testen. 

\subsection{Get File Attributes}
attrstat NFS\_PROC\_GETATTR(fhandle)
Wenn der Antwortstatus NFS\_OK ist, enth"alt das Resultat die Attribute der durch den ''fhandle'' gegebenen Datei.

\subsection{Set File Attributes}
attrstat NFS\_PROC\_SETATTR(sattrargs)
Aufgabe dieser Prozedur ist es, die in der Struktur ''sattrargs'' enthaltenen Attribute der Datei ''file'' zuzuweisen. Die neugesetzten Attribute werden dann auch zur"uckgegeben.

\subsection{Get Filesystem Root}
void NFS\_PROC\_ROOT(void)
Diese Prozedur wird nicht mehr benutzt. Das Herausfinden des Filehandles des Root-Verzeichnisses geschieht beim mounten (siehe ''MOUNT PROTOCOL DEFINITION'').

\subsection{Look Up File Name}
diropres NFS\_PROC\_LOOKUP(diropargs)
Es werden durch diese Prozedur ''attributes'' und der ''fhandle'' der Datei ''file'' aus dem Verzeichnis ''dir'' zur"uckgegeben.

\subsection{Read From Symbolic Link}
readlinkres NFS\_PROC\_READLINK(fhandle)
Die ''data'' in ''readlinkres'' enth"alt Daten aus dem durch den ''fhandle'' referenzierten symbolischen Link. 

\subsection{Read From File}
readres NFS\_PROC\_READ(readargs)
Diese Prozedur liest, angefangen bei ''offset'' Bytes vom Anfang der Datei ''file'', bis zu ''count'' Bytes. Es werden auch, nachdem das lesen stattgefunden hat, die Attribute der Datei zur"uckgegeben.

\subsection{Write to Cache}
void NFS\_PROC\_WRITECASH(void)
WRITECASHE Prozedur ist f"ur h"ohere Versionen des Protokolls vorgesehen.

\subsection{Write to File}
readres NFS\_PROC\_READ(readargs)
Mit Hilfe dieser Prozedur wird ''data'', angefangen bei ''offset'' Bytes vom Anfang der Datei ''file'', geschrieben. Dabei besitzt das erste Byte einer Datei immer das Offset null. Die Attribute der ge"anderten Datei werden anschlie"send zur"uckgegeben.

\subsection{Create File}
diropres NFS\_PROC\_CREATE(createargs)
Im Verzeichnis ''dir'' erzeugt diese Prozedur eine neue Datei ''file''. Die neukreierte Datei erh"alt dann die Initialisierungsattribute ''attributes'', die zusammen mit dem Filehandle ''file'' der neuen Datei in der Resultatstruktur dem Klienten zur"uckgeschickt werden.

\subsection{Remove File}
stat NFS\_PROC\_REMOVE(diropargs)
Ein existierendes, leeres, durch ''name'' gegebenes Verzeichnis im Verzeichnis ''dir'' wird mit dieser Prozedur entfernt. Dem ''status'' kann sp"ater entnommen werden, ob das Verzeichnis gel"oscht ist oder ob dies nicht geschehen ist, weil z.B. das Verzeichnis nicht leer gewesen ist.

\subsection{Read From Directory}
readdirres NFS\_PROC\_READDIR(readdirargs)
NFS\_PROC\_READDIR gibt variable Anzahl von Verzeichnisseintr"agen des ''dir'' Verzeichnisses mit der Gesamtgr"o"se bis zu ''count'' Bytes zur"uck. Jeder Eintrag ''entry'' enth"alt eine ''fileid'', die eine Datei oder ein Verzeichnis innerhalb eines Filesystems eindeutig identifiziert, den Namen der Datei oder des Verzeichnisses aus dem ''dir'' Verzeichnis und einen opaquen Zeiger ''cookie'' auf den n"achsten Eintrag in diesem Verzeichnis. Der ''cookie'' Zeiger wird bei den nachfolgenden NFS\_PROC\_READDIR Aufrufen dazu verwendet, weitere Eintr"age des Verzeichnisses zu holen. Mit einem spezielem ''cookie'' gleich null kann der Klient die Anfangseintr"age anfordern. Das ''eof'' Flag hat den Wert TRUE, wenn keine weiteren Verzeichnisse im gegebenen Verzeichnis existieren.

\subsection{Get Filesystem Attributes}
statfsres NFS\_PROC\_STATFS(fhandle)
Durch Aufruf dieser Prozedur hat der Klient die M"oglichkeit sich "uber den Zustand des entfernten Dateisystems, auf das der ''fhandle'' verweist, zu informieren. Die entsprechenden Informationen werden ihm in der Struktur ''info'' "ubergeben.


\section{Definition des Mount Protokolls}
\label{Abs. Mount-Definition}

program MOUNTPROG {
	/*
	 * Version one of the mount protocol communicates with version two
	 * of the NFS protocol. The only connecting point is the fhandle 
	 * structure, which is the same for both protocols.
	 */
	version MOUNTVERS {

		/*
		 * It does no work. It is made available in all RPC services
		 * to allow server reponse testing and timing
		 */
		void
		MOUNTPROC_NULL(void) = 0;

		/*	
		 * If fhs_status is 0, then fhs_fhandle contains the
	 	 * file handle for the directory. This file handle may
		 * be used in the NFS protocol. This procedure also adds
		 * a new entry to the mount list for this client mounting
		 * the directory.
		 * Unix authentication required.
		 */
		fhstatus 
		MOUNTPROC_MNT(dirpath) = 1;

		/*
		 * Returns the list of remotely mounted filesystems. The 
		 * mountlist contains one entry for each hostname and 
		 * directory pair.
		 */
		mountlist
		MOUNTPROC_DUMP(void) = 2;

		/*
		 * Removes the mount list entry for the directory
		 * Unix authentication required.
		 */
		void
		MOUNTPROC_UMNT(dirpath) = 3;

		/*
		 * Removes all of the mount list entries for this client
		 * Unix authentication required.
		 */
		void
		MOUNTPROC_UMNTALL(void) = 4;

		/*
		 * Returns a list of all the exported filesystems, and which
		 * machines are allowed to import it.
		 */
		exports
		MOUNTPROC_EXPORT(void)  = 5;

		/*
		 * Identical to MOUNTPROC_EXPORT above
		 */
		exports
		MOUNTPROC_EXPORTALL(void) = 6;
	} = 1;
} = 0x20000005;

\subsection{Serverprozeduren}
#define MNTPATHLEN 1024
#define MNTNAMLEN 255
#define FHSIZE 32

typedef char fhandle[FHSIZE];
bool_t xdr_fhandle();

struct fhstatus {
	u_int fhs_status;
	union {
		fhandle fhs_fhandle;
	} fhstatus_u;
};
typedef struct fhstatus fhstatus;
bool_t xdr_fhstatus();

typedef char *dirpath;
bool_t xdr_dirpath();

typedef char *name;
bool_t xdr_name();

typedef struct mountbody *mountlist;
bool_t xdr_mountlist();

struct mountbody {
	name ml_hostname;
	dirpath ml_directory;
	mountlist ml_next;
};
typedef struct mountbody mountbody;
bool_t xdr_mountbody();

typedef struct groupnode *groups;
bool_t xdr_groups();

struct groupnode {
	name gr_name;
	groups gr_next;
};
typedef struct groupnode groupnode;
bool_t xdr_groupnode();

typedef struct exportnode *exports;
bool_t xdr_exports();

struct exportnode {
	dirpath ex_dir;
	groups ex_groups;
	exports ex_next;
};
typedef struct exportnode exportnode;
bool_t xdr_exportnode();
