Die Einrichtung eines NFS-Servers unter Linux ist einer der schnellsten Wege, Dateien zwischen Rechnern im gleichen Netzwerk zu teilen, ohne umfangreiche Softwarestacks installieren zu müssen. NFS (Network File System) ermöglicht es, ein entferntes Verzeichnis wie eine lokale Festplatte einzubinden — ideal für gemeinsame Home-Verzeichnisse, Lab-Cluster, Build-Caches und Medienbibliotheken. In diesem Leitfaden richten Sie einen vollständigen NFS-Server und -Client von Grund auf ein, verstehen die wichtigsten /etc/exports-Optionen, wählen zwischen NFSv3 und NFSv4, optimieren Lese-/Schreibpuffergrößen für maximale Leistung und richten zuverlässige dauerhafte Einbindungen mit /etc/fstab ein.

Voraussetzungen

  • Zwei Linux-Rechner im gleichen Netzwerk — einer als Server, einer als Client. Beide Rollen können auch auf virtuellen Maschinen betrieben werden.
  • Root- oder sudo-Zugriff auf beiden Rechnern.
  • Firewall-Zugang zu Port 2049/TCP (sowie zusätzliche Ports für NFSv3, falls verwendet).
  • Debian/Ubuntu oder RHEL/Fedora/Rocky — Befehle für beide Distributionsfamilien werden durchgehend gezeigt.
  • Grundkenntnisse in IP-Adressierung und Linux-Dateiberechtigungen.

NFS-Server installieren

Installieren Sie auf dem Server-Knoten das NFS-Kernel-Server-Paket:

# Debian / Ubuntu
sudo apt update && sudo apt install -y nfs-kernel-server

# RHEL / Fedora / Rocky / AlmaLinux
sudo dnf install -y nfs-utils

Aktivieren und starten Sie den Dienst, damit er Neustarts übersteht:

sudo systemctl enable --now nfs-server
sudo systemctl status nfs-server

Überprüfen Sie, ob der NFS-Server auf Port 2049 lauscht:

ss -tlnp | grep 2049

Sie sollten einen Eintrag für nfsd sehen, der an 0.0.0.0:2049 gebunden ist.

/etc/exports konfigurieren

Die Datei /etc/exports ist das Herzstück der NFS-Server-Konfiguration. Jede Zeile definiert einen exportierten Pfad und welche Clients darauf zugreifen dürfen, zusammen mit den Einbindungsoptionen.

Grundlegende Syntax:

/pfad/zum/export  client_angabe(optionen)

Ein minimales funktionsfähiges Beispiel, das /srv/nfs an ein gesamtes Subnetz exportiert:

/srv/nfs  192.168.1.0/24(rw,sync,no_subtree_check)

Erstellen Sie das gemeinsame Verzeichnis und setzen Sie die Berechtigungen vor dem Export:

sudo mkdir -p /srv/nfs
sudo chown nobody:nogroup /srv/nfs   # typische anonyme NFS-Zuordnung
sudo chmod 755 /srv/nfs

Häufige /etc/exports-Optionen erklärt:

OptionBedeutung
rwLese- und Schreibzugriff erlauben
roNur Lesezugriff erlauben
syncDaten vor Bestätigung auf Datenträger schreiben; sicherer, aber langsamer
asyncSchreibvorgänge bestätigen, bevor sie auf Datenträger übertragen werden; schneller, aber riskant bei Absturz
no_subtree_checkUnterverzeichnis-Prüfung deaktivieren; reduziert fehlerhafte Meldungen bei Dateiumsiedlungen
subtree_checkUnterverzeichnis-Prüfung aktivieren; erforderlich für Sicherheit beim Export eines Unterverzeichnisses
root_squashRoot auf dem Client auf den Benutzer nobody abbilden (Standard, empfohlen)
no_root_squashRoot auf dem Client als Root agieren lassen; nur in vollständig vertrauenswürdigen Umgebungen verwenden
all_squashAlle Clients auf den anonymen Benutzer abbilden
anonuid=1000UID für anonyme Zuordnungen festlegen
fsid=0Diesen Export als NFSv4-Pseudo-Root markieren

Eine produktionsreife exports-Datei mit mehreren Freigaben:

# Lese-Schreib-Freigabe für das Entwicklerteam-Subnetz
/srv/nfs/projects  192.168.10.0/24(rw,sync,no_subtree_check,root_squash)

