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:
| Option | Bedeutung |
|---|---|
rw | Lese- und Schreibzugriff erlauben |
ro | Nur Lesezugriff erlauben |
sync | Daten vor Bestätigung auf Datenträger schreiben; sicherer, aber langsamer |
async | Schreibvorgänge bestätigen, bevor sie auf Datenträger übertragen werden; schneller, aber riskant bei Absturz |
no_subtree_check | Unterverzeichnis-Prüfung deaktivieren; reduziert fehlerhafte Meldungen bei Dateiumsiedlungen |
subtree_check | Unterverzeichnis-Prüfung aktivieren; erforderlich für Sicherheit beim Export eines Unterverzeichnisses |
root_squash | Root auf dem Client auf den Benutzer nobody abbilden (Standard, empfohlen) |
no_root_squash | Root auf dem Client als Root agieren lassen; nur in vollständig vertrauenswürdigen Umgebungen verwenden |
all_squash | Alle Clients auf den anonymen Benutzer abbilden |
anonuid=1000 | UID für anonyme Zuordnungen festlegen |
fsid=0 | Diesen 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.
| Merkmal | NFSv3 | NFSv4 |
|---|---|---|
| Protokollzustand | Statuslos | Statusbehaftet |
| Verwendete Ports | 2049 + dynamisch (111, mountd, statd, lockd) | Nur 2049 |
| Firewall-Regeln | Komplex — mehrere dynamische Ports | Einfach — einzelner Port |
| Sicherheit | AUTH_SYS (nur UID/GID) | AUTH_SYS + Kerberos (RPCSEC_GSS) |
| Dateisperrung | NLM (separater Daemon) | Eingebaut, obligatorisch |
| ACL-Unterstützung | Nur Herstellererweiterungen | POSIX-ACLs nativ |
| UTF-8-Dateinamen | Optional | Erforderlich |
| Delegation | Nein | Ja — clientseitiges Caching |
| Pseudo-Root | Nein | Ja — einheitlicher Namespace |
| Empfohlen für | Legacy-Systeme, einfache Setups | Moderne 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:
| Option | Zweck |
|---|---|
_netdev | Verzögert die Einbindung bis das Netzwerk verfügbar ist — unverzichtbar für NFS beim Start |
nofail | Boot wird fortgesetzt, auch wenn der NFS-Server nicht erreichbar ist |
soft | Gibt einen Fehler zurück, wenn der Server nicht antwortet (statt zu hängen) |
hard | Wiederholt unbegrenzt, bis der Server antwortet (Standard, sicherer für Daten) |
timeo=30 | Timeout in Zehntelsekunden vor dem nächsten Versuch |
retrans=3 | Anzahl 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:
| Option | Wirkung |
|---|---|
async (serverseitig) | Erhöht die Schreibgeschwindigkeit auf Kosten der Datensicherheit bei Absturz |
noatime | Deaktiviert die Aktualisierung der Zugriffszeit; reduziert Schreibverkehr bei leselastigen Workloads |
actimeo=60 | Speichert Dateiattribute 60 Sekunden lang; reduziert Metadaten-RPCs |
nconnect=4 | Verwendet 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 mitidmapd. - root_squash und privilegierte Operationen: Mit aktiviertem
root_squash(Standard) wird derroot-Benutzer auf einem Client aufnobodyabgebildet. Das unterbricht Operationen wiechownund einige Backups. Verwenden Sieno_root_squashnur in vollständig vertrauenswürdigen internen Netzwerken. - Firewall-Regeln für NFSv3: NFSv3 verwendet dynamische RPC-Ports für
mountd,statdundlockd. Fixieren Sie diese auf statische Ports in/etc/sysconfig/nfsund öffnen Sie sie in Ihrer Firewall, oder wechseln Sie zu NFSv4, das nur Port 2049 benötigt. asyncvs.sync: Dieasync-Option verbessert die Schreibleistung, aber noch nicht auf Datenträger gespeicherte Daten können bei einem Server-Absturz verloren gehen. Verwenden Sie immersyncfü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
autofsanstelle 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-serverauf dem Server undnfs-commonauf Clients (Debian/Ubuntu), odernfs-utilsauf beiden für RHEL-Systeme. - Konfigurieren Sie Exporte in
/etc/exportsim Format/pfad client(optionen)und laden Sie mitexportfs -raneu. - Bevorzugen Sie NFSv4 für moderne Installationen: Einzelner Port (2049), statusbehaftete Verbindungen, eingebautes Locking und bessere Firewall-Kompatibilität.
- Verwenden Sie
_netdevin/etc/fstab, um sicherzustellen, dass NFS-Einbindungen beim Start auf das Netzwerk warten, und testen Sie mitmount -a. - Optimieren Sie
rsize=1048576,wsize=1048576auf dem Client für Hochdurchsatz-LAN-Übertragungen; fügen Sienconnect=4unter 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.