Wat is NFS? Netwerk bestandssysteem. Bestandssysteem netwerktoegangsprotocol. NFS-prestaties verbeteren. Standaardrechten instellen

Iedereen weet dat op UNIX-systemen een bestandssysteem logischerwijs een verzameling fysieke bestandssystemen is die aan een enkel punt zijn gekoppeld. Een van de meest fundamentele charmes van een dergelijke organisatie is naar mijn mening de mogelijkheid om de structuur van een bestaand bestandssysteem dynamisch te wijzigen. Dankzij de inspanningen van de ontwikkelaars zijn we tegenwoordig in staat om een ​​FS van bijna elk type en op elke handige manier aan te sluiten. Als ik "in zekere zin" spreek, wil ik allereerst de mogelijkheid benadrukken om de OS-kernel te bedienen met bestandssystemen via netwerkverbindingen.

Veel netwerkprotocollen bieden ons de mogelijkheid om met externe bestanden te werken, of het nu FTP, SMB, Telnet of SSH is. Omdat de kernel uiteindelijk niet afhankelijk is van het type FS, kunnen we het mount-programma gebruiken om alles te verbinden en hoe je maar wilt.

Vandaag wil ik het hebben over NFS - Network File System. Met deze technologie kunnen individuele bestandssysteempunten op een externe computer worden aangesloten op het bestandssysteem van de lokale computer. Met het NFS-protocol zelf kunt u bestandsbewerkingen redelijk snel, veilig en betrouwbaar uitvoeren. Wat hebben we nog meer nodig? :-)

Wat is er nodig om dit te laten werken?

Om niet lang te razen over het onderwerp NFS-versies en hun ondersteuning in verschillende kernels, gaan we er onmiddellijk van uit dat uw kernelversie niet lager is dan 2.2.18. In de officiële documentatie beloven de ontwikkelaars volledige ondersteuning voor de functionaliteit van NFS versie 3 in deze kernel en later.

Installatie

Om de NFS-server op mijn Ubuntu 7.10 - de Gutsy Gibbon te draaien, moest ik de nfs-common- en nfs-kernel-server-pakketten installeren. Als je alleen een NFS-client nodig hebt, hoeft nfs-kernel-server niet te worden geïnstalleerd.

Server afstemmen

Nadat alle pakketten met succes zijn geïnstalleerd, moet u controleren of de NFS-daemon actief is:

/etc/init.d/nfs-kernel-server status

Als de daemon niet actief is, moet deze worden gestart met het commando

/etc/init.d/nfs-kernel-server start

Nadat alles succesvol is gestart, kunt u beginnen met het exporteren van het bestandssysteem. Het proces zelf is heel eenvoudig en kost een minimum aan tijd.

Het hoofdconfiguratiebestand van de NFS-server bevindt zich in / etc / exports en heeft het volgende formaat:

Directory machine1 (optie11, optie12) machine2 (optie21,optie22)

map- het absolute pad naar de FS-servermap waartoe u toegang wilt geven

machineX- DNS-naam of IP-adres van de clientcomputer van waaruit toegang is toegestaan

optieXX- FS-exportparameters, de meest gebruikte hiervan:

  • ro- toegang tot bestanden is alleen toegestaan ​​om te lezen
  • rw- lees-/schrijftoegang
  • no_root_squash- standaard, als u verbinding maakt met een NFS-share als root, zal de server, om veiligheidsredenen, aan zijn kant toegang krijgen tot bestanden als de gebruiker niemand. Als u deze optie echter inschakelt, worden bestanden aan de serverzijde als root benaderd. Wees voorzichtig met deze optie.
  • no_subtree_check- als u niet de hele partitie op de server exporteert, maar slechts een deel van het bestandssysteem, zal de daemon standaard controleren of het gevraagde bestand zich fysiek op dezelfde partitie bevindt of niet. Als u de hele partitie exporteert of als het koppelpunt van het geëxporteerde bestandssysteem geen invloed heeft op bestanden van andere fysieke volumes, kunt u deze optie inschakelen. Dit geeft u een verhoging van de serversnelheid.
  • synchroniseren- schakel deze optie in als de kans bestaat op een plotselinge onderbreking of stroomuitval van de server. Als deze optie niet is ingeschakeld, wordt het risico op gegevensverlies wanneer de NFS-server plotseling wordt gestopt aanzienlijk vergroot.

Dus laten we zeggen dat we ashep-desktop toegang willen geven tot de / var / backups directory van ashep-laptop. Directorytoegang is vereist om back-upbestanden van Ashep-desktop te kopiëren. Ik heb het volgende bestand:

/ var / back-ups van Ashep-desktop (rw, no_subtree_check, sync)

Na het toevoegen van een regel aan / etc / exports, moet u de NFS-server opnieuw opstarten om de wijzigingen door te voeren.

/etc/init.d/nfs-kernel-server herstart

Dat is alles. U kunt beginnen met het verbinden van het geëxporteerde bestandssysteem op de clientcomputer.

Clientconfiguratie

Aan de clientzijde wordt het externe bestandssysteem op dezelfde manier aangekoppeld als alle andere - met de opdracht mount. Ook verbiedt niemand u om / etc / fstab te gebruiken als u de FS automatisch moet verbinden wanneer het besturingssysteem opstart. Dus de optie met mount ziet er als volgt uit:

Mount -t nfs ashep-laptop: / var / back-ups / / mnt / ashep-laptop / back-ups /

Als alles goed is gegaan en je moet automatisch verbinding maken met het externe bestandssysteem bij het opstarten, voeg dan gewoon een regel toe aan / etc / fstab:

Ashep-laptop: / var / back-ups / mnt / ashep-laptop / back-ups nfs auto 0 0

Wat nog meer

Hier is een praktisch, klein overzicht van de mogelijkheden van NFS. Dit is natuurlijk maar een klein deel van wat NFS kan doen. Dit is voldoende voor gebruik thuis of op een klein kantoor. Als dit niet genoeg voor je is, raad ik je aan om eerst te lezen

Netwerkbestandssysteem (NFS)- netwerktoegangsprotocol voor bestandssystemen, hiermee kunt u externe bestandssystemen verbinden.
Oorspronkelijk ontwikkeld door Sun Microsystems in 1984, is het gebaseerd op Sun RPC: Remote Procedure Call. NFS is onafhankelijk van de server- en clientbestandssysteemtypen. Er zijn veel implementaties van NFS-servers en clients voor verschillende besturingssystemen. Momenteel wordt NFS v.4 gebruikt, dat verschillende authenticatietools ondersteunt (met name Kerberos en LIPKEY die het RPCSEC GSS-protocol gebruiken) en toegangscontrolelijsten (zowel POSIX- als Windows-types).
NFS biedt klanten transparante toegang tot de bestanden en het bestandssysteem van de server. In tegenstelling tot FTP, heeft NFS alleen toegang tot de delen van het bestand waartoe het proces toegang heeft gehad, en het belangrijkste voordeel is dat het deze toegang transparant maakt. Hierdoor kan elke clienttoepassing die met een lokaal bestand kan werken net zo goed werken met een NFS-bestand, zonder het programma zelf te veranderen.
NFS-clients hebben toegang tot bestanden op de NFS-server door RPC-verzoeken naar de server te sturen. Dit kan worden geïmplementeerd met behulp van normale gebruikersprocessen - namelijk de NFS-client kan een gebruikersproces zijn dat specifieke RPC-aanroepen naar de server doet, wat ook een gebruikersproces kan zijn.

versies
NFSv1 was alleen voor intern gebruik voor experimentele doeleinden. Implementatiedetails zijn gedefinieerd in RFC 1094.
NFSv2 (RFC 1094, maart 1989) werkte oorspronkelijk volledig via UDP.
NFSv3 (RFC 1813, juni 1995). Bestandsbeschrijvingen in versie 2 zijn een array van vaste grootte van 32 bytes. In versie 3 is het een array met variabele grootte tot 64 bytes. Een array met variabele lengte in XDR wordt gedefinieerd door een 4-byte-teller gevolgd door echte bytes. Dit verkleint de grootte van de bestandsdescriptor in implementaties zoals UNIX, die slechts ongeveer 12 bytes nodig hebben, maar stelt niet-Unix-implementaties in staat aanvullende informatie uit te wisselen.
Versie 2 beperkt het aantal bytes per READ of WRITE RPC tot 8192 bytes. Deze beperking is niet van toepassing in versie 3, wat op zijn beurt betekent dat bij gebruik van UDP de beperking alleen in de grootte van het IP-datagram zit (65535 bytes). Hierdoor kunnen grote pakketten worden gebruikt bij het lezen en schrijven op snelle netwerken.
Bestandsgroottes en initiële byte-offset voor LEES- en SCHRIJF-procedures begonnen 64-bits adressering te gebruiken in plaats van 32-bits, wat het werken met grotere bestanden mogelijk maakt.
Bij elke aanroep worden bestandskenmerken geretourneerd die van invloed kunnen zijn op de kenmerken.
Schrijfbewerkingen (WRITE) kunnen asynchroon zijn, terwijl ze in versie 2 synchroon moesten zijn.
Eén procedure is verwijderd (STATFS) en zeven zijn toegevoegd: ACCESS (controleren van bestandspermissies), MKNOD (een speciaal Unix-bestand maken), READDIRPLUS (retourneert de namen van bestanden in een map samen met hun attributen), FSINFO (geeft statistische informatie over het bestandssysteem ), FSSTAT (retourneert dynamische bestandssysteeminformatie), PATHCONF (retourneert POSIX.1-bestandsinformatie) en COMMIT (transfert eerder gemaakte asynchrone schrijfbewerkingen naar permanente opslag).
Ten tijde van de introductie van versie 3 begonnen ontwikkelaars TCP meer als transportprotocol te gebruiken. Hoewel sommige ontwikkelaars al TCP voor NFSv2 hebben gebruikt, heeft Sun Microsystems TCP-ondersteuning toegevoegd aan NFS versie 3. Dit maakte het gebruik van NFS via internet haalbaarder.
NFSv4 (RFC 3010, december 2000, RFC 3530, herzien april 2003), beïnvloed door AFS en CIFS, bevatte prestatieverbeteringen, hoge beveiliging en kwam naar voren als een compleet protocol. Versie 4 was de eerste versie die werd ontwikkeld in samenwerking met de Internet Engineering Task Force (IETF) nadat Sun Microsystems de ontwikkeling van de NFS-protocollen had doorgegeven. NFS v4.1 werd in januari 2010 goedgekeurd door de IESG en ontving RFC 5661. Een belangrijke innovatie in versie 4.1 is de pNFS-specificatie - Parallel NFS, een mechanisme voor parallelle NFS-clienttoegang tot gegevens van meerdere gedistribueerde NFS-servers. De aanwezigheid van een dergelijk mechanisme in de netwerkbestandssysteemstandaard zal helpen bij het bouwen van gedistribueerde "cloud"-opslag- en informatiesystemen.

