# Network File System

Het Network File System, of kortweg NFS, is een netwerkbestandssysteem dat oorspronkelijk werd ontworpen door Sun Microsystems in 1984 voor hun eigen Unix-werkstations. NFS maakt het mogelijk om bestanden op te vragen over het netwerk op dezelfde manier als men dit zou doen voor bestanden op de lokale schijf.
NFS bestaat enkel uit een bestandssysteem en heeft niets te maken met procesbeheer of geheugenbeheer.

## Overzicht

Dankzij de eenvoudige architectuur van NFS wordt dit bestandssysteem ondertussen op uiteenlopende platformen ondersteund. Zo kan men tegenwoordig ook MS-DOS-clients gebruik laten maken van een UNIX-server met NFS.
De volledige architectuur van NFS wordt bepaald in de RFC's 1094, 1813, (3010) en 3530.
NFS ziet een verzameling van verbonden werkstations als een verzameling onafhankelijke machines met onafhankelijke bestandssystemen. Het doel van NFS is om op een transparante manier bestandsdeling mogelijk te maken tussen deze verschillende bestandssystemen. Deze bestandsdeling kan enkel op aanvraag plaatsvinden. Het delen is gebaseerd op een client-serverrelatie. Een machine kan zowel als cliënt of server fungeren. Delen is toegestaan tussen elke twee machines en is niet beperkt tot speciale servers.
Om nu een externe directory op een transparante manier toegankelijk te maken vanaf een bepaalde machine(M1), moet een cliënt van die machine eerst een mount-bewerking uitvoeren. Hierbij wordt met andere woorden een externe directory gemount over een directory van een lokaal bestandssysteem. Wanneer deze mount-bewerking is afgelopen ziet deze gemounte directory eruit als een subboom van de lokale directory en vervangt de subboom in de lokale directory. Om deze mount-bewerking te kunnen uitvoeren is het noodzakelijk om de locatie (of hostname) van de externe directory te specificeren. Wanneer dit is gebeurd kunnen gebruikers op machine M1 totaal transparant bij bestanden in de externe directory.

## Mountproces

Het mountproces wordt geïllustreerd op de afbeeldingen. De driehoeken in de afbeelding stellen de subbomen voor van de directory’s. Deze figuren laten drie onafhankelijke bestandssystemen van machines met namen zien: U, S1 en S2. Op dit punt zijn op alle machines enkel de lokale bestanden toegankelijk. De figuur toont het effect van het mounten van S1:/user/shared over U:/user/local. Deze figuur laat zien hoe al de gebruikers op machine U hun bestandssysteem zien. Zichtbaar is dat ze bijvoorbeeld toegang hebben tot elk bestand in de directory dir1. Dit doen ze door het voorvoegsel /user/local/dir1 te gebruiken als het mountproces is voltooid.
Naargelang de toegangsrechten kan in principe elk bestandssysteem of elke directory binnen een bestandssysteem extern worden gemount over elke lokale directory. Soms is het zelfs mogelijk om cascading mounts uit te voeren. Dit wil zeggen dat een bestandssysteem kan worden gemount over een ander bestandssysteem dat extern is gemount. Als een client een extern bestandssysteem Mount, krijgt deze geen toegang tot de mogelijke andere bestandssystemen die toevallig over dat bestandssysteem waren gemount. Hierdoor is NFS niet overgankelijk. Mount cascading wordt duidelijk gemaakt met volgende voorbeeld dat is gebaseerd op het vorige. De figuur toont het resultaat van het mounten van S2:/user/dir2 over U:/user/local/dir1. Het is dus mogelijk dat een gebruiker op eender welk werkstation zich kan inloggen en zijn eigen omgeving kan krijgen.

## Protocollen

NFS maakt gebruik van twee protocollen. Een voor het Mount-mechanisme en een ander voor externe bestandstoegang.

### Mountprotocol

De functie van het Mount protocol is het maken van een logische verbinding tussen een server en een client. Het Mount protocol geeft de client toegang tot het file system van de server. Het protocol geeft naast de externe directory ook de naam van het file systeem weer.
Wanneer een server een Mount-aanvraag ontvangt die overeenkomt met de geëxporteerde bestandssysteem, geeft de server een file handle terug aan de client. De file handle gebruikt de client als sleutel voor verdere toegang tot de bestanden van het bestandssysteem dat gemount is. De server houdt zelf een lijst bij van client machines en de op dit moment gemounte directory’s. Deze lijst kan dan worden gebruikt om de clients te waarschuwen wanneer de server dreigt uit te vallen.

### NFS-protocol

Het NFS protocol bestaat uit een aantal RPC procedures. Deze procedures ondersteunen een aantal bewerkingen:
* Zoeken naar een bestand in een directory;
* Een verzameling van directory-ingangen lezen;
* Manipuleren van links en directory’s;
* Bestanden lezen en schrijven.
Het is enkel mogelijk via een file handle deze procedures aan te roepen.
Een van de belangrijkste eigenschappen van een NFS server is dat deze statusloos zijn. Dit wil zeggen dat servers geen informatie bijhouden van hun clients tussen 2 benaderingen. Bij elke aanvraag van de client aan de server moeten dus alle parameters worden mee verstuurd. Dit heeft het grote voordeel dat er geen speciale procedures moeten worden opgestart na het crashen of uitvallen van de server. Doordat elke aanvraag aan de server een reeks nummer heeft, kan de server bepalen of de aanvraag dubbel werd verstuurd of er een aanvraag zou ontbreken. Deze lijst dient alleen als aanwijzing en is dus niet essentieel voor de werking van de client of de server.
Een nadeel met de vorige NFS versies was dat het geen ondersteuning gaf voor concurrency controle. Wanneer 2 gebruikers tegelijk naar hetzelfde externe bestand schrijven kunnen hun gegevens door elkaar geraken of verliezen. Services buiten NFS moeten ervoor zorgen dat er slechts 1 gebruiker tegelijk naar hetzelfde extern bestand kan schrijven.
Pas met de 4de versie van NFS werd dit probleem opgelost. Bij deze versie is state toegevoegd. State wil zeggen dat de nfs-client de server vertelt wat het met de file van plan is; op slot zetten, lezen, schrijven, verwijderen, etc. De nfs-v4 server kan reageren met 'state'-informatie van andere clients en zodoende het centrale filesysteem consistenter houden. Dit schept de mogelijkheid files in de lokale cache te gebruiken tot de nfs-v4 server aankondigt dat een andere client om deze file vraagt, en dat deze uit de lokale cache naar de server weggeschreven moet worden. Hierdoor hoeft veel netwerkverkeer niet plaats te vinden, tot de user de file sluit, of een andere user de file ook wil gebruiken.