# Schreibgeschütztes ISO-Repository für alle internen Clients
/srv/nfs/isos  192.168.0.0/16(ro,sync,no_subtree_check)

# Gemeinsame Home-Verzeichnisse — nur bestimmte Hosts
/home  192.168.10.5(rw,sync,no_subtree_check) 192.168.10.6(rw,sync,no_subtree_check)

Nach der Bearbeitung von /etc/exports wenden Sie die Änderungen ohne Neustart des Servers an:

sudo exportfs -ra    # alle Exporte neu laden
sudo exportfs -v     # aktive Exporte mit Optionen auflisten

Vergleich: NFSv3 vs. NFSv4

Die Wahl der richtigen NFS-Version ist entscheidend für Sicherheit, Firewall-Konfiguration und Funktionsunterstützung. Moderne Installationen sollten standardmäßig NFSv4 verwenden, außer Legacy-Systeme erfordern NFSv3.

MerkmalNFSv3NFSv4
ProtokollzustandStatuslosStatusbehaftet
Verwendete Ports2049 + dynamisch (111, mountd, statd, lockd)Nur 2049
Firewall-RegelnKomplex — mehrere dynamische PortsEinfach — einzelner Port
SicherheitAUTH_SYS (nur UID/GID)AUTH_SYS + Kerberos (RPCSEC_GSS)
DateisperrungNLM (separater Daemon)Eingebaut, obligatorisch
ACL-UnterstützungNur HerstellererweiterungenPOSIX-ACLs nativ
UTF-8-DateinamenOptionalErforderlich
DelegationNeinJa — clientseitiges Caching
Pseudo-RootNeinJa — einheitlicher Namespace
Empfohlen fürLegacy-Systeme, einfache SetupsModerne Linux-Cluster, firewall-übergreifend

Um eine bestimmte NFS-Version auf dem Client zu erzwingen:

# Explizit mit NFSv4 einbinden
sudo mount -t nfs4 server:/srv/nfs /mnt/nfs

# Mit NFSv3 einbinden (bei Legacy-Server erforderlich)
sudo mount -t nfs -o vers=3 server:/srv/nfs /mnt/nfs

NFS-Client installieren und Freigaben einbinden

Installieren Sie auf dem Client-Knoten die NFS-Client-Dienstprogramme:

# Debian / Ubuntu
sudo apt install -y nfs-common

# RHEL / Fedora / Rocky
sudo dnf install -y nfs-utils

Erstellen Sie einen lokalen Einhängepunkt und binden Sie den Export ein:

sudo mkdir -p /mnt/nfs
sudo mount -t nfs4 192.168.1.100:/srv/nfs /mnt/nfs

Bestätigen Sie, dass die Einbindung aktiv ist, und prüfen Sie den verfügbaren Speicherplatz:

df -hT /mnt/nfs
mount | grep nfs

Testen Sie den Schreibzugriff vom Client:

touch /mnt/nfs/testfile && echo "Schreibzugriff bestätigt"

NFS-Einbindungen dauerhaft mit /etc/fstab einrichten

Eine manuelle Einbindung verschwindet nach einem Neustart. Fügen Sie die Freigabe in /etc/fstab ein, um sie dauerhaft zu machen:

# Format: <server>:<export>  <einhängepunkt>  <typ>  <optionen>  <dump>  <pass>
192.168.1.100:/srv/nfs  /mnt/nfs  nfs4  defaults,_netdev  0  0

Wichtige fstab-Optionen für NFS:

OptionZweck
_netdevVerzögert die Einbindung bis das Netzwerk verfügbar ist — unverzichtbar für NFS beim Start
nofailBoot wird fortgesetzt, auch wenn der NFS-Server nicht erreichbar ist
softGibt einen Fehler zurück, wenn der Server nicht antwortet (statt zu hängen)
hardWiederholt unbegrenzt, bis der Server antwortet (Standard, sicherer für Daten)
timeo=30Timeout in Zehntelsekunden vor dem nächsten Versuch
retrans=3Anzahl der Neuübertragungen vor dem Aufgeben (mit soft)

Ein robuster fstab-Eintrag für die Produktion:

192.168.1.100:/srv/nfs  /mnt/nfs  nfs4  defaults,_netdev,nofail,hard,timeo=30  0  0

Testen Sie nach der Bearbeitung von fstab ohne Neustart:

sudo mount -a
df -hT /mnt/nfs