NFS-structuur
De NFS-structuur heeft drie componenten op verschillende niveaus:
De applicatielaag (NFS zelf) bestaat uit de externe procedureaanroepen (rpc) die de noodzakelijke bewerkingen uitvoeren op bestanden en mappen aan de serverzijde.
De functies van de presentatielaag worden uitgevoerd door het XDR-protocol (eXternal Data Representation), dat een platformonafhankelijke data-abstractiestandaard is. Het XDR-protocol beschrijft een uniforme, canonieke vorm van gegevensrepresentatie die niet afhankelijk is van de architectuur van het computersysteem. Bij het verzenden van pakketten zet de RPC-client de lokale gegevens om in canonieke vorm, en de server doet het tegenovergestelde.
De Remote Procedure Call (RPC)-service, waarmee de client procedures op afstand kan aanvragen en deze op de server kan uitvoeren, biedt functionaliteit op sessieniveau. Netwerkbronnen verbinden
De procedure voor het verbinden van een netwerkbron met behulp van NFS wordt "exporteren" genoemd. De client kan de server vragen om een ​​lijst van de geëxporteerde bronnen die hij vertegenwoordigt. De NFS-server zendt zelf geen lijst uit van zijn geëxporteerde bronnen.
Afhankelijk van de gespecificeerde opties, kan de geëxporteerde bron worden aangekoppeld (bijgevoegd) "alleen-lezen", u kunt een lijst definiëren van hosts die mogen worden aangekoppeld, het gebruik van beveiligde RPC (secureRPC) specificeren, enz. Een van de opties bepaalt de montagemethode: "hard" (hard) of "soft" (zacht).
Bij een "harde" mount zal de client koste wat kost proberen het bestandssysteem te mounten. Als de server niet beschikbaar is, zal dit ertoe leiden dat de hele NFS-service lijkt te bevriezen: processen die toegang hebben tot het bestandssysteem, gaan in een staat van wachten op de voltooiing van RPC-verzoeken. Vanuit het oogpunt van gebruikersprocessen ziet het bestandssysteem eruit als een erg trage lokale schijf. Wanneer de server weer online is, blijft de NFS-service functioneren.
In een soft mount zal de NFS-client verschillende pogingen doen om verbinding te maken met de server. Als de server niet reageert, geeft het systeem een ​​foutmelding en stopt met proberen te koppelen. Vanuit het oogpunt van de logica van bestandsbewerkingen, emuleert een soft mount een storing van een lokale schijf wanneer een server uitvalt.
De keuze van de modus is afhankelijk van de situatie. Als de data op de client en server gesynchroniseerd moeten worden in het geval van een tijdelijke uitval van de dienst, dan heeft een "harde" mount de voorkeur. Deze modus is ook onmisbaar in gevallen waarin de aangekoppelde bestandssystemen programma's en bestanden bevatten die essentieel zijn voor de werking van de client, in het bijzonder voor schijfloze machines. In andere gevallen, vooral als het gaat om alleen-lezen systemen, is de soft mount-modus handiger.

Gemengd netwerk delen
NFS is ideaal voor op UNIX gebaseerde netwerken, aangezien het wordt geleverd met de meeste versies van het besturingssysteem. Bovendien is NFS-ondersteuning geïmplementeerd op UNIX-kernelniveau. Het gebruik van NFS op Windows-clientcomputers zorgt voor bepaalde problemen die verband houden met de noodzaak om gespecialiseerde en vrij dure clientsoftware te installeren. In dergelijke netwerken lijkt het gebruik van op SMB/CIFS gebaseerde hulpmiddelen voor het delen van bronnen, in het bijzonder Samba-software, de voorkeur te verdienen.

normen
RFC 1094 NFS: Network File System Protocol-specificatie] (maart 1989)
RFC 1813 NFS versie 3 protocolspecificatie] (juni 1995)
RFC 2224 NFS URL-schema
RFC 2339 Een overeenkomst tussen de Internet Society, de IETF en Sun Microsystems, Inc. in het geval van NFS V.4-protocollen
RFC 2623 NFS Versie 2 en Versie 3 Beveiligingsproblemen en het gebruik van RPCSEC_GSS en Kerberos V5 door het NFS-protocol
RFC 2624 NFS Versie 4 Ontwerpoverwegingen
RFC 3010 NFS versie 4 Protocol
RFC 3530 Network File System (NFS) versie 4 Protocol
RFC 5661 Network File System (NFS) versie 4 Minor versie 1 protocol

Gebruikte bronnen
1.ru.wikipedia.org
2.ru.science.wikia.com
3.phone16.ru
4.4stud.info
5.yandex.ru
6.gogle.com

NFS: een handig en toekomstbestendig netwerkbestandssysteem

Netwerk bestandssysteem Is een netwerkabstractie bovenop een regulier bestandssysteem, waardoor een externe client er via het netwerk toegang toe heeft op dezelfde manier als bij toegang tot lokale bestandssystemen. Hoewel NFS niet het eerste netwerkbestandssysteem was, is het tegenwoordig uitgegroeid tot het meest functionele en meest gevraagde netwerkbestandssysteem in UNIX®. Met NFS kunnen meerdere gebruikers een gemeenschappelijk bestandssysteem delen en gegevens centraliseren om de hoeveelheid schijfruimte die nodig is om ze op te slaan te minimaliseren.

Dit artikel begint met een kort overzicht van de geschiedenis van NFS en gaat vervolgens verder met het verkennen van de NFS-architectuur en hoe deze zal evolueren.

Een korte geschiedenis van NFS

Het eerste netwerkbestandssysteem heette FAL (File Access Listener) en werd in 1976 ontwikkeld door DEC (Digital Equipment Corporation). Het was een implementatie van het Data Access Protocol (DAP) en maakte deel uit van de DECnet-protocolsuite. Net als bij TCP/IP heeft DEC specificaties gepubliceerd voor zijn netwerkprotocollen, waaronder DAP.

NFS was het eerste moderne netwerkbestandssysteem dat over IP werd gebouwd. Het prototype is een experimenteel bestandssysteem dat begin jaren tachtig door Sun Microsystems is ontwikkeld. Gezien de populariteit van deze oplossing werd het NFS-protocol geïntroduceerd als een RFC-specificatie en vervolgens geëvolueerd naar NFSv2. NFS vestigde zich snel als een standaard vanwege zijn vermogen om samen te werken met andere clients en servers.

Vervolgens werd de standaard geüpdatet naar de NFSv3-versie gedefinieerd in RFC 1813. Deze versie van het protocol was schaalbaarder dan de vorige en ondersteunde grotere bestanden (meer dan 2 GB), asynchroon schrijven en TCP als transportprotocol. NFSv3 bepaalt de richting voor bestandssystemen voor wide area (WAN) netwerken. In 2000 werd NFS, als onderdeel van de RFC 3010-specificatie (herzien in de RFC 3530-versie), overgezet naar de bedrijfsomgeving. Sun introduceerde veiliger NFSv4 met stateful-ondersteuning (vorige versies van NFS ondersteunden statefulness niet, d.w.z. ze waren stateless). Momenteel is de nieuwste versie van NFS versie 4.1, gedefinieerd in RFC 5661, waarin het protocol door middel van de extensie pNFS ondersteuning voor parallelle toegang voor gedistribueerde servers is toegevoegd.

De geschiedenis van NFS-ontwikkeling, inclusief specifieke RFC's die de versies ervan beschrijven, wordt weergegeven in figuur 1.


Verrassend genoeg is NFS al bijna 30 jaar in ontwikkeling. Het is een extreem stabiel en draagbaar netwerkbestandssysteem met uitstekende schaalbaarheid, prestaties en servicekwaliteit. Met de toenemende snelheid en afnemende latentie van gegevensuitwisseling binnen een netwerk, blijft NFS een populaire manier om een ​​bestandssysteem binnen een netwerk te implementeren. Zelfs met LAN's stimuleert virtualisatie de opslag van gegevens op het netwerk om virtuele machines extra mobiliteit te bieden. NFS ondersteunt ook de nieuwste computeromgevingen die zijn ontworpen om virtuele infrastructuren te optimaliseren.

NFS-architectuur

NFS gebruikt een standaard client-server-architectuurmodel (zoals weergegeven in afbeelding 2). De server is verantwoordelijk voor het implementeren van het gedeelde bestandssysteem en de opslag waarmee clients verbinding maken. De client implementeert een gebruikersinterface naar een gedeeld bestandssysteem dat is gemonteerd in de lokale bestandsruimte van de client.

Figuur 2. Implementatie van het client-servermodel in de NFS-architectuur

Op Linux® biedt een virtuele bestandssysteemschakelaar (VFS) de mogelijkheid om meerdere bestandssystemen op een enkele host te ondersteunen (bijvoorbeeld een ISO 9660-bestandssysteem op een cd-rom en een ext3fs-bestandssysteem op een lokale harde schijf). De virtuele switch bepaalt naar welke schijf het verzoek wordt gedaan, en dus welk bestandssysteem moet worden gebruikt om het verzoek te verwerken. Daarom heeft NFS dezelfde compatibiliteit als andere bestandssystemen die in Linux worden gebruikt. Het enige verschil met NFS is dat I/O-verzoeken, in plaats van lokaal op de host te worden verwerkt, voor uitvoering naar het netwerk kunnen worden gerouteerd.

De VFS bepaalt dat het verzoek dat het ontvangt NFS is en geeft het door aan de NFS-handler in de kernel. De NFS-handler verwerkt de I/O-request en vertaalt deze naar een NFS-procedure (OPEN, ACCESS, CREATE, READ, CLOSE, REMOVE, etc.). Deze procedures, beschreven in een aparte RFC-specificatie, definiëren het gedrag van het NFS-protocol. De vereiste procedure wordt geselecteerd op basis van het verzoek en uitgevoerd met behulp van RPC-technologie (Remote Procedure Call). Zoals de naam al doet vermoeden, maakt RPC het mogelijk om tussen verschillende systemen procedure-aanroepen te doen. De RPC-service verbindt het NFS-verzoek met zijn argumenten en stuurt het resultaat naar de juiste externe host, en bewaakt vervolgens de ontvangst en verwerking van het antwoord om het terug te sturen naar de aanvrager.

RPC bevat ook een belangrijke XDR-laag ( externe gegevensrepresentatie- onafhankelijke presentatie van gegevens), die ervoor zorgt dat alle NFS-gebruikers voor dezelfde gegevenstypen hetzelfde formaat gebruiken. Wanneer een platform een ​​verzoek indient, kan het gegevenstype dat het gebruikt verschillen van het gegevenstype dat wordt gebruikt op de host die het verzoek verwerkt. XDR neemt het werk van typeconversie naar standaardweergave (XDR) over, zodat platforms die verschillende architecturen gebruiken, kunnen communiceren en bestandssystemen kunnen delen. XDR definieert een bitformaat voor typen zoals float en bytevolgorde voor typen zoals arrays met vaste en variabele lengte. Hoewel XDR vooral bekend staat om zijn gebruik in NFS, kan deze specificatie handig zijn wanneer je in dezelfde omgeving met verschillende architecturen moet werken.

Nadat XDR de gegevens heeft geconverteerd naar een standaardweergave, wordt het verzoek via een specifiek transportprotocol over het netwerk verzonden. Vroege implementaties van NFS gebruikten UDP, maar tegenwoordig wordt TCP gebruikt voor meer robuustheid.

Aan de kant van de NFS-server wordt een soortgelijk algoritme gebruikt. Het verzoek stijgt de netwerkstack via de RPC / XDR-laag (om gegevenstypen te converteren volgens de serverarchitectuur) en gaat naar de NFS-server, die verantwoordelijk is voor het verwerken van het verzoek. Daar wordt het verzoek doorgegeven aan de NFS-daemon om het doelbestandssysteem te bepalen waaraan het is geadresseerd, en gaat dan opnieuw de VFS binnen om toegang te krijgen tot dit bestandssysteem op de lokale schijf. Een volledig diagram van dit proces wordt getoond in figuur 3. Het lokale bestandssysteem van de server is een standaard Linux-bestandssysteem, bijvoorbeeld ext4fs. In feite is NFS geen bestandssysteem in de traditionele zin van het woord, maar een protocol voor toegang op afstand tot bestandssystemen.


Voor netwerken met lange latentie biedt NFSv4 een speciale samengestelde procedure ( samengestelde procedure). Met deze procedure kunt u meerdere RPC-oproepen in één verzoek verpakken om de overhead van het verzenden van verzoeken via het netwerk te minimaliseren. Deze procedure implementeert ook het mechanisme van terugbelfuncties voor het ontvangen van antwoorden.

NFS-protocol

Wanneer een client opstart met NFS, is de eerste stap de mount-bewerking, namelijk het mounten van het externe bestandssysteem naar de lokale bestandssysteemruimte. Dit proces begint met een aanroep van de mount-procedure (een van de Linux-systeemfuncties), die via de VFS wordt omgeleid naar de NFS-component. Vervolgens wordt met behulp van een RPC-aanroep naar de functie get_port op de externe server het poortnummer bepaald dat voor de montage wordt gebruikt, en verzendt de client een koppelverzoek via RPC. Dit verzoek aan de serverzijde wordt afgehandeld door een speciale rpc.mountd-daemon die verantwoordelijk is voor het mount-protocol ( mount-protocol). De daemon controleert of het door de client aangevraagde bestandssysteem in de lijst met beschikbare systemen op de gegeven server staat. Als het aangevraagde systeem bestaat en de client heeft er toegang toe, dan wordt de bestandssysteemdescriptor gespecificeerd in het antwoord van de mount RPC-procedure. De client behoudt informatie over de lokale en externe koppelpunten en kan I/O-verzoeken doen. Het mount-protocol is niet foutloos vanuit beveiligingsoogpunt, dus NFSv4 gebruikt in plaats daarvan interne RPC-aanroepen, die ook mount-punten kunnen manipuleren.

