NFS-Exports sind das Fundament des Linux-Dateiaustauschs. Ob du einen neuen Fileserver aufsetzt, eine NAS-Appliance für die Migration konfigurierst oder Mount-Fehler debuggst — das Verständnis von /etc/exports ist essenziell. Dieser Guide behandelt Syntax, Sicherheitsoptionen, Performance-Tuning und plattformspezifische Anleitungen.
NFS (Network File System) ermöglicht es einem Server, Verzeichnisse über das Netzwerk freizugeben. Clients mounten diese freigegebenen Verzeichnisse, als wären sie lokale Dateisysteme.
Komponenten:
/etc/exportsmount -t nfs/etc/exports-SyntaxDie Export-Datei definiert, welche Verzeichnisse freigegeben werden und mit welchen Berechtigungen:
/path/to/export client(options)
# /data an einen einzelnen Host freigeben
/data 192.168.1.100(rw,sync,no_subtree_check)
# An ein ganzes Subnetz freigeben
/data 192.168.1.0/24(rw,sync,no_subtree_check)
# An mehrere Clients freigeben (verschiedene Optionen)
/data 192.168.1.0/24(rw,sync) 10.0.0.0/8(ro,sync)
# An jeden Client freigeben (mit Vorsicht verwenden)
/data *(ro,sync,no_subtree_check)
# An einen Hostnamen oder DNS-Muster freigeben
/data client.example.com(rw,sync)
/data *.example.com(ro,sync)
Achtung bei Leerzeichen
Es darf kein Leerzeichen zwischen der Client-Angabe und der öffnenden Klammer stehen. 192.168.1.0/24(rw) ist korrekt. 192.168.1.0/24 (rw) exportiert an alle mit rw und an das Subnetz mit Standard (ro) — ein häufiger und gefährlicher Fehler.
| Option | Beschreibung |
|---|---|
rw | Lese-/Schreibzugriff |
ro | Nur-Lese-Zugriff (Standard) |
sync | Erst antworten, wenn Änderungen auf Disk geschrieben sind (sicher, Standard) |
async | Vor dem Schreiben antworten (schneller, aber Datenverlustrisiko bei Crash) |
| Option | Beschreibung |
|---|---|
root_squash | Root (UID 0) auf nobody mappen (Standard, empfohlen) |
no_root_squash | Root-Zugriff als Root erlauben (gefährlich) |
all_squash | Alle Benutzer auf nobody mappen |
anonuid=N | UID für anonyme/gesquashte Benutzer setzen |
anongid=N | GID für anonyme/gesquashte Benutzer setzen |
Wann no_root_squash verwenden
Deaktiviere Root-Squashing nur, wenn der Client tatsächlich Root-Zugriff braucht — zum Beispiel ein Backup-Server, der Ownership über alle Dateien hinweg erhalten muss. Für Migrationstools wie syncopio stellt no_root_squash sicher, dass Berechtigungen beim Transfer korrekt erhalten bleiben.
| Option | Beschreibung |
|---|---|
subtree_check | Prüfen, ob Dateien im exportierten Subtree liegen (langsamer, sicherer) |
no_subtree_check | Subtree-Prüfung überspringen (schneller, für die meisten Fälle empfohlen) |
| Option | Beschreibung |
|---|---|
fsid=0 | Als NFSv4-Pseudo-Root-Dateisystem markieren |
crossmnt | Traversierung von Mount-Points innerhalb des Exports erlauben |
sec=krb5 | Kerberos-Authentifizierung erfordern |
sec=krb5i | Kerberos + Integritätsprüfung |
sec=krb5p | Kerberos + Privacy (Verschlüsselung) |
# NFS-Server installieren
sudo apt update
sudo apt install nfs-kernel-server
# Export-Verzeichnis erstellen
sudo mkdir -p /srv/data
sudo chown nobody:nogroup /srv/data
# Exports konfigurieren
echo '/srv/data 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)' | sudo tee -a /etc/exports
# Änderungen anwenden
sudo exportfs -ra
# Prüfen
sudo exportfs -v
# Starten und aktivieren
sudo systemctl enable --now nfs-kernel-server
# NFS-Server installieren
sudo dnf install nfs-utils
# Exports konfigurieren
sudo vi /etc/exports
# /srv/data 192.168.1.0/24(rw,sync,no_subtree_check)
# Anwenden und starten
sudo exportfs -ra
sudo systemctl enable --now nfs-server
# Firewall-Regeln
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --reload
192.168.1.0/24192.168.1.0/24192.168.1.0/24root (für Migration) oder nobodywheel oder nobody# NFS-Daemon-Threads erhöhen (Standard ist oft 8)
# Für ausgelastete Server 32-64 verwenden
echo 64 > /proc/fs/nfsd/threads
# Oder permanent in /etc/nfs.conf setzen
[nfsd]
threads = 64
# Aktuelle NFS-Statistiken überwachen
nfsstat -s
# High-Performance-Mount
mount -t nfs4 server:/export /mnt -o \
rsize=1048576,\ # 1 MB Lesegröße
wsize=1048576,\ # 1 MB Schreibgröße
nconnect=8,\ # 8 TCP-Verbindungen (Linux 5.3+)
hard,\ # Bei Fehler unbegrenzt wiederholen
intr,\ # Unterbrechung während Retry erlauben
noatime,\ # Access-Times nicht aktualisieren
nocto # Nicht bei Open aktualisieren (leseintensive Workloads)
| Option | Auswirkung | Wann verwenden |
|---|---|---|
nconnect=N | Größte Einzelverbesserung; N TCP-Verbindungen pro Mount | Immer (Linux 5.3+) |
rsize/wsize=1M | Größere I/O-Operationen = weniger Round-Trips | Workloads mit großen Dateien |
noatime | atime-Updates überspringen = weniger Schreibzugriffe | Leseintensive Workloads |
nocto | Revalidierung bei Open überspringen = schnellere Opens | Wenn sich Daten selten ändern |
nconnect ist ein Game-Changer
Eine einzelne NFS-TCP-Verbindung erreicht typischerweise maximal ~3-4 Gbps aufgrund von Head-of-Line-Blocking. Mit nconnect=8 kannst du eine 10-Gbps- oder sogar 25-Gbps-Leitung sättigen. Das ist die Mount-Option mit dem größten Einfluss auf den Durchsatz.
# Aktuelle Exports anzeigen
exportfs -v
# Anzeigen, was der Client als verfügbar sieht
showmount -e server
# Prüfen, ob RPC-Dienste laufen
rpcinfo -p server
# NFS-Mount testen
mount -t nfs4 -v server:/export /mnt
# NFS-Statistiken prüfen
nfsstat -c # Client-Statistiken
nfsstat -s # Server-Statistiken
# Mount-Probleme debuggen
mount -t nfs4 -v -o nfsvers=4 server:/export /mnt 2>&1
| Problem | Ursache | Lösung |
|---|---|---|
| ”mount.nfs: access denied” | Client-IP nicht in der Export-Liste | /etc/exports prüfen, exportfs -ra ausführen |
| ”mount.nfs: Connection timed out” | Firewall blockiert NFS-Ports | Ports 2049 (NFS), 111 (rpcbind) öffnen |
| ”Permission denied” bei Dateien | root_squash oder UID-Mismatch | no_root_squash verwenden oder UIDs mappen |
| Stale file handle | Export wurde geändert, während gemountet | Auf dem Client neu mounten: umount /mnt && mount ... |
| Sehr langsame Performance | Standard-Mount-Optionen | nconnect=8,rsize=1048576,wsize=1048576 hinzufügen |
| ”Program not registered” | NFS-Server läuft nicht | systemctl start nfs-server |
Damit NFS über Firewalls funktioniert:
| Dienst | Port | Protokoll |
|---|---|---|
| NFS | 2049 | TCP (v4), TCP/UDP (v3) |
| rpcbind | 111 | TCP/UDP |
| mountd | Dynamisch* | TCP/UDP |
| statd | Dynamisch* | TCP/UDP |
*Für NFSv3 mit Firewalls statische Ports in /etc/nfs.conf setzen:
[mountd]
port = 20048
[statd]
port = 32765
NFSv4 braucht nur Port 2049 — einer seiner Vorteile gegenüber v3.