Leistungsoptimierung: rsize und wsize

Standardmäßig verwendet NFS konservative Puffergrößen (oft 1 MB auf modernen Kerneln, ältere Systeme können jedoch auf 32 KB oder 64 KB voreingestellt sein). In einem Gigabit- oder schnelleren LAN verbessert das Erhöhen von rsize (Lesepuffer) und wsize (Schreibpuffer) auf 1 MB den Durchsatz erheblich.

Einbinden mit optimierten Puffern:

sudo mount -t nfs4 -o rsize=1048576,wsize=1048576 192.168.1.100:/srv/nfs /mnt/nfs

Durchsatz vor und nach der Optimierung messen:

# Schreibtest (Client zu Server)
dd if=/dev/zero of=/mnt/nfs/testfile bs=1M count=512 conv=fdatasync

# Lesetest (Server zu Client)
dd if=/mnt/nfs/testfile of=/dev/null bs=1M

Weitere Leistungsoptionen:

OptionWirkung
async (serverseitig)Erhöht die Schreibgeschwindigkeit auf Kosten der Datensicherheit bei Absturz
noatimeDeaktiviert die Aktualisierung der Zugriffszeit; reduziert Schreibverkehr bei leselastigen Workloads
actimeo=60Speichert Dateiattribute 60 Sekunden lang; reduziert Metadaten-RPCs
nconnect=4Verwendet mehrere TCP-Verbindungen zum Server (Linux 5.3+, NFSv4.1+)

Für NVMe-gestützte Server in einem 10-GbE-Netzwerk kombinieren Sie rsize=1048576,wsize=1048576,nconnect=4,noatime für maximalen Durchsatz.

Optimierungsoptionen in fstab eintragen:

192.168.1.100:/srv/nfs  /mnt/nfs  nfs4  defaults,_netdev,nofail,rsize=1048576,wsize=1048576,noatime  0  0

Praxisszenario: Gemeinsames /home in einem Lab-Cluster

Sie haben einen vierköpfigen Linux-Lab-Cluster — einen Management-Knoten (lab-mgmt) und drei Worker-Knoten (lab-worker-1, lab-worker-2, lab-worker-3). Alle Knoten teilen dieselben Benutzerkonten, und Benutzer sollen ihre Home-Verzeichnisse unabhängig vom eingeloggten Knoten sehen. NFS macht dies nahtlos möglich.

Auf lab-mgmt (NFS-Server):

# Server installieren
sudo apt install -y nfs-kernel-server

# Die Home-Verzeichnisse existieren bereits unter /home
# /home an alle Worker-Knoten exportieren
sudo bash -c 'cat >> /etc/exports <<EOF

/home  192.168.10.11(rw,sync,no_subtree_check) 192.168.10.12(rw,sync,no_subtree_check) 192.168.10.13(rw,sync,no_subtree_check)
EOF'

sudo exportfs -ra
sudo exportfs -v

Auf jedem Worker-Knoten (lab-worker-1/2/3):

# Client installieren
sudo apt install -y nfs-common

# Einhängepunkt erstellen (lokales /home bei Bedarf sichern)
sudo mount -t nfs4 192.168.10.10:/home /home

# Testen: Als regulärer Benutzer einloggen und Dateien prüfen
ls /home/jcarlos

Dauerhaft mit fstab auf jedem Worker eintragen:

192.168.10.10:/home  /home  nfs4  defaults,_netdev,hard,timeo=30,rsize=1048576,wsize=1048576  0  0

Wenn sich ein Benutzer auf einem beliebigen Worker-Knoten einloggt, ist sein Home-Verzeichnis — einschließlich Shell-Verlauf, SSH-Schlüssel und Konfigurationsdateien — auf allen Knoten identisch. Kombinieren Sie dies mit einem gemeinsamen /etc/passwd oder LDAP für vollständig konsistente Benutzerkonten.