Om een ​​bestand te lezen, moet u het eerst openen. Er is geen OPEN-procedure in RPC; in plaats daarvan verifieert de client eenvoudig dat het opgegeven bestand en de opgegeven map op het aangekoppelde bestandssysteem bestaan. De client begint met het maken van een RPC GETATTR-verzoek aan de directory, die de attributen van de directory retourneert of een indicatie dat de directory niet bestaat. Vervolgens doet de client een RPC LOOKUP-verzoek om te controleren op het bestaan ​​van het bestand. Als het bestand bestaat, wordt een RPC GETATTR-verzoek gedaan om de kenmerken van het bestand te achterhalen. Met behulp van de informatie die is verkregen uit succesvolle LOOKUP- en GETATTR-aanroepen, maakt de client een bestandsdescriptor die aan de gebruiker wordt gepresenteerd voor toekomstige verzoeken.

Nadat het bestand is geïdentificeerd op het externe bestandssysteem, kan de client RPC READ-verzoeken uitgeven. Dit verzoek bestaat uit een bestandsdescriptor, status, offset en het aantal te lezen bytes. De client gebruikt de staat ( staat) om te bepalen of de operatie op dit moment kan worden uitgevoerd, d.w.z. het bestand is niet vergrendeld. compensatie ( offset) geeft aan waar te beginnen met lezen, en de byteteller ( Graaf) bepaalt hoeveel bytes moeten worden gelezen. Als resultaat van een RPC READ-aanroep retourneert de server niet altijd zoveel bytes als gevraagd, maar verzendt hij altijd samen met de geretourneerde gegevens hoeveel bytes er naar de client zijn verzonden.

Innovatie in NFS

Van het grootste belang zijn de twee nieuwste versies van NFS - 4 en 4.1, die kunnen worden gebruikt om de belangrijkste aspecten van de evolutie van NFS-technologie te bestuderen.

Vóór de komst van NFSv4, om bestandsbeheertaken uit te voeren, zoals mounten, vergrendelen, enz. er waren speciale aanvullende protocollen. In NFSv4 is het bestandsbeheerproces vereenvoudigd tot een enkel protocol; bovendien wordt UDP sinds deze versie niet meer als transportprotocol gebruikt. NFSv4 bevat ondersteuning voor UNIX en Windows® bestandstoegangssemantiek, waardoor NFS "natuurlijk" kan integreren met andere besturingssystemen.

NFSv4.1 introduceerde het concept van: parallelle NFS(parallelle NFS - pNFS). Om meer schaalbaarheid te bieden, implementeert NFSv4.1 een architectuur waarin data en metadata ( opmaak) worden op dezelfde manier over apparaten verdeeld als in geclusterde bestandssystemen. Zoals geïllustreerd verdeelt pNFS het ecosysteem in drie componenten: client, server en opslag. In dit geval verschijnen er twee kanalen: een voor het verzenden van gegevens en het andere voor het verzenden van besturingscommando's. pNFS scheidt gegevens van de metagegevens die deze beschrijven, waardoor een tweekanaalsarchitectuur ontstaat. Wanneer een client toegang wil tot een bestand, stuurt de server het "opmaak"-metadata. De metadata bevat informatie over de locatie van het bestand op opslagapparaten. Met deze informatie heeft de klant rechtstreeks toegang tot opslag zonder interactie met de server, wat de schaalbaarheid en prestaties verbetert. Wanneer de klant klaar is met werken met het bestand, bevestigt hij de wijzigingen die in het bestand zijn aangebracht en de "opmaak". Indien nodig kan de server de markup-metadata opvragen bij de client.

Met de komst van pNFS zijn er verschillende nieuwe bewerkingen aan het NFS-protocol toegevoegd om dit mechanisme te ondersteunen. De LayoutGet-methode wordt gebruikt om metadata van de server te halen, de LayoutReturn-methode "bevrijt" de metadata die door de client zijn "vastgelegd" en de LayoutCommit-methode laadt de "opmaak" die van de client is ontvangen in de repository, zodat deze beschikbaar is voor andere gebruikers. De server kan metadata van de client intrekken met behulp van de LayoutRecall-methode. "Gemarkeerde" metadata wordt verspreid over meerdere opslagapparaten om gelijktijdige toegang en hoge prestaties te bieden.


Gegevens en metagegevens worden opgeslagen op opslagapparaten. Clients kunnen directe I/O-verzoeken doen op basis van de resulterende markup, en de NFSv4.1-server slaat de metadata op en beheert deze. Deze functionaliteit zelf is niet nieuw, maar ondersteuning voor verschillende methoden om toegang te krijgen tot opslagapparaten is toegevoegd aan pNFS. Tegenwoordig ondersteunt pNFS het gebruik van blokprotocollen (Fiber Channel), objectprotocollen en NFS zelf (zelfs niet in pNFS-vorm).

NFS blijft zich ontwikkelen en de vereisten voor NFSv4.2 werden in september 2010 gepubliceerd. Sommige innovaties houden verband met de voortdurende migratie van opslagtechnologieën naar virtualisatie. In virtuele omgevingen met een hypervisor is dataduplicatie bijvoorbeeld zeer waarschijnlijk (meerdere besturingssystemen lezen/schrijven en cachen dezelfde data). Daarom is het wenselijk dat het opslagsysteem als geheel begrijpt waar duplicatie optreedt. Deze aanpak helpt de cacheruimte van de client en de algehele opslagcapaciteit te behouden. NFSv4.2 stelt voor om een ​​"blokkaart van gedeelde blokken" te gebruiken om dit probleem op te lossen. Omdat moderne opslagsystemen in toenemende mate worden uitgerust met hun eigen interne rekenkracht, wordt server-side kopiëren geïntroduceerd om de last van het kopiëren van gegevens op het interne netwerk te verminderen wanneer dit efficiënt kan worden gedaan op het opslagapparaat zelf. Andere innovaties zijn onder meer het cachen van subbestanden voor flash en aanbevelingen voor het aanpassen van client-side I/O (bijvoorbeeld met behulp van mapadvise).

NFS-alternatieven

Hoewel NFS het meest populaire netwerkbestandssysteem is op UNIX en Linux, zijn er ook andere netwerkbestandssystemen. Op het Windows®-platform wordt SMB het meest gebruikt, ook wel bekend als CIFS; Windows ondersteunt echter ook NFS, net als Linux SMB.

Een van de nieuwste door Linux ondersteunde gedistribueerde bestandssystemen, Ceph, was oorspronkelijk ontworpen als een fouttolerant POSIX-compatibel bestandssysteem. Meer informatie over Ceph vindt u in de rubriek.

Ook het vermelden waard zijn de bestandssystemen OpenAFS (de Open Source-versie van het Andrew Distributed File System ontwikkeld aan de Carnegie Mellon University en IBM), GlusterFS (een algemeen gedistribueerd bestandssysteem voor het organiseren van schaalbare gegevensopslag) en Luster (een enorm parallel netwerkbestand systeem voor clusteroplossingen). Al deze open source-systemen kunnen worden gebruikt om gedistribueerde opslag te bouwen.

Gevolgtrekking

De ontwikkeling van het NFS-bestandssysteem gaat door. Net als Linux, geschikt voor het ondersteunen van budget-, embedded en high-performance oplossingen, biedt NFS een architectuur van schaalbare opslagoplossingen die geschikt zijn voor zowel individuen als organisaties. Kijkend naar het pad dat NFS heeft afgelegd en de vooruitzichten voor zijn toekomstige ontwikkeling, wordt het duidelijk dat dit bestandssysteem de manier waarop we denken over hoe technologieën voor bestandsopslag worden geïmplementeerd en gebruikt, zal blijven veranderen.

Hoofdstuk 29 NFS: Netwerkbestandssysteem

Invoering

In dit hoofdstuk zullen we kijken naar het Network File System (NFS), een populaire applicatie die clientapplicaties transparante bestandstoegang biedt. De hoeksteen van NFS is Sun RPC: Remote Procedure Call, die we eerst zullen beschrijven.

Het clientprogramma vereist geen speciale tools om te profiteren van NFS. De kernel detecteert dat het bestand zich op de NFS-server bevindt en genereert automatisch een RPC-aanroep om toegang tot het bestand te krijgen.

We gaan niet in detail in op hoe bestandstoegang wordt geïmplementeerd, maar kijken eerder naar hoe de internetprotocollen, met name UDP, worden gebruikt.

Procedureoproep op afstand op afstand

In de meeste gevallen worden netwerkprogrammeerproblemen bereikt door toepassingsprogramma's te schrijven die functies aanroepen die door het systeem worden geleverd om specifieke netwerkbewerkingen uit te voeren. De ene functie voert bijvoorbeeld een actieve TCP-open uit, een andere een passieve TCP-open, een derde verzendt gegevens via een TCP-verbinding, een vierde stelt specifieke protocolopties in (inclusief een TCP keepalive-timer), enzovoort. In de sectie Application Programming Interfaces van hoofdstuk 1 vermeldden we dat er twee populaire sets netwerkprogrammeerfuncties (API's), sockets en TLI's zijn. De API die door de client wordt gebruikt en de API die door de server wordt gebruikt, kunnen verschillen, evenals de besturingssystemen die tussen de client en de server draaien. Het zijn de communicatie- en applicatieprotocollen die bepalen of een bepaalde client met de server kan communiceren. Een Unix-client geschreven in C met sockets als programmeerinterface en TCP als communicatieprotocol kan communiceren met een mainframeserver die is geschreven in COBOL met behulp van andere API's en TCP als beide hosts zijn verbonden met het netwerk en beide een TCP-implementatie hebben. / IP.

Meestal stuurt de client opdrachten naar de server en stuurt de server antwoorden naar de client. Alle toepassingen die we hebben beoordeeld - Ping, Traceroute, routeringsdaemons, DNS-clients en -servers, TFTP, BOOTP, SNMP, Telnet, FTP, SMTP - zijn allemaal op deze manier gebouwd.

RPC, Remote Procedure Call, heeft een andere benadering van netwerkprogrammering. Het clientprogramma roept eenvoudig functies in het serverprogramma aan. Dit wordt beslist vanuit het oogpunt van de programmeur, maar in werkelijkheid vindt de volgende reeks acties plaats.

  1. Wanneer de client de procedure op afstand aanroept, wordt de functie op de lokale host aangeroepen, die wordt gegenereerd door het RPC-pakket. Deze functie wordt client-stub genoemd. client stub verpakt de procedureargumenten in een netwerkbericht en stuurt het bericht naar de server.
  2. server stub op de serverhost ontvangt een netwerkbericht. De argumenten worden opgehaald uit het netwerkbericht en er wordt een oproep gedaan naar een serverprocedure die is geschreven door een applicatieprogrammeur.
  3. De serverfunctie geeft de controle terug aan de server-stub, die op zijn beurt de ontvangen waarden overneemt, deze in een netwerkbericht verpakt en het bericht terugstuurt naar de client-stub.
  4. client stub retourneert waarden van het netwerkbericht naar de clienttoepassing.

Netwerkprogrammering met behulp van stubs en RPC-bibliotheekroutines maakt gebruik van API's (sockets of TLI's), maar gebruikerstoepassingen (clientprogramma en serverprocedures aangeroepen door de client) hebben nooit toegang tot de API. De clienttoepassing hoeft alleen de serverprocedure aan te roepen, waarbij alle implementatiedetails verborgen zijn door het RPC-pakket, de client-stub en de server-stub.

RPC-pakketten hebben de volgende voordelen.

  • Programmeren wordt gemakkelijker omdat je geen netwerkprogrammeerproblemen hoeft op te lossen (en als het moet, dan heel weinig). Applicatieprogrammeurs schrijven eenvoudig het clientprogramma en de serverprocedures die de client aanroept.
  • Als een onbetrouwbaar protocol zoals UDP wordt gebruikt, worden alle details, namelijk time-outs en hertransmissies, afgehandeld door het RPC-pakket. Dit vereenvoudigt op zijn beurt de gebruikerstoepassing.
  • De RPC-bibliotheek zorgt voor de noodzakelijke conversie van argumenten en retourwaarden. Als de argumenten bijvoorbeeld bestaan ​​uit gehele getallen en getallen met drijvende komma, verwerkt het RPC-pakket eventuele verschillen tussen de client- en serverrepresentaties van gehele getallen en getallen met drijvende komma. Dit maakt het eenvoudiger om clients en servers te implementeren om in heterogene omgevingen te werken.

