NFSv4 Server

Beschreibt die Einrichtung eines NFSv4 Fileservers unter Ubuntu.

Siehe auch das offizielle Ubuntu NFSv4Howto für weitere Infos.

Pakete für Ubuntu 20.04 und höher

bash$ sudo apt-get install nfs-kernel-server

Konfiguration

Beschreibt die weitere Konfiguration des NFSv4 Servers.

Kerberos

Ihr Server muss für Kerberos konfiguriert sein!
Für Hilfe bei der Konfiguration von Kerberos folgen Sie bitte der Anleitung zur Anbindung Ihres Client/Servers an die RRZE-Infrastruktur.

Für den Betrieb mit Kerberos muss auch ein entsprechender Service-Principal für NFS vorhanden sein.
Prüfen Sie dies bitte mit folgendem Befehl.

bash$ sudo klist -kte
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   ...
   2 nfs/[IHR SERVER]@LINUX.FAU.DE (aes256-cts-hmac-sha1-96) 
   2 nfs/[IHR SERVER]@LINUX.FAU.DE (aes128-cts-hmac-sha1-96) 
   2 nfs/[IHR SERVER]@LINUX.FAU.DE (des3-cbc-sha1) 
   2 nfs/[IHR SERVER]@LINUX.FAU.DE (arcfour-hmac)

Darüber hinaus sind Anpassungen an den folgenden beiden Dateien nötig.

bash$ sudo vi /etc/default/nfs-common

...
NEED_GSSD=yes
...
bash$ sudo vi /etc/default/nfs-kernel-server

...
NEED_SVCGSSD="yes"
...

Damit ist die Konfiguration von Kerberos bezüglich des NFSv4 Servers abgeschlossen.

Vorbereiten des pseudo-root Verzeichnisses für Exports

Durch Konfiguration eines pseudo-root Verzeichnisses für NFS Exports wird der exportierte Pfad unabhängig vom echten Pfad auf dem Server.
Das erleichtert ggf. einen später notwendigen Umzug der Daten.

Im Gegensatz zu NFSv3 verwendet NFSv4 immer ein pseudo-root! Verwendet man die falschen Pfade auf den Clients kann unter Umständen ein automatisches Fallback auf NFSv3 passieren.

Zur Vorbereitung erstellt man ein Verzeichnis, das alle späteren Exports enthalten soll und fasst dort alle Daten mittels Bind-Mounts zusammen.

bash$ mkdir /export
bash$ mount --bind /some/nested/data/dir /export/sys
...

Die Bind-Mounts müssen in der /etc/fstab eingetragen werden, damit die Exports nach dem nächsten Reboot wieder genauso zur Verfügung gestellt werden können.

bash$ cat /etc/fstab
....
/some/nested/data/dir /export/sys none bind
...

Exportierte Verzeichnisse

Das RRZE empfiehlt nur mittels krb5p verschlüsselte Verbindungen zu verwenden.

Die freizugebenden Verzeichnisse werden wie folgt konfiguriert.
Der erste Eintrag markiert dabei das Basisverzeichnis des pseudo-root Dateisystems durch die Option fsid=0.

bash$ sudo vi /etc/exports

# Pseudo-root für NFSv4
/export                               169.254.0.0/255.255.255.128(rw,no_subtree_check,fsid=0,crossmnt)

# Beispiel für Export mit Kerberos-Authentifizierung und Verschlüsselung
/export/krb5_enc                      169.254.0.0/255.255.255.128(rw,async,sec=krb5p,no_subtree_check)

# Beispiel für Export mit Kerberos-Authentifizierung und nur Integritätscheck
/export/krb5_int                      169.254.0.0/255.255.255.128(rw,async,sec=krb5i,no_subtree_check)

# Beispiel für Export mit Kerberos-Authentifizierung und Verschlüsselung (präferiert) und nur Integritätscheck als Fallback
/export/krb5_enc_or_int               169.254.0.0/255.255.255.128(rw,async,sec=krb5p:krb5i,no_subtree_check)

# Beispiel für Export mit nur Kerberos-Authentifizierung
/export/krb5                          169.254.0.0/255.255.255.128(rw,async,sec=krb5,no_subtree_check)

# Beispiel für Export ohne Kerberos-Authentifizierung
/export/sys                           169.254.0.0/255.255.255.128(rw,async,sec=sys,no_subtree_check)
...

Mit folgendem Befehl können Sie die exportierten Verzeichnisse anhand der oben vorgenommenen Konfiguration aktualisieren (Re-export).

bash$ sudo exportfs -rv
exporting 169.254.0.0/255.255.255.128:/export/krb5_enc
exporting 169.254.0.0/255.255.255.128:/export/krb5_int
exporting 169.254.0.0/255.255.255.128:/export/krb5
exporting 169.254.0.0/255.255.255.128:/export/sys

Nach erfolgreicher Aktualisierung (oder auch jederzeit zur Überprüfung) können Sie die aktuell aktiven exportierten Verzeichnisse wie folgt abfragen.

bash$ sudo exportfs -v
/export/krb5_enc 169.254.0.0/255.255.255.128(rw,async,sec=krb5p,no_subtree_check)
/export/krb5_int 169.254.0.0/255.255.255.128(rw,async,sec=krb5i,no_subtree_check)
/export/krb5 169.254.0.0/255.255.255.128(rw,async,sec=krb5,no_subtree_check)
/export/sys 169.254.0.0/255.255.255.128(rw,async,sec=sys,no_subtree_check)

Test

Der mount Befehl liefert leider oft nicht die besten Fehlermeldungen, was die Diagnose im Fehlerfall erschwert.
Generell wird empfohlen zum Testen immer die -v Option zu setzen, um mehr Informationen über die ausgeführten Aktionen zu bekommen.
Außerdem ist ein explizites Anfordern der NFS Version zB mit -t nfs4 oder -o vers=4 statt dem generischen -t nfs ratsam.

Einbinden von Exports auf dem Client

Beachten Sie die Referenzierung des Mountpunkts relativ zum Pseudo-root des Servers ohne vorangestelltes „/export“!

Beispielaufruf:

bash$ mount -v -t nfs4 server:/sys /mnt/sys

 

Ein erfolgreicher Mount mit NFSv4.2 sollte in etwa folgende Ausgabe liefern.
Man beachte die Angabe des Exports auf dem Server relativ zum pseudo-root.

bash$ mount -v -t nfs server:/sys /mnt/sys
mount.nfs: timeout set for Tue Nov  6 12:29:36 2018
mount.nfs: trying text-based options 'vers=4.2,addr=131.188.xxx.xxx,clientaddr=10.188.xxx.xxx'

 

Ein fehlerhafter Mount mit Fallback auf NFSv3 sieht in etwa so aus.
Man beachte die Angabe des Exports auf dem Server als absoluten Pfad, was durch NFSv4 nicht mehr unterstützt wird und nach einem entsprechenden Fehler den Fallback zu NFSv3 auslöst.

bash$ mount -v -t nfs server:/export/sys /mnt/sys
mount.nfs: timeout set for Tue Nov  6 12:29:20 2018
mount.nfs: trying text-based options 'vers=4.2,addr=131.188.xxx.xxx,clientaddr=10.188.xxx.xxx'
mount.nfs: mount(2): No such file or directory
mount.nfs: trying text-based options 'addr=131.188.xxx.xxx'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 131.188.xxx.xxx prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 131.188.xxx.xxx prog 100005 vers 3 prot UDP port 45103