Fallstricke und Sonderfälle

  • UID/GID-Diskrepanz: NFS basiert auf numerischen UIDs und GIDs, nicht auf Benutzernamen. Hat ein Benutzer auf dem Server UID 1001, aber auf dem Client UID 1002, sehen sie gegenseitig Dateien unter falschem Eigentümer. Synchronisieren Sie UIDs/GIDs über alle Knoten hinweg mit LDAP oder einem gemeinsamen /etc/passwd, oder verwenden Sie NFSv4 mit idmapd.
  • root_squash und privilegierte Operationen: Mit aktiviertem root_squash (Standard) wird der root-Benutzer auf einem Client auf nobody abgebildet. Das unterbricht Operationen wie chown und einige Backups. Verwenden Sie no_root_squash nur in vollständig vertrauenswürdigen internen Netzwerken.
  • Firewall-Regeln für NFSv3: NFSv3 verwendet dynamische RPC-Ports für mountd, statd und lockd. Fixieren Sie diese auf statische Ports in /etc/sysconfig/nfs und öffnen Sie sie in Ihrer Firewall, oder wechseln Sie zu NFSv4, das nur Port 2049 benötigt.
  • async vs. sync: Die async-Option verbessert die Schreibleistung, aber noch nicht auf Datenträger gespeicherte Daten können bei einem Server-Absturz verloren gehen. Verwenden Sie immer sync für gemeinsame Datenbanken, Build-Artefakte oder alles, wo Datenintegrität wichtig ist.
  • Veraltete NFS-Handles: Wenn der Server neu startet oder Exporte sich ändern, während Clients eingebunden sind, können Prozesse Fehler wie “Stale file handle” erhalten. Lösen Sie die Einbindung und binden Sie die Freigabe erneut ein, um den veralteten Zustand zu bereinigen.
  • Automatisches Einbinden mit autofs: Ziehen Sie für große Umgebungen autofs anstelle von statischen fstab-Einträgen in Betracht. Autofs bindet Freigaben bei Bedarf ein und löst sie bei Inaktivität, was die Startzeit verkürzt und Fehler vermeidet, wenn NFS-Server vorübergehend nicht verfügbar sind.

Fehlerbehebung

Einbindung hängt dauerhaft: Der Client kann den Server nicht erreichen. Prüfen Sie die Konnektivität mit ping, vergewissern Sie sich, dass der NFS-Dienst auf dem Server läuft (systemctl status nfs-server), und bestätigen Sie, dass Port 2049 offen ist (nc -zv server 2049).

Zugriff verweigert beim Einbinden: Die IP-Adresse des Clients ist nicht in /etc/exports eingetragen. Überprüfen Sie mit exportfs -v und fügen Sie den korrekten Client-CIDR oder Hostnamen hinzu, dann führen Sie exportfs -ra aus.

Dateien gehören nobody auf dem Client: UID/GID-Diskrepanz. Gleichen Sie UIDs über alle Systeme an oder konfigurieren Sie idmapd für die NFSv4-Identitätszuordnung. Prüfen Sie /var/log/syslog auf dem Server auf idmapd-Fehler.

Langsame NFS-Leistung: Überprüfen Sie rsize- und wsize-Werte mit mount | grep nfs. Erhöhen Sie auf 1048576. Vergewissern Sie sich außerdem, dass der serverseitige Export async verwendet, wenn Schreibgeschwindigkeit wichtiger ist als Ausfallsicherheit.

“exportfs: /etc/exports: No such file or directory”: Erstellen Sie die Datei: sudo touch /etc/exports, fügen Sie dann Ihre Exportzeilen hinzu und führen Sie exportfs -ra aus.

Zusammenfassung

  • NFS teilt Verzeichnisse von einem Server an mehrere Clients über ein leichtgewichtiges, kernel-natives Protokoll.
  • Installieren Sie nfs-kernel-server auf dem Server und nfs-common auf Clients (Debian/Ubuntu), oder nfs-utils auf beiden für RHEL-Systeme.
  • Konfigurieren Sie Exporte in /etc/exports im Format /pfad client(optionen) und laden Sie mit exportfs -ra neu.
  • Bevorzugen Sie NFSv4 für moderne Installationen: Einzelner Port (2049), statusbehaftete Verbindungen, eingebautes Locking und bessere Firewall-Kompatibilität.
  • Verwenden Sie _netdev in /etc/fstab, um sicherzustellen, dass NFS-Einbindungen beim Start auf das Netzwerk warten, und testen Sie mit mount -a.
  • Optimieren Sie rsize=1048576,wsize=1048576 auf dem Client für Hochdurchsatz-LAN-Übertragungen; fügen Sie nconnect=4 unter Linux 5.3+ für Mehrfachverbindungs-NFSv4.1 hinzu.
  • Synchronisieren Sie UIDs/GIDs über alle Knoten, um Berechtigungskonflikte zu vermeiden — das häufigste NFS-Problem.

Verwandte Artikel