RPC-programmering wordt gedetailleerd beschreven in hoofdstuk 18. De twee meest populaire RPC-pakketten zijn de Sun RPC en het RPC-pakket in de Distributed Computing Environment (DCE) van de Open Software Foundation (OSF).We zullen bekijken hoe een procedureaanroep wordt gedaan, hoe het geretourneerde bericht eruitziet en hoe dit heeft betrekking op het Sun RPC-pakket omdat dit pakket wordt gebruikt in het netwerkbestandssysteem. Sun RPC versie 2 wordt beschreven in RFC 1057 [Sun Microsystems 1988a].

Er zijn twee soorten Sun RPC. Eén versie is gebouwd met behulp van de socket-API en werkt met TCP en UDP. De andere, genaamd TI-RPC (transportonafhankelijk), is gebouwd met behulp van de TLI API en werkt met alle transportlagen die door de kernel worden geleverd. Vanuit ons oogpunt is er geen verschil tussen de twee, aangezien we in dit hoofdstuk alleen TCP en UDP behandelen.

Afbeelding 29.1 toont het formaat van een RPC-procedureaanroepbericht met UDP.

Afbeelding 29.1 RPC-procedureaanroepberichten in UDP-datagramformaat.

De standaard IP- en UDP-headers zijn eerder weergegeven (Figuur 3.1 en Figuur 11.2). Alles na de UDP-header wordt bepaald door het RPC-pakket.

De transactie-ID (XID - transactie-ID) wordt ingesteld door de client en geretourneerd door de server. Wanneer de client een reactie ontvangt, vergelijkt deze de door de server geretourneerde XID met de XID van het verzonden verzoek. Als ze niet overeenkomen, negeert de klant het bericht en wacht tot het volgende bericht arriveert. Elke keer dat een klant een nieuwe RPC uitgeeft, verandert deze de XID. Als de client de RPC echter opnieuw verzendt (als er geen antwoord is ontvangen), verandert de XID niet.

De variabele call is 0 voor de call en 1 voor de response. De huidige RPC-versie is 2. De volgende drie variabelen, programmanummer, versienummer en procedurenummer, identificeren de specifieke procedure die op de server moet worden aangeroepen.

Referenties identificeren de klant. In sommige voorbeelden wordt dit veld leeg gelaten, terwijl u in andere de digitale gebruikers-ID en de groeps-ID kunt vinden waartoe hij behoort. De server kan de inloggegevens bekijken en beslissen of het verzoek moet worden verwerkt of niet. Verifier wordt gebruikt voor Secure RPC (Secure RPC), die DES-codering gebruikt. Hoewel de autorisatie- en validatievelden velden met variabele lengte zijn, wordt hun lengte als onderdeel van het veld verzonden.

De parameters van de procedure volgen. Hun formaat hangt af van hoe de toepassing de procedure op afstand definieert. Hoe weet de ontvanger (serverstub) de grootte van de parameters? Omdat UDP wordt gebruikt, kan de grootte van de parameters worden berekend als de grootte van het UDP-datagram minus de lengte van alle velden tot aan het controleveld. Wanneer TCP wordt gebruikt in plaats van UDP, is er geen concept van vaste lengte, aangezien TCP een stroom van bytes is zonder recordscheidingstekens. In dit geval verschijnt een veld met een lengte van 4 bytes tussen de TCP-header en de XID, waaruit de ontvanger de lengte van de RPC-oproep in bytes weet. Hierdoor kan het RPC-oproepbericht indien nodig op meerdere TCP-segmenten worden verzonden. (DNS gebruikt een vergelijkbare techniek; Oefening 4 in hoofdstuk 14.)

Figuur 29.2 toont het formaat van het RPC-antwoord. Het wordt verzonden van de server-stub naar de client-stub wanneer de externe procedure wordt afgesloten.

Afbeelding 29.2 Indeling van het RPC-antwoordbericht als UDP-datagram.

De XID van de oproep wordt eenvoudig gekopieerd naar de XID van de respons. Het antwoordveld is 1, wat onderscheid maakt tussen een uitdaging en een reactie. Het statusveld is nul als het oproepbericht is geaccepteerd. (Het bericht kan worden weggegooid als het RPC-versienummer niet 2 is, of als de server de client niet kan authenticeren.) Het verificatieveld wordt gebruikt in het geval van beveiligde RPC om de server aan te geven.

Het acceptatiestatusveld is nul als alles in orde is. Een waarde die niet nul is, kan bijvoorbeeld een ongeldig versienummer of een ongeldig procedurenummer aangeven. Als TCP wordt gebruikt in plaats van UDP, wordt, net als bij het RPC-uitdagingsbericht, een veld met een lengte van 4 bytes verzonden tussen de TCP-header en de XID.

XDR: externe gegevensweergave

External Data Representation (XDR) is een standaard die wordt gebruikt om waarden te coderen in RPC-oproep- en antwoordberichten - RPC-headervelden (XID, programmanummer, ontvangststatus, enzovoort), procedureparameters en procedureresultaten. De standaard manier om gegevens te coderen stelt een klant in staat om een ​​procedure aan te roepen op een systeem met een andere architectuur. XDR is gedefinieerd in RFC 1014 [Sun Microsystems 1987].

XDR definieert een aantal gegevenstypen en de exacte manier waarop ze worden overgedragen in een RPC-bericht (bitvolgorde, bytevolgorde, enzovoort). De afzender moet het RPC-bericht in XDR-formaat construeren, waarna de ontvanger het XDR-formaat naar zijn oorspronkelijke weergave converteert. (In het formaat dat voor zijn systeem wordt geaccepteerd.) We zien bijvoorbeeld in de figuren 29.1 en 29.2 dat alle gehele waarden die we hebben weergegeven (XID, oproep, programmanummer, enzovoort) 4-byte gehele getallen zijn . Alle gehele getallen in XDR zijn inderdaad 4 bytes. XDR ondersteunt andere gegevenstypen, waaronder integers zonder teken, booleans, floating point getallen, arrays met vaste lengte, arrays met variabele lengte en structuren.

Poortovereenkomst

Server-RPC-programma's die procedures op afstand bevatten, gebruiken dynamisch toegewezen poorten in plaats van vooraf bekende poorten. Dit vereist een vorm van "registratie" om constant informatie te hebben over welke dynamisch toegewezen poort een bepaald RPC-programma gebruikt. Sun RPC noemt deze registrar een port mapper. (Een port mapper is een server die RPC-programmanummers converteert naar DARPA-protocolpoortnummers. Deze server moet actief zijn om een ​​RPC-oproep te doen.)

De term "poort" in de naam komt van de TCP- en UDP-poortnummers, kenmerken van de internetprotocolfamilie. Aangezien TI-RPC bovenop elke transportlaag draait, niet alleen TCP en UDP, is de naam van de poorttoewijzing op systemen die TI-RPC gebruiken (bijvoorbeeld SVR4 en Solaris 2.2) geconverteerd naar rpcbind. We blijven echter de bekendere port mapper gebruiken.

In feite moet de poortmapper zelf een bekende poort hebben: UDP-poort 111 en TCP-poort 111. Een poortmapper is slechts een RPC-serverprogramma. Het heeft een programmanummer (100000), versienummer (2), TCP-poort 111 en UDP-poort 111. Servers registreren elkaar bij de poortmapper met behulp van RPC-aanroepen, en clients vragen de poorttoewijzer aan met behulp van RPC-aanroepen. De poorttoewijzer biedt vier serverprocedures:

  1. PMAPPROC_SET. Aangeroepen door de RPC-server bij het opstarten om het programmanummer, het versienummer en het protocol in de poorttoewijzing te registreren.
  2. PMAPPROC_UNSET. Aangeroepen door de server om een ​​eerder geregistreerde transformatie te verwijderen.
  3. PMAPPROC_GETPORT. Geroepen door de RPC-client bij het opstarten om het poortnummer voor het opgegeven programmanummer, versienummer en protocol te krijgen.
  4. PMAPPROC_DUMP. Retourneert alle items (programmanummer, versienummer, protocol en poortnummer) naar de database van de poortconverter.

Wanneer het RPC-serverprogramma start en later wanneer het wordt aangeroepen door het RPC-clientprogramma, worden de volgende stappen uitgevoerd.

  1. De poortconverter moet eerst worden gestart, meestal bij het opstarten van het systeem. Dit creëert een TCP-eindpunt en opent passief TCP-poort 111. Het creëert ook een UDP-eindpunt dat wacht tot een UDP-datagram arriveert op UDP-poort 111.
  2. Bij het opstarten maakt het RPC-serverprogramma een TCP-eindpunt en een UDP-eindpunt aan voor elke ondersteunde versie van het programma. (Een RPC-programma kan meerdere versies ondersteunen. De client specificeert de vereiste versie bij het aanroepen van een serverprocedure.) Aan elk eindpunt wordt een dynamisch toegewezen poortnummer toegewezen. (Het maakt niet uit of de TCP- en UDP-poortnummers hetzelfde of verschillend zijn.) De server registreert elk programma, elke versie, elk protocol en elk poortnummer door op afstand een oproep te doen naar de poorttoewijzingsroutine PMAPPROC_SET.
  3. Wanneer het RPC-clientprogramma start, roept het de poorttoewijzingsroutine PMAPPROC_GETPORT aan om het dynamisch toegewezen poortnummer voor het gegeven programma, de versie en het protocol te krijgen.
  4. De client stuurt een RPC-uitdagingsbericht naar het poortnummer dat in stap 3 is verkregen. Als UDP wordt gebruikt, stuurt de client eenvoudig een UDP-datagram met het RPC-uitdagingsbericht (Figuur 29.1) naar het UDP-poortnummer van de server. Als reactie stuurt de server een UDP-datagram met een RPC-antwoordbericht (Figuur 29.2). Als TCP in gebruik is, maakt de client een actieve openstelling voor het TCP-poortnummer van de server en verzendt vervolgens een RPC-oproepbericht via de verbinding. De server reageert met een RPC-antwoordbericht via de verbinding.

Het programma rpcinfo (8) drukt alle huidige instellingen van de poortconverter af. (Dit is waar de PMAPPROC_DUMP port mapper routine wordt aangeroepen.) Typische output wordt hieronder getoond:

Zon% / usr / etc / rpcinfo -p
programma versus protopoort
100005 1 tcp 702 mountd NFS mount daemon
100005 1 udp 699 gemonteerd
100005 2 tcp 702 gemonteerd
100005 2 udp 699 gemonteerd

100003 2 udp 2049 nfs NFS zelf

100021 1 tcp 709 nlockmgr NFS lock manager
100021 1 udp 1036 nlockmgr
100021 2 tcp 721 nlockmgr
100021 2 udp 1039 nlockmgr
100021 3 tcp 713 nlockmgr
100021 3 udp 1037 nlockmgr

We kunnen zien dat sommige programma's meerdere versies ondersteunen, en elke combinatie van programmanummer, versienummer en protocol heeft zijn eigen toewijzing van poortnummers die door de poortmapper worden bediend.

Beide versies van de mount-daemon zijn toegankelijk via hetzelfde TCP-poortnummer (702) en hetzelfde UDP-poortnummer (699), maar elke versie van de blokkeringsmanager heeft zijn eigen poortnummer.

NFS-protocol

NFS biedt klanten transparante toegang tot de bestanden en het bestandssysteem van de server. Dit in tegenstelling tot FTP (hoofdstuk 27), dat bestandsoverdrachten biedt. Met behulp van FTP wordt een volledige kopie van het bestand gemaakt. NFS heeft alleen toegang tot de delen van het bestand waartoe het proces toegang heeft gehad, en het belangrijkste voordeel van NFS is dat het deze toegang transparant maakt. Dit betekent dat elke clienttoepassing die met een lokaal bestand kan werken, net zo goed met een NFS-bestand kan werken, zonder enige aanpassingen aan het programma zelf.

