NFS (Network File System) ermöglicht das Freigeben von Verzeichnissen über das Netzwerk. Clients können diese Verzeichnisse wie lokale Dateisysteme nutzen.

Warum NFS?

Vorteile

- Native Linux-Unterstützung
- Keine zusätzliche Software auf Clients
- Hohe Performance
- Transparente Dateizugriffe
- Unix-Berechtigungen

NFS-Versionen

| Version | Features | |---------|----------| | NFSv3 | Weit verbreitet, UDP/TCP | | NFSv4 | Firewall-freundlich, Kerberos | | NFSv4.1 | pNFS, Multi-Server | | NFSv4.2 | Server-side Copy, Sparse Files |

Server-Installation

Debian/Ubuntu

apt update
apt install nfs-kernel-server

CentOS/RHEL

dnf install nfs-utils

Service aktivieren

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

Freigaben konfigurieren

exports-Datei

# /etc/exports

# Einfache Freigabe
/srv/nfs/data    192.168.1.0/24(rw,sync,no_subtree_check)

# Mehrere Clients
/srv/nfs/public  192.168.1.0/24(ro) 10.0.0.0/8(ro)

# Einzelner Host
/home/shared     192.168.1.100(rw,sync,no_root_squash)

# Alle Hosts (unsicher!)
/srv/nfs/open    *(ro,sync)

Optionen erklärt

| Option | Beschreibung | |--------|--------------| | rw | Lesen und Schreiben | | ro | Nur Lesen | | sync | Synchrones Schreiben (sicher) | | async | Asynchron (schneller, riskanter) | | no_subtree_check | Keine Subtree-Prüfung (Performance) | | no_root_squash | Root-Zugriff behalten | | root_squash | Root → nobody (Standard) | | all_squash | Alle Benutzer → nobody |

Freigabe erstellen

# Verzeichnis erstellen
mkdir -p /srv/nfs/data
chown nobody:nogroup /srv/nfs/data
chmod 755 /srv/nfs/data

# Exports bearbeiten
nano /etc/exports

# Exports anwenden
exportfs -ra

# Aktive Exports anzeigen
exportfs -v

Client-Konfiguration

Client-Installation

# Debian/Ubuntu
apt install nfs-common

# CentOS/RHEL
dnf install nfs-utils

Manuelles Mounten

# Mount-Punkt erstellen
mkdir -p /mnt/nfs/data

# Mounten
mount -t nfs server:/srv/nfs/data /mnt/nfs/data

# Mit Optionen
mount -t nfs -o rw,soft,timeo=5 server:/srv/nfs/data /mnt/nfs/data

Verfügbarkeit prüfen

# Server-Exports abfragen
showmount -e server-ip

# Beispielausgabe
Export list for server-ip:
/srv/nfs/data 192.168.1.0/24

Automatisch beim Boot (fstab)

# /etc/fstab

server:/srv/nfs/data  /mnt/nfs/data  nfs  defaults,_netdev  0  0

# Mit Optionen
server:/srv/nfs/data  /mnt/nfs/data  nfs  rw,soft,timeo=5,_netdev  0  0

Autofs (Auto-Mount)

# Installation
apt install autofs

# /etc/auto.master
/mnt/nfs  /etc/auto.nfs  --timeout=60

# /etc/auto.nfs
data  -fstype=nfs,rw  server:/srv/nfs/data

# Service neu starten
systemctl restart autofs

# Zugriff triggert Mount
ls /mnt/nfs/data

NFSv4-Konfiguration

Server-Konfiguration

# /etc/exports (NFSv4)

# Root-Export (Pseudo-Filesystem)
/srv/nfs  192.168.1.0/24(rw,sync,fsid=0,crossmnt,no_subtree_check)

# Unterverzeichnisse
/srv/nfs/data    192.168.1.0/24(rw,sync,no_subtree_check)
/srv/nfs/backup  192.168.1.0/24(rw,sync,no_subtree_check)

Domain-Mapping

# /etc/idmapd.conf

[General]
Domain = example.local

Client mounten (NFSv4)

# NFSv4 explizit
mount -t nfs4 server:/ /mnt/nfs

# Unterverzeichnis
mount -t nfs4 server:/data /mnt/nfs/data

# In fstab
server:/  /mnt/nfs  nfs4  defaults,_netdev  0  0

Firewall-Konfiguration

NFSv4 (einfach)

# Nur Port 2049
ufw allow from 192.168.1.0/24 to any port 2049

NFSv3 (mehrere Ports)

# Ports fixieren
# /etc/default/nfs-kernel-server (Debian)

RPCMOUNTDOPTS="--manage-gids -p 32767"
RPCNFSDOPTS="-p 2049"
STATDOPTS="--port 32765 --outgoing-port 32766"
# /etc/modprobe.d/lockd.conf
options lockd nlm_udpport=32768 nlm_tcpport=32768
# Firewall-Regeln
ufw allow from 192.168.1.0/24 to any port 111
ufw allow from 192.168.1.0/24 to any port 2049
ufw allow from 192.168.1.0/24 to any port 32765:32768

