Wanneer je met meerdere VPS'en werkt, kan het wenselijk zijn om bestanden op de ene VPS ook beschikbaar te maken op de andere. Een manier om dit te bereiken is door een Network File System (NFS) te gebruiken.
Met een NFS-server exporteer je lokale bestandssystemen over het netwerk en deel je ze met NFS-clients. Je kunt hiermee dus bestanden en mappen op jouw VPS of Big Storage met andere VPS'en delen. Dit doe je door directories die je op een NFS-server deelt te mounten (koppelen) op een NFS-client.
In deze handleiding laten we zien hoe je een NFS-server en NFS-client installeert op een server met CentOS, AlmaLinux, Rocky Linux, Ubuntu of Debian. De combinatie van besturingssystemen maakt in principe niet uit.
- Voor de stappen in deze handleiding heb je nodig:
- Twee of meer VPS'en met CentOS, AlmaLinux, Rocky Linux, Ubuntu of Debian.
- Een private network waarop de VPS'en zijn opgenomen. In onze handleiding 'een intern IP-adres instellen'-laten we zien hoe je je VPS'en een IP-adres op je private netwerk geeft.
- Voer de stappen in dit artikel uit als root, of als gebruiker met root-rechten.
- In uitvoerige tests hebben we gezien dat de performance in Debian 11 in de loop van tijd vertraagd. AlmaLinux performed bijvoorbeeld een stuk sneller bij het gebruik van NFS. Dit zit vermoedelijk in de kernel en voor projecten waar performance een must is, raden we daarom AlmaLinux aan.
Een NFS-server installeren
Stap 1
Installeer afhankelijk van je besturingssysteem een NFS-server met het commando:
CentOS 7:
yum -y install nfs-utils nfs-utils-lib
CentOS Stream / AlmaLinux / Rocky Linux:
dnf -y install nfs-utils
Ubuntu / Debian:
apt -y install nfs-kernel-server
Stap 2
Schakel na de installatie de NFS-server in:
CentOS / AlmaLinux / Rocky Linux:
systemctl start nfs-server
systemctl enable nfs-server
Ubuntu / Debian:
systemctl start nfs-kernel-server
systemctl enable nfs-kernel-server
Stap 3
Maak een directory aan die je wil delen met de NFS-clients. Je bent vrij de naam en lokatie in het voorbeeld aan te passen, maar vergeet niet dat ook bij alle volgende stappen te doen:
mkdir /mnt/nfs_share
Optioneel:
De ins en outs van eigendom van mappen en bestanden vallen buiten de scope van deze handleiding, maar is wel belangrijk om bij stil te staan. Om er bijvoorbeeld voor te zorgen dat alle clients straks bij de gedeelde map kunnen, kun je alle permissie restricties verwijderen:
CentOS / AlmaLinux / Rocky Linux:
chown -R nobody:nobody /mnt/nfs_share/
Ubuntu/Debian:
chown -R nobody:nogroup /mnt/nfs_share/
Pas desgewenst ook de bestandspermissies aan op de aangemaakte map. Dit is vooral belangrijk wanneer je de optie root_squash gebruikt in stap 3.
chmod 777 /mnt/nfs_share/
De optie 777 geeft alle gebruikers en groepen rechten om bestanden te schrijven, lezen en uitvoeren. Op deze pagina vind je een cheat sheet voor beschikbare chmod opties.
Stap 3
Maak nu het bestand /etc/exports aan. Hierin wordt de toestemming en configuratie geregeld voor toegang tot de NFS server.
nano /etc/exports
De inhoud van het bestand hangt af van je use case (zie de toelichting onder de code). Een simpel voorbeeld kan zijn:
/mnt/nfs_share 192.168.2.0/24 (rw,async,root_squash)
Je geeft dus eerst de directory op die je wil delen, vervolgens het IP-adres of range die je toegang wil verlenen tot de NFS-share (de IP-adressen van je private network) en daarna aanvullende opties. Je voegt de opties tussen de haakjes komma gescheiden zonder spaties toe en kunt kiezen uit:
- ro: read only rechten tot de NFS share
- rw: read write rechten tot de NFS share
- sync: schrijfacties worden één voor één voltooid en bevestigd (zowel IO acties als write acties worden voltooid) voor een nieuwe schrijfactie van een NFS-client wordt geaccepteerd. Dit zorgt voor tragere performance, maar wanneer de NFS-server of netwerkverbinding onderling uitvalt is er geen dataverlies.
- async: Zodra IO requests verwerkt zijn en naar het lole bestandssysteem worden verstuurd kan een volgende actie worden uitgevoerd; er wordt niet gewacht tot data daadwerkelijk op de schijf staat voor gereageerd wordt op een nieuwe actie van een NFS client. Als de server of netwerkverbinding wegvalt tijdens schrijfacties kan er dataloss optreden. De performance van async is wel aanzienlijk sneller dan van sync.
- no_subtree_check: Voorkomt substree controles (de standaard actie). Als een gedeelde map een onderliggende map is van een groter geheel scant nfs de directories daarboven om permissies e.d. te controleren. Het gebruik van no_subtree_check kan een zekere performancewinst geven.
- root_squash: root-gebruikers op de NFS-client worden door de NFS-server behandelt als anonieme gebruikers zonder root-rechten
- no_root_squash: root-gebruikers op de NFS-client blijven root-gebruikers op de NFS-share.
- no_all_squash: alle gebruikers op de NFS-client worden indien aanwezig behandelt als dezelfde gebruikers op de NFS-server
- all_squash: alle gebruikers op de NFS-client worden behandelt als anonieme gebruikers door de NFS-server.
Voor iedere nieuwe directory voeg je een nieuwe regel toe aan het bestand. Sla daarna je wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Let op: na iedere aanpassing van deze opties, is het belangrijk je nfs-server te herstarten en het commando exportfs uit de stap hieronder opnieuw uit te voeren.
Stap 4
Vervolgens exporteer je het bestandssysteem zoals je die in stap 3 hebt ingesteld met het commando exportfs:
exportfs -arv
- -a exporteert alle directories.
- -r herexporteert alle directories en synchroniseert /var/lib/nfs/etab met /etc/exports en bestanden onder /etc/exports.d
- -v schakelt verbose output in.
Stap 5
Geef tot slot in je firewall toegang tot de nfs share:
CentOS / AlmaLinux / Rocky Linux:
firewall-cmd --permanent
--add-service=nfs
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-service=mountd
firewall-cmd --reload
In principe heb je al in /etc/exports aangegeven dat alleen IP-adressen op je private network toegang hebben. Je kunt eventueel dit ook nog aan de bovenstaande regels toevoegen door tussen --permanent en --add-service=nfs de volgende opties toe te voegen:
--add-rich-rule="rule family='ipv4' source address='192.168.2.0/24'
Ubuntu / Debian:
ufw allow from 192.168.2.0/24 to any port nfs
De NFS-client configureren
Stap 1
Installeer de benodigde packages op de servers die je gebruikt als NFS-clients:
CentOS / AlmaLinux / Rocky Linux:
dnf -y install nfs-utils nfs4-acl-tools
Ubuntu / Debian:
apt -y install nfs-common nfs4-acl-tools
Stap 2
Maak nu een directory aan waarop je de NFS-share wil mounten, bijvoorbeeld:
mkdir /mnt/nfs
Stap 3
Mount vervolgens de NFS-share op je NFS-clients:
mount 192.168.2.1:/mnt/nfs_share /mnt/nfs
- Vervang het adres 192.168.2.1 door het interne IP-adres van de NFS-server
- Vervang /mnt/nfs_share door de directory die je op de server gedeeld hebt (stap 3 van de eerste paragraaf)
- Vervang /mnt/nfs door de in de vorige stap aangemaakte directory
Stap 4 - optioneel
Het commando in stap 3 gaat om een tijdelijke mount die na een reboot verloren gaat. Om automatisch de NFS-share te mounten na een reboot van de client, open je het bestand /etc/fstab:
nano /etc/fstab
Voeg daar de volgende inhoud aan toe:
192.168.2.1:/mnt/nfs_share /mnt/nfs nfs defaults 0 0
Sla de wijzigingen op en sluit het bestand met ctrl + x > y > enter.
De mount verwijderen
De gemounte NFS-share ontkoppel je eenvoudig op je NFS-client met het commando:
umount /mnt/nfs
Krijg je een foutmelding dat de share nog bezig is, terwijl je zeker weet dat er geen bestanden geschreven worden? Dan kun je het umount commando forceren met:
umount -l /mnt/nfs
Performance tuning
Binnen dezelfde availability zone is de performance van een NFS-server erg vlot. Mocht je veel kleine bestanden wegschrijven naar een andere availability zone (bijv. van Delft naar Amsterdam), dan zal er ongeveer een factor 5 verschil zitten in de snelheid.
In alle scenario's zijn er enkele opties die je kunt overwegen om meer performance uit je NFS-server te knijpen. We zetten de belangrijkste op een rijtje:
-
sync vs async: Of async (stap 3 van de NFS-server installatie) een optie is voor jouw setup hangt af van je risicobereidheid. In principe is er alleen sprake van een risico in het geval van als je NFS-server tijdens een schrijf-(niet lees-)actie onbereikbaar wordt. Als je een lokale back-up van je bestanden hebt, of een verloren bestand snel kunt reproduceren, kun je veilig async gebruiken. Gemiddeld is de performance van async ongeveer twee keer zo snel als sync.
-
RPCNFSDCOUNT: NFS-servers gebruiken standaard 8 processen/threads om verbindingen van NFS-clients te verwerken. Bij grotere aantallen NFS-clients kan het verhogen van het aantal processen/threads een impact maken op de performance. Een goede standaard waarde is om dit op te hogen naar 16 per core van je VPS. Afhankelijk van je OS pas je dit als volgt aan:
CentOS / AlmaLinux Rocky Linux:
Open de NFS-configuratie:Scroll naar onderen naar [nfsd] en pas de waarde #threads aan naar 16 per core, bijvoorbeeld:nano /etc/nfs.conf
Sla de wijzigingen op en sluit het bestand (ctrl + x > y > enter). Herstart hierna je NFS-server (het kan geen kwaad hierna ook de NFS-clients te ontkoppelen en opnieuw te koppelen):[nfsd] threads = 32
systemctl restart nfs-server
Ubuntu / Debian:
Open de NFS-configuratie:Pas de waarde van RPCNFSDCOUNT aan naar 16 per core, bijvoorbeeld:nano /etc/sysconfig/nfs
Sla de wijzigingen op en sluit het bestand (ctrl + x > y > enter). Herstart hierna je NFS-server (het kan geen kwaad hierna ook de NFS-clients te onkoppelen en opnieuw te koppelen):RPCNFSDCOUNT
=32systemctl restart nfs-server
-
MTU: MTU is een optie van de netwerkadapter die bepaalt hoe groot pakketjes data zijn die verstuurt worden in bits. Standaard staat de MTU op 1500. Als je veel bestanden schrijft van tussen de 1000 en 6000 bytes, dan kan het wenselijk zijn een hogere MTU in te stellen. In overige gevallen zal de MTU aanpassen weinig impact hebben.
De MTU moet in ieder geval op alle NFS-clients en de NFS-server in dat geval identiek instellen. Een goede optie is bijvoorbeeld een waarde van 8000. We raden aan eerst alle NFS-shares te ontkoppelen (umount /dir) op de NFS-clients. Je stelt de MTU bijvoorbeeld in als volgt:Let wel dat je eth1 aanpast naar de naam van je private netwerkadapter. Het commando hierboven blijft ook niet behouden na een reboot, maar je kunt bijvoorbeeld de configuratie van je private network adapter zelf aanpassen om die wel te behouden.ip link set dev eth1 mtu 8000
Er zijn nog meer opties beschikbaar zoals het aanpassen van de wtime en rtime waardes, maar in onze eigen tests konden we hier geen duidelijk merkbaar verschil mee vaststellen.
Daarmee zijn we aan het eind gekomen van deze handleiding over het configureren en gebruiken van een NFS-server.
Mocht je aan de hand van dit artikel nog vragen hebben, aarzel dan niet om onze supportafdeling te benaderen. Je kunt hen bereiken via de knop 'Neem contact op' onderaan deze pagina.