NFS is een client-servertoepassing die is gebouwd met Sun RPC. NFS-clients hebben toegang tot bestanden op de NFS-server door RPC-verzoeken naar de server te sturen. Dit kan worden geïmplementeerd met behulp van normale gebruikersprocessen - namelijk de NFS-client kan een gebruikersproces zijn dat specifieke RPC-aanroepen naar de server doet, wat ook een gebruikersproces kan zijn. NFS wordt echter meestal om twee redenen anders geïmplementeerd. Ten eerste moet toegang tot NFS-bestanden transparant zijn voor de klant. Daarom worden oproepen naar de NFS-client gedaan door het clientbesturingssysteem namens het gebruikersproces van de client. Ten tweede worden NFS-servers in het besturingssysteem geïmplementeerd om de efficiëntie van de server te verbeteren. Als de NFS-server een gebruikersproces zou zijn, moet elk clientverzoek en elke serverreactie (inclusief gegevens die moeten worden gelezen of geschreven) door een scheidingsteken gaan tussen de kernel en het gebruikersproces, wat over het algemeen vrij duur is.

In deze sectie zullen we kijken naar versie 2 van NFS zoals gedocumenteerd in RFC 1094 [Sun Microsystems 1988b]. Voor een betere beschrijving van Sun RPC, XDR en NFS, zie [X / Open 1991]. Voor details over het gebruik en beheer van NFS, zie [Stern 1991]. De specificaties van het NFS-protocol versie 3 werden in 1993 geïmplementeerd, waarover we in een gedeelte van dit hoofdstuk zullen praten.

Afbeelding 29.3 toont typische NFS-client- en NFS-serverinstellingen. In deze afbeelding moet u op het volgende letten.

  1. Het maakt de client niet uit of het een lokaal bestand of een NFS-bestand benadert. De kernel detecteert dit wanneer het bestand geopend is. Nadat het bestand is geopend, geeft de kernel alle aanroepen naar lokale bestanden door aan het vak gemarkeerd als "toegang tot lokale bestanden", en alle links naar NFS-bestanden worden doorgegeven aan het vak "NFS-client".
  2. De NFS-client stuurt RPC-verzoeken naar de NFS-server via de TCP / IP-module. NFS gebruikt meestal UDP, maar nieuwere implementaties kunnen TCP gebruiken.
  3. De NFS-server ontvangt verzoeken van de client als UDP-datagrammen op poort 2049. Hoewel NFS kan werken met een poorttoewijzing, waardoor de server dynamisch toegewezen poorten kan gebruiken, is UDP-poort 2049 in de meeste implementaties hard gecodeerd naar NFS.