Performance-Optimierung

Mount-Optionen

# Optimierte Mount-Optionen
mount -t nfs -o rw,hard,intr,rsize=131072,wsize=131072,noatime server:/data /mnt/data

# fstab
server:/data  /mnt/data  nfs  rw,hard,intr,rsize=131072,wsize=131072,noatime,_netdev  0  0

Optionen erklärt

| Option | Beschreibung | |--------|--------------| | rsize=131072 | Read-Block-Größe (128KB) | | wsize=131072 | Write-Block-Größe (128KB) | | hard | Bei Fehlern warten | | soft | Bei Fehlern Fehler zurückgeben | | intr | Unterbrechbar | | noatime | Keine Zugriffszeiten aktualisieren | | async | Asynchrones Schreiben | | nconnect=4 | Mehrere TCP-Verbindungen (NFSv4.1+) |

Server-Optimierung

# Mehr NFS-Threads
# /etc/default/nfs-kernel-server

RPCNFSDCOUNT=16  # Standard: 8
systemctl restart nfs-kernel-server

Berechtigungen

UID/GID-Mapping

NFS nutzt numerische UIDs/GIDs.
Benutzer 1000 auf Client = Benutzer 1000 auf Server

Lösung: UID/GID auf allen Systemen synchron halten
Oder: NFSv4 mit idmapd

Root-Squash

# Standard: Root wird zu nobody
/srv/nfs/data  192.168.1.0/24(rw,root_squash)

# Root-Zugriff behalten (nur vertrauenswürdige Clients!)
/srv/nfs/data  192.168.1.100(rw,no_root_squash)

All-Squash

# Alle Benutzer zu einem User mappen
/srv/nfs/data  192.168.1.0/24(rw,all_squash,anonuid=1000,anongid=1000)

Kerberos-Authentifizierung

Server-Konfiguration

apt install nfs-common krb5-user

# /etc/exports
/srv/nfs/secure  192.168.1.0/24(rw,sync,sec=krb5p)

Security-Stufen

| Stufe | Beschreibung | |-------|--------------| | sys | Standard (UID-basiert) | | krb5 | Kerberos-Authentifizierung | | krb5i | + Integritätsprüfung | | krb5p | + Verschlüsselung |

Client mit Kerberos

mount -t nfs -o sec=krb5p server:/secure /mnt/secure

Monitoring

Aktive Mounts

# Auf Server
showmount -a

# Auf Client
mount | grep nfs
df -h | grep nfs

NFS-Statistiken

# Server-Statistiken
nfsstat -s

# Client-Statistiken
nfsstat -c

# RPC-Statistiken
nfsstat -r

Verbindungen prüfen

# RPC-Services
rpcinfo -p localhost

# NFS-Verbindungen
ss -tn | grep 2049

Troubleshooting

Mount fehlgeschlagen

# Server erreichbar?
ping server

# Exports verfügbar?
showmount -e server

# Firewall?
nc -zv server 2049

# Verbose Mount
mount -t nfs -v server:/data /mnt/data

Zugriff verweigert

# exports prüfen
cat /etc/exports
exportfs -v

# UID/GID prüfen
id
ls -la /srv/nfs/data

Performance-Probleme

# Mount-Optionen prüfen
mount | grep nfs

# Netzwerk-Performance
iperf3 -c server

# NFS-Statistiken
nfsstat -c

Stale NFS Handle

# Unmount erzwingen
umount -f /mnt/nfs

# Lazy Unmount
umount -l /mnt/nfs

# Bei hängenden Mounts
fuser -km /mnt/nfs
umount /mnt/nfs

Backup mit NFS

rsync über NFS

# NFS mounten
mount -t nfs server:/backup /mnt/backup

# rsync
rsync -avz /data/ /mnt/backup/data/

NFS für Backup-Server

# /etc/exports
/backup  backup-server(rw,sync,no_root_squash)

Zusammenfassung

| Befehl | Funktion | |--------|----------| | exportfs -ra | Exports neu laden | | exportfs -v | Aktive Exports | | showmount -e server | Server-Exports anzeigen | | nfsstat | NFS-Statistiken | | mount -t nfs | NFS mounten |

| Datei | Beschreibung | |-------|--------------| | /etc/exports | Server-Freigaben | | /etc/fstab | Client-Mounts | | /etc/idmapd.conf | NFSv4 ID-Mapping |

Fazit

NFS ist die native Lösung für Dateifreigaben zwischen Linux-Systemen. NFSv4 vereinfacht die Firewall-Konfiguration und bietet Kerberos-Unterstützung. Achten Sie auf korrekte UID/GID-Synchronisation und nutzen Sie optimierte Mount-Optionen für beste Performance. Für heterogene Umgebungen (Windows/Linux) ist Samba die bessere Wahl.