Afbeelding 29.3 Typische NFS-client en NFS-serverinstellingen.

  • Wanneer de NFS-server een verzoek van een client ontvangt, wordt dit doorgegeven aan de lokale bestandstoegangsroutine, die toegang geeft tot de lokale schijf op de server.
  • Het kan even duren voordat de server clientverzoeken verwerkt. Zelfs toegang tot het lokale bestandssysteem kan even duren. Gedurende deze tijd wil de server geen verzoeken van andere clients blokkeren die ook moeten worden bediend. Om met deze situatie om te gaan, worden de meeste NFS-servers meerdere keren gestart, dat wil zeggen, er zijn verschillende NFS-servers in de kernel. Specifieke oplossingsmethoden zijn afhankelijk van het besturingssysteem. De meeste Unix-kernels hosten niet meerdere NFS-servers, maar starten in plaats daarvan meerdere gebruikersprocessen (gewoonlijk nfsd genoemd) die een enkele systeemaanroep uitvoeren en binnen de kernel blijven als een kernelproces.
  • Evenzo heeft een NFS-client tijd nodig om een ​​verzoek van een gebruikersproces op de host van de client te verwerken. RPC wordt afgegeven aan de serverhost, waarna een reactie wordt verwacht. Om ervoor te zorgen dat gebruikersprocessen op de client-host op elk moment NFS kunnen gebruiken, zijn er verschillende NFS-clients in de client-kernel. De exacte implementatie hangt ook af van het besturingssysteem. Unix-systemen gebruiken meestal een techniek die vergelijkbaar is met een NFS-server: een gebruikersproces genaamd biod doet één enkele systeemaanroep en blijft in de kernel als een kernelproces.
  • De meeste Unix-hosts kunnen functioneren als een NFS-client en een NFS-server, of beide. De meeste pc-implementaties (MS-DOS) hebben alleen NFS-clientimplementaties. De meeste IBM-mainframes bieden alleen NFS-serverfunctionaliteit.

    NFS is echt meer dan alleen een NFS-protocol. Figuur 29.4 toont de verschillende RPC-programma's die met NFS worden gebruikt.

    Sollicitatie

    Programma nummer

    Versienummer

    Aantal behandelingen

    poortconvertor
    NFS
    mount programma
    blok manager
    statusmonitor

    Figuur 29.4 Verschillende RPC-programma's die in NFS worden gebruikt.

    De versies die in deze afbeelding als eenheden worden weergegeven, zijn te vinden op systemen zoals SunOS 4.1.3. Nieuwere implementaties bieden nieuwere versies van sommige programma's. Solaris 2.2 ondersteunt bijvoorbeeld ook versie 3 en 4 van de port mapper en versie 2 van de mount daemon. SVR4 ondersteunt ook versie 3 van de poortconverter.

    De mount-daemon wordt aangeroepen op de NFS-host van de client voordat de client toegang heeft tot het bestandssysteem van de server. We zullen dit proces hieronder beschrijven.

    Met de vergrendelingsmanager en de statusmonitor kan de client sommige bestanden op de NFS-server vergrendelen. Deze twee programma's zijn onafhankelijk van het NFS-protocol, omdat voor blokkering client-identificatie op zowel de client-host als de server vereist is, en NFS zelf is "onverschillig". (We hebben het hieronder in meer detail over NFS-onverschilligheid.) Hoofdstukken 9, 10 en 11 van [X / Open 1991] documenteren de procedures die de vergrendelingsmanager en de statusmonitor gebruiken om in NFS te vergrendelen.

    Bestandsbeschrijvingen

    Een van de fundamenten van NFS wordt geïmplementeerd door bestandsdescriptors. Gebruik opaque om toegang te krijgen tot een bestand of map op de objectserver. De term ondoorzichtig betekent dat de server een bestandsdescriptor maakt, deze teruggeeft aan de client, die de client vervolgens gebruikt bij het openen van het bestand. De client kijkt nooit naar de inhoud van de bestandsdescriptor - de inhoud is alleen van belang voor de server.

    Een NFS-client ontvangt een bestandsdescriptor elke keer dat het een bestand opent dat zich daadwerkelijk op de NFS-server bevindt. Wanneer een NFS-client dit bestand leest of schrijft (namens een gebruikersproces), wordt de bestandsdescriptor teruggestuurd naar de server. Dit geeft aan dat het bestand is geopend.

    Gewoonlijk werkt een aangepast proces niet met bestandsdescriptors. Bestandsbeschrijvingen worden uitgewisseld tussen een NFS-client en een NFS-server. In versie 2 van NFS is de bestandsdescriptor 32 bytes en in versie 3 is deze gegroeid tot 64 bytes.

    Unix-servers slaan meestal de volgende informatie op in de bestandsdescriptor: bestandssysteem-ID (hoofd- en secundaire bestandssysteemapparaatnummers), inodenummer (i-node) (uniek nummer binnen het bestandssysteem), inodegeneratienummer (nummer dat elke keer verandert inode wordt hergebruikt voor een ander bestand).

    Koppel protocol

    De client gebruikt het NFS-aankoppelprotocol om het bestandssysteem van de server te koppelen voordat toegang wordt verkregen tot NFS-bestanden. Dit gebeurt meestal wanneer de client opstart. Als resultaat ontvangt de client een bestandsdescriptor voor het bestandssysteem van de server.

    Afbeelding 29.5 beschrijft de volgorde van acties voor een Unix-client bij het uitvoeren van de opdracht mount (8).

    Afbeelding 29.5 Mount-protocol gebruikt door de Unix mount-opdracht.

    In dit geval worden de volgende stappen uitgevoerd.

    1. Wanneer de server opstart, start de poortconverter erop.
    2. Na de port mapper start de mount daemon (mountd) op de server. Het creëert een TCP-eindpunt en een UDP-eindpunt en wijst aan elk een dynamisch toegewezen poortnummer toe. Vervolgens registreert het deze nummers bij de poortmapper.
    3. De client voert het mount-commando uit, dat een RPC-aanroep doet naar de poortmapper van de server om het poortnummer van de mount-daemon op de server te krijgen. Zowel TCP als UDP kunnen worden gebruikt voor communicatie tussen de client en de poortmapper, maar meestal wordt UDP gebruikt.
    4. De port mapper rapporteert het poortnummer.
    5. De opdracht mount stuurt een RPC-aanroep naar de mount-daemon om het bestandssysteem van de server te koppelen. Nogmaals, zowel TCP als UDP kunnen worden gebruikt, maar meestal wordt UDP gebruikt. De server kan nu de "geldigheid" van de client controleren op basis van zijn IP-adres en poortnummer om te zien of deze client het gespecificeerde bestandssysteem kan aankoppelen.
    6. De mount-daemon reageert met een bestandsdescriptor voor het opgegeven bestandssysteem.
    7. De client mount-opdracht geeft de mount-systeemaanroep om de bestandsdescriptor die in stap 5 is verkregen te binden aan het lokale koppelpunt op de clienthost. De bestandsdescriptor wordt opgeslagen in de NFS-clientcode en vanaf dit punt zal elke toegang door gebruikersprocessen tot bestanden op het bestandssysteem van de server de bestandsdescriptor als uitgangspunt gebruiken.

    Een dergelijke implementatie delegeert het hele mount-proces, behalve de mount-systeemaanroep op de client, aan gebruikersprocessen, niet aan de kernel. De drie programma's die we lieten zien - het mount-commando, de port mapper en de mount-daemon - zijn gebruikersprocessen.

    In dit voorbeeld werd op host sun (NFS-client) de opdracht uitgevoerd

    zon # mount -t nfs bsdi: / usr / nfs / bsdi / usr

    Dit commando koppelt de /usr-map op de host bsdi (NFS-server) als het lokale bestandssysteem /nfs / bsdi /usr. Figuur 29.6 toont het resultaat.

    Afbeelding 29.6 De bsdi: /usr-map aankoppelen als /nfs / bsdi /usr op sun.

    Als dan het bestand /nfs/bsdi/usr/rstevens/hello.c op de sun-client wordt geopend, wordt het bestand /usr/rstevens/hello.c geopend op de bsdi-server.

    NFS-procedures

    De NFS-server biedt 15 procedures, die we nu zullen beschrijven. (De nummers die in de beschrijving worden gebruikt, komen niet overeen met de NFS-procedurenummers, omdat we ze per functie hebben gegroepeerd.) Hoewel NFS is ontworpen om te werken tussen verschillende besturingssystemen, niet alleen Unix-systemen, zijn sommige procedures gebaseerd op Unix-functionaliteit, die op hun beurt mogelijk niet worden ondersteund door andere besturingssystemen (bijvoorbeeld harde koppelingen, symbolische koppelingen, groepering, uitvoeringsmachtigingen, enzovoort). Hoofdstuk 4 bevat meer informatie over de kenmerken van bestandssystemen, waarvan sommige door NFS worden gebruikt.

    1. KRIJGEN. Retourneert bestandskenmerken: bestandstype (normaal bestand, directory, enzovoort), toegangsrechten, bestandsgrootte, bestandseigenaar, laatste toegangstijd, enzovoort.
    2. SETAT. Stelt de attributen van een bestand in. Er kan slechts een bepaalde set attributen worden ingesteld: toegangsrechten, eigenaar, groepseigendom, grootte, tijdstip van laatste toegang en tijdstip van laatste wijziging.
    3. STATFS. Retourneert de status van het bestandssysteem: vrije ruimte, optimale overdrachtsgrootte, enzovoort. Wordt bijvoorbeeld gebruikt door het Unix df-commando.
    4. OPZOEKEN. "Evalueert" het bestand. Deze procedure wordt door de client aangeroepen telkens wanneer een gebruikersproces een bestand opent dat zich op de NFS-server bevindt. De bestandsdescriptor wordt geretourneerd, samen met de bestandskenmerken.
    5. LEZEN. Leest uit een bestand. De client specificeert de bestandsdescriptor, de startbyte-offset en het maximale aantal te lezen bytes (tot 8192).
    6. SCHRIJVEN. Schrijft naar een bestand. De client specificeert de bestandsdescriptor, de startbyte-offset, het aantal te schrijven bytes en de te schrijven gegevens.

      NFS-schrijfbewerkingen moeten synchroon zijn (in behandeling). De server kan niet met OK antwoorden totdat de gegevens met succes naar de schijf zijn geschreven (en alle andere bestandsinformatie die moet worden bijgewerkt).

    7. CREËREN. Maakt een bestand aan.
    8. VERWIJDEREN. Verwijdert het bestand.
    9. HERnoemen. Hernoemt het bestand.
    10. KOPPELING. Maakt een harde link naar een bestand. Een harde link is een Unix-concept dat specificeert dat een bepaald bestand op schijf een willekeurig aantal toegangspunten (namen, ook wel harde links genoemd) kan hebben die naar dat bestand verwijzen.
    11. SYMLINK. Creëert een symbolische link naar het bestand. Een symbolische link is een bestand dat de naam van een ander bestand bevat. De meeste bewerkingen die worden uitgevoerd op een symbolische link (bijvoorbeeld openen) worden daadwerkelijk uitgevoerd op het bestand waarnaar de symbolische link verwijst.
    12. LEES LINK. Het lezen van een symbolische link retourneert de naam van het bestand waarnaar wordt verwezen door de symbolische link.
    13. MKDIR. Maakt een map aan.
    14. RMDIR. Verwijdert een map.
    15. LEZEN. Leest een directory. Wordt bijvoorbeeld gebruikt door het Unix ls-commando.

    In feite beginnen de bovenstaande procedurenamen met het voorvoegsel NFSPROC_, dat we hebben weggelaten.

    UDP of TCP?

    NFS is oorspronkelijk geschreven om UDP te gebruiken en alle leveranciers bieden deze mogelijkheid. Nieuwere implementaties ondersteunen echter ook TCP. TCP-ondersteuning wordt gebruikt om op steeds snellere wereldwijde netwerken te werken. Daarom is het gebruik van NFS niet langer beperkt tot lokale netwerken.

    De grenzen tussen lokale en mondiale netwerken vervagen en dat gaat allemaal heel snel. Retourtijden variëren over een zeer breed bereik en overlopen komen steeds vaker voor. Deze kenmerken van wide area-netwerken leiden ertoe dat ze in toenemende mate de algoritmen gebruiken die we voor TCP hebben overwogen - langzame start en congestie vermijden. Aangezien UDP niets biedt dat lijkt op deze algoritmen, moeten ze of iets dergelijks worden ingebouwd in de NFS-client en -server, anders moet TCP worden gebruikt.

    NFS via TCP

    De Berkeley Net/2 NFS-implementatie ondersteunt zowel UDP als TCP. [Macklem 1991] beschrijft deze implementatie. Laten we eens kijken hoe NFS verschilt van TCP.

    1. Wanneer de server opstart, start hij de NFS-server, die een actieve opening doet op TCP-poort 2049, wachtend op een verbindingsverzoek van de client. Dit wordt meestal gedaan naast de normale NFS UDP, die luistert naar inkomende datagrammen op UDP-poort 2049.
    2. Wanneer een client het bestandssysteem van de server koppelt met behulp van TCP, wordt er actief geopend op TCP-poort 2049 op de server. Dit brengt een TCP-verbinding tot stand tussen de client en de server voor dit bestandssysteem. Als dezelfde client een ander bestandssysteem op dezelfde server koppelt, wordt een andere TCP-verbinding gemaakt.
    3. Zowel de client als de server stellen de TCP keepalive-optie in aan hun uiteinden van de verbinding (hoofdstuk 23). Hiermee kunt u het moment van falen of herstarten van een of andere deelnemer aan de centrale bepalen.
    4. Alle toepassingen op de client die het bestandssysteem van de server gebruiken, delen dezelfde TCP-verbinding voor dat bestandssysteem. Als het bijvoorbeeld in figuur 29.6 stond, zou er een andere map op bsdi zijn met de naam smith onder de map / usr, die toegang heeft tot bestanden in / nfs / bsdi / usr / rstevens en / nfs / bsdi / usr / smith zou er een delen en de dezelfde zelfde TCP-verbinding.
    5. Als de client vaststelt dat de server is gecrasht of opnieuw is opgestart (na het ontvangen van een TCP-fout "time-out verbinding" of "verbinding gesloten door host"), probeert hij opnieuw verbinding te maken met de server. De client maakt een andere actief open om een ​​TCP-verbinding voor dit bestandssysteem opnieuw tot stand te brengen. Elk verzoek van een client die een time-out heeft gehad op een eerdere verbinding, wordt opnieuw uitgegeven op een nieuwe verbinding.
    6. Als een client crasht, gebeurt hetzelfde met applicaties die vóór de crash draaiden. Wanneer de client opnieuw opstart, zal het waarschijnlijk het bestandssysteem van de server opnieuw activeren met behulp van TCP, met een andere TCP-verbinding met de server. De vorige client-server-verbinding voor dit bestandssysteem is in een halfopen staat (de server denkt dat deze nog open is), maar aangezien de server de optie "keep alive" heeft ingesteld, wordt deze halfopen verbinding gesloten wanneer de De TCP-server stuurt de volgende sonde. "blijf in leven."

    Na verloop van tijd zijn andere leveranciers van plan om NFS via TCP te gaan ondersteunen.

    NFS-voorbeelden

    Laten we tcpdump gebruiken om te zien welke NFS-routines door de client worden aangeroepen voor normale bestandsbewerkingen. Wanneer tcpdump vaststelt dat een UDP-datagram een ​​RPC-aanroep bevat (aanroep is 0 in figuur 29.1) met bestemmingspoort 2049, decodeert het het datagram als een NFS-verzoek. Evenzo, als een UDP-datagram een ​​RPC-antwoord bevat (antwoord is 1 in figuur 29.2) met een bronpoort van 2049, decodeert het het datagram als een NFS-antwoord.

    Eenvoudig voorbeeld: een bestand lezen

    In het eerste voorbeeld zullen we het bestand, dat zich op de NFS-server bevindt, naar de terminal kopiëren met het commando cat (1):

    Zon% cat /nfs/bsdi/usr/rstevens/hello.c kopieer bestand naar terminal
    voornaamst ()
    {
    printf ("hallo, wereld \ n");
    }

    Het / nfs / bsdi / usr bestandssysteem op sun (NFS-client) is eigenlijk het / usr bestandssysteem op bsdi (NFS-server), zoals weergegeven in figuur 29.6. De zonnekernel detecteert dit wanneer cat een bestand opent en NFS gebruikt om toegang te krijgen tot het bestand. Afbeelding 29.7 toont de uitvoer van de opdracht tcpdump.

    1 0.0 sun.7aa6> bsdi.nfs: 104 getattr
    2 0.003587 (0.0036) bsdi.nfs> sun.7aa6: antwoord ok 96

    3 0.005390 (0.0018) sun.7aa7> bsdi.nfs: 116 lookup "rstevens"
    4 0.009570 (0.0042) bsdi.nfs> sun.7aa7: antwoord ok 128

    5 0.011413 (0.0018) sun.7aa8> bsdi.nfs: 116 lookup "hello.c"
    6 0.015512 (0.0041) bsdi.nfs> sun.7aa8: antwoord ok 128

    7 0.018843 (0.0033) zo.7aa9> bsdi.nfs: 104 getattr
    8 0.022377 (0.0035) bsdi.nfs> sun.7aa9: antwoord ok 96

    9 0.027621 (0.0052) sun.7aaa> bsdi.nfs: 116 gelezen 1024 bytes @ 0
    10 0.032170 (0.0045) bsdi.nfs> sun.7aaa: antwoord ok 140

    Afbeelding 29.7 NFS-bewerking bij het lezen van een bestand.

    De opdracht tcpdump decodeert een NFS-verzoek of -antwoord en drukt het XID-veld voor de client af in plaats van het poortnummer. Het XID-veld op regel 1 en 2 is 0x7aa6.

    De bestandsnaam /nfs/bsdi/usr/rstevens/hello.c wordt met één element tegelijk afgehandeld door de open-functie in de client-kernel. Wanneer de open-functie / nfs / bsdi / usr bereikt, detecteert deze dat dit een NFS-koppelpunt is.

    Op regel 1 roept de client de GETATTR-procedure aan om de attributen te krijgen van de serverdirectory die de client heeft aangekoppeld (/usr). Dit RPC-verzoek bevat 104 bytes aan gegevens, naast de IP- en UDP-headers. Het antwoord op regel 2 retourneert OK en bevat 96 bytes aan gegevens, naast de IP- en UDP-headers. We kunnen in deze figuur zien dat het kleinste NFS-bericht ongeveer 100 bytes aan gegevens bevat.

    Op regel 3 roept de client LOOKUP aan op het rstevens-bestand en ontvangt een OK-antwoord op regel 4. LOOKUP specificeert de naam van het rstevens-bestand en een bestandsdescriptor die door de kernel werd opgeslagen toen het externe bestandssysteem werd aangekoppeld. Het antwoord bevat een nieuwe bestandsdescriptor die in de volgende stap wordt gebruikt.

    Op regel 5 LOOKUP de client het bestand hello.c met behulp van de bestandsdescriptor van regel 4. Het krijgt een andere bestandsdescriptor op regel 6. Deze nieuwe bestandsdescriptor is precies wat de client op regel 7 en 9 gebruikt om toegang te krijgen tot de / nfs bestand /bsdi/usr/rstevens/hello.c. We zien dat de client een LOOKUP uitvoert op elke naamcomponent in het pad naar het bestand dat wordt geopend.

    Op regel 7 voert de client GETATTR opnieuw uit, gevolgd door een READ op regel 9. De client vraagt ​​1024 bytes aan vanaf offset 0, maar ontvangt minder dan 1024 bytes aan gegevens. (Na het aftrekken van de RPC-veldgroottes en andere waarden die worden geretourneerd door de READ-procedure, worden 38 bytes aan gegevens geretourneerd op regel 10. Dat is precies de grootte van het hello.c-bestand.)

    In dit voorbeeld is het gebruikersproces niet op de hoogte van deze NFS-verzoeken en antwoorden die door de kernel worden gedaan. De applicatie roept gewoon de kernel open-functie aan, die de uitwisseling van 3 verzoeken en 3 reacties oproept (regels 1-6), en roept vervolgens de kernel-leesfunctie aan, die 2 verzoeken en 2 reacties oproept (regels 7-10). Voor de clienttoepassing is het bestand dat zich op de NFS-server bevindt transparant.

    Eenvoudig voorbeeld: een directory maken

    Laten we als een ander voorbeeld de werkdirectory wijzigen in de directory op de NFS-server en dan een nieuwe directory maken:

    Zon% cd / nfs / bsdi / usr / rstevens werkmap wijzigen
    zon% mkdir Mail maak een map aan

    Afbeelding 29.8 toont de uitvoer van het tcpdump-commando.

    1 0.0 sun.7ad2> bsdi.nfs: 104 getattr
    2 0.004912 (0.0049) bsdi.nfs> sun.7ad2: antwoord ok 96

    3 0.007266 (0.0024) zo.7ad3> bsdi.nfs: 104 getattr
    4 0.010846 (0.0036) bsdi.nfs> sun.7ad3: antwoord ok 96

    5 35.769875 (35.7590) zo.7ad4> bsdi.nfs: 104 getattr
    6 35.773432 (0.0036) bsdi.nfs> sun.7ad4: antwoord ok 96

    7 35.775236 (0.0018) sun.7ad5> bsdi.nfs: 112 opzoeken "Mail"
    8 35.780914 (0.0057) bsdi.nfs> sun.7ad5: antwoord ok 28

    9 35.782339 (0.0014) sun.7ad6> bsdi.nfs: 144 mkdir "Mail"
    10 35.992354 (0.2100) bsdi.nfs> sun.7ad6: antwoord ok 128

    Afbeelding 29.8 NFS-bewerking door directory (cd) te wijzigen in NFS-directory en vervolgens directory (mkdir) aan te maken.

    Bij het wisselen van directory roept de client de GETATTR-procedure twee keer aan (regel 1-4). Wanneer we een nieuwe map maken, roept de client de GETATTR-procedure aan (regel 5 en 6), dan LOOKUP (regel 7 en 8 om te controleren of een dergelijke map niet bestaat), en vervolgens MKDIR om de map te maken (regel 9 en 10) . Een OK-antwoord op regel 8 betekent niet dat de directory bestaat. Het betekent gewoon dat de procedure een bepaalde waarde heeft geretourneerd. tcpdump interpreteert de waarde die wordt geretourneerd door NFS-routines niet. De opdracht drukt eenvoudigweg OK en het aantal bytes aan gegevens in het antwoord af.

    Onverschilligheid

    Een van de kenmerken van NFS (NFS-critici noemen dit een wrat, geen kenmerk) is dat de NFS-server onverschillig is. Het maakt de server niet uit welke clients welke bestanden openen. Merk op dat er geen open- of sluitprocedure is in de eerder getoonde lijst met NFS-procedures. LOOKUP lijkt op openen, maar de server weet nooit of de client het bestand heeft geopend nadat de LOOKUP is gemaakt.

    De reden voor dit "luie gedrag" is om het gemakkelijker te maken om te herstellen van een servercrash en opnieuw op te starten.

    Voorbeeld: serverfout

    In het volgende voorbeeld lezen we een bestand van een NFS-server wanneer de server crasht en opnieuw opstart. Dit laat zien hoe de "onverschilligheid" van de server ervoor zorgt dat de client "niet weet" dat de server niet beschikbaar is. Zolang de server crasht en opnieuw opstart, is de client zich niet bewust van het probleem en werkt de clienttoepassing hetzelfde als voorheen.

    Op de sun-client begonnen we cat met een heel groot bestand als argument (/ usr / share / lib / termcap op de svr4 NFS-server), ontkoppelden we de Ethernet-kabel tijdens de overdracht, schakelden we de server uit en herstartten we de kabel. De client is geconfigureerd om 1.024 bytes te lezen in een enkele NFS-lezing. Figuur 29.9 toont de uitvoer van tcpdump.

    Regels 1-10 komen overeen met de client die het bestand opent. Deze bewerking lijkt op die in figuur 29.7. Op regel 11 zien we de eerste read (READ) uit een bestand van 1024 bytes aan gegevens; het antwoord keerde terug op regel 12. Dit gaat door tot regel 129 (lees een 1024 byte LEZEN en vervolgens een OK-antwoord).

    Op regel 130 en 131 zien we twee verzoeken met een time-out en opnieuw verzonden op regel 132 en 133. Eerste vraag: we zien twee leesverzoeken, de ene begint bij offset 65536 en de andere begint bij offset 73728, waarom? De clientkernel stelde vast dat de clienttoepassing sequentieel aan het lezen was en probeerde de datablokken van tevoren te krijgen. (De meeste Unix-kernels doen dit read-ahead.) De client-kernel voert ook verschillende NFS-blok I/O-daemons (biod-processen) uit die namens de client meerdere RPC-verzoeken proberen te genereren. Eén daemon leest 8192 bytes vanaf 65536 (in 1024-byte ketens), terwijl andere 8192 bytes vooruit lezen vanaf 73728.

    Client-hertransmissies verschijnen op regel 130-168. Op regel 169 zien we dat de server opnieuw is opgestart en een ARP-verzoek heeft verzonden voordat wordt gereageerd op het NFS-verzoek van de client vanaf regel 168. Het antwoord op regel 168 wordt verzonden op regel 171. De READ-verzoeken van de client gaan door.

    1 0.0 sun.7ade> svr4.nfs: 104 getattr
    2 0.007653 (0.0077) svr4.nfs> sun.7ade: antwoord ok 96

    3 0.009041 (0.0014) sun.7adf> svr4.nfs: 116 lookup "share"
    4 0.017237 (0.0082) svr4.nfs> sun.7adf: antwoord ok 128

    5 0.018518 (0.0013) sun.7ae0> svr4.nfs: 112 opzoeken "lib"
    6 0.026802 (0.0083) svr4.nfs> sun.7ae0: antwoord ok 128

    7 0.028096 (0.0013) sun.7ae1> svr4.nfs: 116 lookup "termcap"
    8 0.036434 (0.0083) svr4.nfs> sun.7ae1: antwoord ok 128

    9 0.038060 (0.0016) zon.7ae2> svr4.nfs: 104 getattr
    10 0.045821 (0.0078) svr4.nfs> sun.7ae2: antwoord ok 96

    11 0.050984 (0.0052) sun.7ae3> svr4.nfs: 116 lezen 1024 bytes @ 0
    12 0.084995 (0.0340) svr4.nfs> sun.7ae3: antwoord ok 1124

    Lezing

    128 3.430313 (0.0013) sun.7b22> svr4.nfs: 116 gelezen 1024 bytes @ 64512
    129 3.441828 (0.0115) svr4.nfs> sun.7b22: antwoord ok 1124

    130 4.125031 (0.6832) zo.7b23>
    131 4.868593 (0.7436) zo.7b24>

    132 4.993021 (0.1244) sun.7b23> svr4.nfs: 116 lees 1024 bytes @ 65536
    133 5.732217 (0.7392) sun.7b24> svr4.nfs: 116 lees 1024 bytes @ 73728

    134 6.732084 (0,9999) sun.7b23> svr4.nfs: 116 lezen 1024 bytes @ 65536
    135 7.472098 (0.7400) sun.7b24> svr4.nfs: 116 lees 1024 bytes @ 73728

    136 10.211964 (2.7399) zo.7b23>
    137 10.951960 (0.7400) zo.7b24>

    138 17.171767 (6.2198) sun.7b23> svr4.nfs: 116 lees 1024 bytes @ 65536
    139 17.911762 (0.7400) sun.7b24> svr4.nfs: 116 lees 1024 bytes @ 73728

    140 31.092136 (13.1804) sun.7b23> svr4.nfs: 116 lees 1024 bytes @ 65536
    141 31.831432 (0.7393) sun.7b24> svr4.nfs: 116 lees 1024 bytes @ 73728

    142 51.090854 (19.2594) sun.7b23> svr4.nfs: 116 lezen 1024 bytes @ 65536
    143 51.830939 (0.7401) sun.7b24> svr4.nfs: 116 lees 1024 bytes @ 73728

    144 71.090305 (19.2594) sun.7b23> svr4.nfs: 116 gelezen 1024 bytes @ 65536
    145 71.830155 (0.7398) sun.7b24> svr4.nfs: 116 lees 1024 bytes @ 73728

    Heruitzendingen

    167 291.824285 (0.7400) sun.7b24> svr4.nfs: 116 lees 1024 bytes @ 73728
    168 311.083676 (19.2594) sun.7b23> svr4.nfs: 116 gelezen 1024 bytes @ 65536

    Server opnieuw opgestart

    169 311.149476 (0.0658) arp wie-heeft zon vertellen svr4
    170 311.150004 (0.0005) arp antwoord zon is-om 8: 0: 20: 3: f6: 42

    171 311.154852 (0.0048) svr4.nfs> sun.7b23: antwoord ok 1124

    172 311.156671 (0.0018) sun.7b25> svr4.nfs: 116 gelezen 1024 bytes @ 66560
    173 311.168926 (0.0123) svr4.nfs> sun.7b25: antwoord ok 1124
    lezing

    Figuur 29.9 Een client las een bestand toen de NFS-server crashte en herstartte.

    De clienttoepassing zal nooit weten dat de server is gecrasht en opnieuw is opgestart, behalve dat er een pauze van 5 minuten was tussen regel 129 en 171, dus de servercrash is transparant voor de client.

    Om de lengte van de hertransmissie-time-outs in dit voorbeeld te schatten, stelt u zich voor dat er twee client-daemons zijn, elk met hun eigen time-outs. De intervallen voor de eerste daemon (afgelezen vanaf offset 65536) zijn ruwweg de volgende (afgerond op twee decimalen): 0,68; 0,87; 1,74; 3,48; 6,96; 13,92; 20,0; 20,0; 20.0 enzovoort. De afstand voor de tweede daemon (aflezing van offset 73728) is precies hetzelfde. Dit betekent dat deze NFS-clients time-outs gebruiken die veelvouden zijn van 0,875 seconden met een bovengrens van 20 seconden. Na elke time-out wordt het hertransmissie-interval verdubbeld: 0,875; 1,75; 3,5; 7.0 en 14.0.

    Hoe lang zal de klant hertransmissies maken? De opdrachtgever heeft twee mogelijkheden die hierop van invloed kunnen zijn. Ten eerste, als het bestandssysteem van de server hard is gemount, zal de client voor altijd opnieuw verzenden, maar als het bestandssysteem van de server soft is gemount, zal de client het afbreken na een vast aantal hertransmissies. In het geval van een harde koppeling heeft de client ook een optie om de gebruiker toe te staan ​​mislukte hertransmissies af te breken of niet. Als de clienthost bij het koppelen van het bestandssysteem van de server aangeeft dat het mogelijk is om te onderbreken en als we geen 5 minuten willen wachten voordat de server opnieuw is opgestart na een storing, kunnen we het onderbrekingsteken invoeren om de clienttoepassing te beëindigen .

    Verschillende van dezelfde procedures

    RPC-procedures kunnen meerdere keren door de server worden uitgevoerd, maar ze geven nog steeds hetzelfde resultaat. Bijvoorbeeld een NFS-leesroutine. Zoals we in figuur 29.9 hebben gezien, voert de client de READ-oproep gewoon opnieuw uit totdat hij een reactie ontvangt. In ons voorbeeld was de reden voor de hertransmissie dat de server uitviel. Als de server niet faalde en de berichten met de RPC-antwoorden verloren zijn gegaan (aangezien UDP geen betrouwbaar protocol is), verzendt de client gewoon opnieuw en voert de server dezelfde READ opnieuw uit. Hetzelfde deel van hetzelfde bestand wordt opnieuw gelezen en naar de klant gestuurd.

    Dit werkt omdat elke READ een startoffset bevat. Als de NFS-procedure de server zou vragen om de volgende N bytes van het bestand te lezen, zou het niet werken. Als de server niet onverschillig was (deze waarde is het tegenovergestelde van onverschilligheid), en het antwoord is verloren, en de client geeft READ opnieuw uit voor de volgende N bytes, dan zal het resultaat anders zijn. Daarom hebben NFS-procedures LEZEN en SCHRIJVEN een startoffset. Het is de client die de status handhaaft (de huidige offset voor elk bestand), niet de server.

    Helaas kunnen niet alle bestandssysteembewerkingen meerdere keren worden uitgevoerd. Stel je bijvoorbeeld de volgende stappen voor: de NFS-client geeft een REMOVE-verzoek om een ​​bestand te verwijderen; De NFS-server verwijdert het bestand en reageert met OK; serverreactie gaat verloren; NFS-client time-out en verzendt het verzoek opnieuw; De NFS-server kan het bestand niet vinden en geeft een foutmelding; de clienttoepassing ontvangt een foutmelding dat het bestand niet bestaat. Deze fout wordt geretourneerd naar de clienttoepassing en deze fout bevat onjuiste informatie - het bestand bestond niet en is verwijderd.

    Hieronder vindt u een lijst met NFS-routines die meerdere keren kunnen worden uitgevoerd: GETATTR, STATFS, LOOKUP, READ, WRITE, READLINK en READDIR. Procedures die niet meerdere keren kunnen worden uitgevoerd: CREATE, REMOVE, RENAME, LINK, SYMLINK, MKDIR en RMDIR. SETATTR wordt meestal meerdere keren uitgevoerd, tenzij het werd gebruikt om het bestand af te kappen.

    Aangezien er altijd antwoorden verloren kunnen gaan bij het gebruik van UDP, moeten NFS-servers een manier hebben om bewerkingen af ​​te handelen die niet meerdere keren kunnen worden uitgevoerd. De meeste servers hebben een recente responscache waarin ze de laatst ontvangen reacties voor dergelijke bewerkingen opslaan. Elke keer dat de server een verzoek ontvangt, kijkt hij eerst door zijn cache, en als een overeenkomst wordt gevonden, retourneert hij het vorige antwoord in plaats van de NFS-procedure opnieuw aan te roepen. [Juszczak 1989] beschrijft de details van deze cachetypes.

    Een vergelijkbare benadering van procedures op servers is van toepassing op alle op UDP gebaseerde toepassingen, niet alleen op NFS. DNS biedt bijvoorbeeld een service die meerdere keren pijnloos wordt gebruikt. De DNS-server kan een willekeurig aantal keren een parserverzoek indienen, wat niet tot negatieve resultaten zal leiden (misschien, behalve dat netwerkbronnen bezet zijn).

    NFS-versie 3

    In 1994 werden specificaties voor versie 3 van het NFS-protocol vrijgegeven [Sun Microsystems 1993]. De implementaties zullen naar verwachting in 1994 beschikbaar komen.

    De belangrijkste verschillen tussen versie 2 en versie 3 worden hier kort beschreven, we zullen ze V2 en V3 noemen.

    1. Bestandsbeschrijvingen in V2 zijn een array van vaste grootte van 32 bytes. In V3 is dit een array met variabele grootte tot 64 bytes. Een array met variabele lengte in XDR wordt gedefinieerd door een 4-byte-teller gevolgd door echte bytes. Dit verkleint de bestandsdescriptor in implementaties zoals Unix, die slechts ongeveer 12 bytes nodig hebben, maar laat niet-Unix-implementaties toe om aanvullende informatie uit te wisselen.
    2. V2 beperkt het aantal bytes per READ of WRITE RPC tot 8192 bytes. Deze beperking is niet van toepassing in V3, wat op zijn beurt betekent dat bij gebruik van UDP de beperking alleen in de grootte van het IP-datagram ligt (65535 bytes). Hierdoor kunnen grote pakketten worden gebruikt bij het lezen en schrijven op snelle netwerken.
    3. Bestandsgroottes en initiële byte-offsets voor LEES- en SCHRIJF-routines zijn uitgebreid van 32 naar 64 bits om grotere bestanden te kunnen opnemen.
    4. Bij elke aanroep worden bestandskenmerken geretourneerd die van invloed kunnen zijn op de kenmerken. Dit vermindert het aantal GETATTR-oproepen dat de klant nodig heeft.
    5. Schrijven (WRITE) kan asynchroon zijn, terwijl ze in V2 synchroon moesten zijn. Dit kan de prestaties van de SCHRIJF-procedure verbeteren.
    6. Eén procedure werd verwijderd (STATFS) en zeven werden toegevoegd: ACCESS (controleren van bestandspermissies), MKNOD (maken van een speciaal Unix-bestand), READDIRPLUS (retourneert de namen van bestanden in een directory samen met hun attributen), FSINFO (geeft statistische informatie over het bestandssysteem ), FSSTAT (retourneert dynamische bestandssysteeminformatie), PATHCONF (retourneert POSIX.1-bestandsinformatie) en COMMIT (transfert eerder gemaakte asynchrone schrijfbewerkingen naar permanente opslag).

    Korte conclusies

    RPC is een manier om een ​​client-server applicatie zo te bouwen dat de client simpelweg procedures op de server aanroept. Alle netwerkdetails zijn verborgen in client- en serverstubs, die voor toepassingen worden gegenereerd door het RPC-pakket en in de RPC-bibliotheekroutines. We lieten het RPC-oproep- en responsberichtformaat zien en vermeldden dat XDR wordt gebruikt om waarden te coderen, waardoor RPC-clients en -servers op machines met verschillende architecturen kunnen draaien.

    Een van de meest gebruikte RPC-applicaties is Sun NFS, een heterogeen bestandstoegangsprotocol dat veel wordt gebruikt op hosts van bijna alle formaten. We hebben NFS besproken en hoe het UDP of TCP gebruikt. NFS Versie 2 definieert 15 procedures.

    Clienttoegang tot de NFS-server begint met een mount-log, waarna een bestandsdescriptor naar de client wordt teruggestuurd. De client heeft dan toegang tot bestanden op het bestandssysteem van de server met behulp van deze bestandsdescriptor. Bestandsnamen worden met één element van de naam tegelijk op de server opgezocht en voor elk element wordt een nieuwe bestandsdescriptor geretourneerd. Het eindresultaat is een handvat voor het bestand dat is geopend en gebruikt voor sequentiële lees- en schrijfbewerkingen.

    NFS probeert al zijn procedures onafhankelijk te maken van het aantal uitvoeringen, zodat de client het verzoek eenvoudig opnieuw kan indienen als het antwoord verloren gaat. We hebben hiervan voorbeelden gezien: in het geval dat een client een bestand aan het lezen was terwijl de server crashte en opnieuw opstartte.

    Opdrachten

    In figuur 29.7 zagen we dat tcpdump pakketten interpreteert als NFS-verzoeken en antwoorden, en de XID afdrukt. Kan tcpdump dit doen voor RPC-verzoeken of -antwoorden?
  • Waarom denk je dat het RPC-serverprogramma op Unix-systemen dynamisch toegewezen poorten gebruikt in plaats van bekende?
  • De RPC-client heeft twee serverprocedures aangeroepen. De eerste procedure duurde 5 seconden om uit te voeren, en de tweede duurde 1 seconde. De client heeft een time-out van 4 seconden. Teken een tijdlijndiagram van wat de client en de server uitwisselen. (Stel je voor dat er geen tijd wordt verspild aan het doorgeven van een bericht van client naar server en vice versa.)
  • Wat gebeurt er in het voorbeeld in figuur 29.9 als terwijl de NFS-server werd afgesloten, de Ethernet-kaart werd verwijderd?
  • Toen de server opnieuw opstartte in figuur 29.9, verwerkte hij het verzoek vanaf offset 65536 (regels 168 en 171) en verwerkte het vervolgens het volgende verzoek vanaf offset 66560 (regels 172 en 173). Wat gebeurt er met de query die begint bij offset 73728 (regel 167)?
  • Toen we procedures beschreven die onafhankelijk waren van het aantal NFS-uitvoeringen, lieten we een voorbeeld zien van een REMOVE-reactie die verloren ging in het netwerk. Wat gebeurt er in dit geval als TCP wordt gebruikt in plaats van UDP?
  • Als de NFS-server een dynamisch toegewezen poort gebruikt in plaats van poort 2049, wat gebeurt er dan met de NFS-client als de server crasht en opnieuw opstart?
  • Gereserveerde poortnummers (Hoofdstuk 1, sectie Poortnummers) zijn zeer, zeer weinig, met een maximum van 1023 per host. Als een NFS-server vereist dat zijn clients gereserveerde poorten hebben (wat meestal het geval is), en een NFS-client die TCP gebruikt N bestandssystemen op N verschillende servers koppelt, moet de client dan voor elke verbinding verschillende gereserveerde poortnummers hebben?
  • NFS (Netwerkbestandssysteem)- een netwerkprotocol voor toegang tot bestanden en het bestandssysteem van de NFS-server, populair in de Linux / UNIX OS-familie, evenals verschillende opslagsystemen. Microsoft wilde ook niet achterblijven bij de concurrentie en introduceerde de basisfunctionaliteit van de NFS-server in Windows Server 2003 R2. In latere versies van Microsoft-serverplatforms werden de mogelijkheden van de ingebouwde NFS Windows-server uitgebreid, verschenen nieuwe functionaliteit en beheertools. NFS-server in Windows Server 2012 is een nieuwe mijlpaal in de ontwikkeling van deze technologie.

    Wat voor nieuw bieden Microsoft-ontwikkelaars ons in dit product? Nieuwe functies van NFS-server in Windows Server 2012:

    1. NFS v4.1-ondersteuning... Ondersteuning voor de nieuwste versie van NFS 4.1 is een van de belangrijkste innovaties in Windows Server 2012. In vergelijking met NFS v3 biedt dit protocol verbeterde beveiliging, prestaties en interoperabiliteit, waarbij alle aspecten van RFC 5661 volledig worden geïmplementeerd.
    2. Out-of-the-box prestaties. Dankzij het gebruik van de nieuwe RPC-XDR-transportinfrastructuur kunnen out-of-the-box optimale NFS-serverprestaties worden bereikt zonder de noodzaak om systeemparameters af te stemmen. Optimale prestaties worden bereikt door automatisch afstemmen van de cache, pooling van werkprocessen en dynamisch poolbeheer op basis van hun belasting.
    3. Vereenvoudigde implementatie en beheer... Dit feit werd bereikt dankzij:
      • - 40+ PowerShell-cmdlets voor het configureren van de NFS-server en het beheren van gedeelde mappen
      • - een eenvoudige grafische beheerinterface waarmee u tegelijkertijd zowel SMB- als NFS-shares kunt beheren, evenals instellingen voor bestandsscreening, enz.
      • - repareren van de RPC-poort (poort 2049) voor gemakkelijke configuratie van firewalls
      • - nieuwe provider WMI v2
      • - vereenvoudigde identificatie dankzij een plat kaartbestand
    4. NFSv3-verbeteringen... Door snel failover-meldingen naar clients te sturen door de Network Status Monitor (NSM), kunnen oudere NFS-clients failover beter en sneller afhandelen, wat minder downtime betekent.

    De NFS-server in Windows Server 2012 is dus aanzienlijk verbeterd op het gebied van implementatiegemak, schaalbaarheid, stabiliteit, beschikbaarheid, betrouwbaarheid, beveiliging en compatibiliteit. Gedeelde mappen zijn gelijktijdig toegankelijk via SMB en NFS, waardoor Windows Server 2012 kan worden gebruikt als opslag in heterogene netwerken.

    NFS-server in Windows Server 2012 kan worden geïnstalleerd met behulp van GUI en Powershell. Om een ​​NFS-server te installeren met behulp van de GUI, opent u en markeert u binnen de rol Bestands- en opslagservices het onderdeel Server voor NFS.

    Nadat de installatie van de NFS-component is voltooid, moet de server opnieuw worden opgestart.

    Het installeren van dezelfde rol met Powershell is ook eenvoudig, voer gewoon de opdracht uit:

    Add-Windows-functie "FS-NFS-Service"

    Een gedeelde NFS-map configureren in Windows Server 2012

    Vervolgens laten we zien hoe, met behulp van de rol die we hebben geïnstalleerd, een NFS-share (gedeelde map) op een Windows-server wordt gemaakt. Er zijn verschillende manieren om opnieuw een NFS-share te maken: met behulp van de grafische interface of Powershell.

    Een NFS-share maken met behulp van de Server Manager Console

    Open de console Serverbeheer, ga naar sectie Beheer delen(zit in de rol) Bestands- en opslagservices).
    Start in het contextmenu de wizard Nieuwe gedeelde map - Nieuw Delen...

    Selecteer het type ballen NFSDeel -Snel

    Vervolgens moet u het type authenticatie voor NFS-clients instellen: gebruik mogelijk zowel Kerberos-authenticatie als anoniem.

    Stel dat de gebruiker van de gemaakte NFS-bron een ESXi-virtualisatieserver is, waarin er geen mogelijkheid is om NFS-verbindingen te verifiëren (ESXi ondersteunt NFSv4) niet. Daarom zal het authenticatietype zijn: Geen serververificatie, we noteren ook de opties Niet-toegewezen gebruikerstoegang inschakelen en Sta niet-toegewezen gebruikerstoegang toe via UID / GID.

    Om de aangemaakte NFS-share enigszins te beschermen tegen toegang van derden, beperken we de toegang tot de NFS-bron via het IP-adres van de client.

    Gastheer: 192.168.1.100
    Taalcodering: BIG5
    Machtigingen delen: Lezen schrijven
    Root-toegang toestaan: Ja

    Vervolgens moet nog worden gecontroleerd of op NTFS-niveau de gebruiker waaraan de verbindende gebruiker is toegewezen lees-/schrijftoegang heeft (als u besluit anonieme toegang te gebruiken, moet u de gebruiker Iedereen volledige r / w-rechten geven bij de NTFS niveau).

    Een NFS-share maken met Powershell

    Laten we een nieuwe NFS-share maken:

    Nieuw-NfsShare -Naam "NFS" -Pad "d: \ shares \ nfr" -AllowRootAccess $ true -Permissie Lezen schrijven -Authenticatie sys

    Laten we toegang tot de bal toestaan ​​voor het IP-adres 192.168.1.100 en de codering instellen op BIG5 (de mogelijkheid om de inhoud van NFS-ballen voor de ESXi-client te bekijken).

    Grant-NfsSharePermission -Naam "NFS" -ClientName 192.168.1.100 -ClientType host -LanguageEncoding BIG5

    De gemaakte NFS-ball kan bijvoorbeeld worden gebruikt als een NFS-datastore in een virtualisatie-omgeving, of om toegang te krijgen tot gegevens van andere Unix-achtige clients. Hoe u een NFS-share in Windows-clients kunt mounten, wordt beschreven in het artikel.