NFSv4
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 20.04 Focal Fossa
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Dieser Artikel behandelt den Umgang mit dem NFS (Network File System) in der Version 4 und stellt die Unterschiede gegenüber der älteren Versionen 2/3 heraus. Ein Artikel zu NFS im Allgemeinen (mit weiterführenden Details) findet sich in NFS.
Vorteil von NFSv4¶
Gegenüber der vorherigen Versionen bietet NFS in der Version 4 einige Verbesserungen und Vereinfachungen:
Der bemerkenswerteste Unterschied ist, dass NFSv4 mit einem einzelnen Protokoll auskommt. In früheren Varianten von NFS waren stattdessen immer mehrere Protokolle nötig, die vom sog. Portmapper bei jedem Neustart einen Port zugewiesen bekamen. Diese Neuerung macht es v.a. für die (Netzwerk-)Administration um einiges einfacher, da beispielsweise bei Firewall-Freigaben nur noch der NFS-Port 2049 berücksichtigt werden muss.
Weitere Unterschiede¶
NFSv4 kennt UTF-8, sodass es bei Dateinamen mit Sonderzeichen keine Probleme mehr geben sollte.
Das Caching wurde erheblich verbessert, dadurch ist NFSv4 einiges schneller.
Authentifizierung via Kerberos möglich. (Siehe separater Artikel Kerberos/NFS mit Kerberos sichern)
Das Standardprotokoll ist TCP statt UDP wie bei NFSv3.
Das File-Locking wurde verbessert. Dies bedeutet insbesondere weniger Probleme, falls ein und dieselben Ordner via Samba und NFS frei gegeben werden.
Anforderung an die Systemumgebung¶
Wie in den NFS-Versionen zuvor ist es für einen reibungslosen und sicheren Betrieb von Vorteil, wenn alle Benutzer im Netzwerk eindeutige UIDs haben. Alternativ können ab NFSv4 die Berechtigungen auch über die Linux-Benutzernamen gesteuert werden. Zur Autorisierung wird hierfür die Kombination aus Benutzernamen und DNS-Domäne des Rechners verwendet. Falls Server und Client unterschiedlichen DNS-Domänen angehören, kann eine gemeinsame Domäne in der Datei /etc/idmapd eingetragen werden. Weiteres gibt es dazu in der Manpage des idmapd.
Hinweis:
Es sollte darauf geachtet werden, dass Server und Client die gleiche NFS-Version sprechen, also entweder beide Version 3.x oder beide Version 4.x . Verbindet man einen NFS4-Client mit einem NFS3-Server, erhält man nicht immer eine Fehlermeldung. Im laufenden Betrieb stellen sich aber Probleme heraus, die sich nur durch das Angleichen der NFS-Versionen beheben lassen. siehe auch Problembehebung
Installation¶
Sollte NFS noch nicht vorhanden sein, lässt es nachträglich problemlos installieren. Folgende Pakete und deren Abhängigkeiten müssen über die Paketverwaltung [1] installiert werden.
Server¶
Wenn der Rechner als Server dienen soll, der Dateien bereitstellt:
nfs-kernel-server
Befehl zum Installieren der Pakete:
sudo apt-get install nfs-kernel-server
Oder mit apturl installieren, Link: apt://nfs-kernel-server
Die unterstützten Protokollversionen des Servers können mit dem Befehl
sudo cat /proc/fs/nfsd/versions
abgefragt werden.
Client¶
Wenn der Rechner nur als Client agieren soll, der auf andere Freigaben zugreift:
nfs-common
Befehl zum Installieren der Pakete:
sudo apt-get install nfs-common
Oder mit apturl installieren, Link: apt://nfs-common
Freigaben¶
Gegenüber den Versionen 2/3 wird bei der Freigabe über NFSv4 ein sogenanntes "Pseudodateisystem" benötigt. Im Folgenden wird erklärt, was es damit auf sich hat:
Beispiel:
Als Hauptverzeichnis für die Freigaben auf dem Server soll /srv/nfsv4 dienen. Dazu wird zuerst ein Verzeichnis angelegt[2]:
sudo mkdir /srv/nfsv4
Dieses Verzeichnis ist das Pseudodateisystem, das als Wurzelverzeichnis für die Freigaben dient. Darin enthalten sollen nun zwei einzelne Freigaben erstellt werden.
sudo mkdir /srv/nfsv4/freigabe1 sudo mkdir /srv/nfsv4/freigabe2
Damit in diesen Verzeichnissen auch Daten erscheinen, müssen die Ziele dorthin eingebunden werden:
sudo mount --bind /das/freizugebende/Verzeichnis /srv/nfsv4/freigabe1 sudo mount --bind /noch/ein/freizugebendes/Verzeichnis /srv/nfsv4/freigabe2
Hinweis: bei nfsvers=3 funktionieren symbolische Links (statt bind) ebenso.
Damit das nach einem Neustart automatisch geschieht, empfiehlt es sich, diese Information zur /etc/fstab hinzuzufügen:
/das/freizugebende/Verzeichnis /srv/nfsv4/freigabe1 none bind 0 0 /noch/ein/freizugebendes/Verzeichnis /srv/nfsv4/freigabe2 none bind 0 0
Die Freigaben selbst werden wie bei NFSv2/3 durch direkte Bearbeitung der Datei /etc/exports verwaltet. Dazu muss diese Datei angelegt und/oder bearbeitet werden. Zu Beachten ist hier die Angabe des Pseudodateisystems in der ersten Zeile.
Format/Syntax des Files /etc/exports
<pseudo-dateisystem> <rechneradresse>(<optionen>,fsid=0) <pfad1> <rechneradresse>(<optionen>) <pfad2> <rechneradresse>(<optionen>)
Man beachte die spezielle Option vom Pseudo-Dateisystem 'fsid=0'. Diese markiert das oberste Verzeichnis für alle Freigaben zusammen. Um die oben angelegten Verzeichnisse frei zu geben, werden beispielsweise folgende Zeilen benötigt:
/srv/nfsv4 192.168.2.0/24(rw,sync,root_squash,no_subtree_check,fsid=0) /srv/nfsv4/freigabe1 192.168.2.0/24(rw,sync,root_squash,no_subtree_check) /srv/nfsv4/freigabe2 192.168.2.0/24(rw,sync,root_squash,no_subtree_check)
Achtung!
Als Rechneradresse kann neben einer IP-Adresse oder eines IP-Bereiches auch ein Rechnername oder ein DNS-Domainname angegeben werden. Allerdings müssen im Gegensatz zu IP-Adressangaben diese Namen bereits beim Systemboot richtig aufgelöst werden können, was nicht immer der Fall sein muss. Kann der Name beim Booten nicht aufgelöst werden, wird die Freigabe nicht erstellt. Dies kann zu erheblichen Problemen führen.
Nun muss der NFS-Server noch dazu veranlasst werden, die /etc/exports neu einzulesen.
sudo service nfs-kernel-server reload
Ein Test auf dem Server zeigt die Freigaben:
sudo exportfs -v
Einhängen der Freigaben am Client¶
Um zu testen, ob sich die Freigaben am Client fehlerfrei einbinden lassen, hängt man die Verzeichnisse einmal direkt via Kommandozeile ein. Zu beachten ist hier, dass das Pseudodateisystem das Wurzelverzeichnis der Freigabe definiert - / bei der Angabe der Freigabe entspricht also /srv/nfsv4 auf dem NFS-Server.
Zuerst wird der Mountpoint für die Freigaben erstellt:
sudo mkdir /mnt/nfsv4-test
Dann wird die erste Freigabe in das Verzeichnis eingehängt:
sudo mount -t nfs -o nfsvers=4 <nfs-server>:/freigabe1 /mnt/nfsv4-test
Stattdessen kann auch das ganze Wurzelverzeichnis eingehängt werden:
sudo mount -t nfs -o nfsvers=4 <nfs-server>:/ /mnt/nfsv4-test
Wenn bis hierher alles geklappt hat, kann man sich alle Mountpoints noch mit dem Befehl
mount
anzeigen lassen.
Wenn alles geklappt hat, kann man die NFS-Freigabe in die fstab eintragen, z.B.
<nfs-server>:/ /mnt/nfsv4-test nfs nfsvers=4,rw 0 0
Wenn man eine höhere NFS-Version als 4.0 verwenden möchte, kann man dies mit der Mount-Option minorversion=
angeben. Der fstab-Eintrag
<nfs-server>:/ /mnt/nfsv4-test nfs nfsvers=4,minorversion=2,rw 0 0
hängt die Freigabe mit der NFS-Version 4.2 ein.
Problembehebung¶
eingehängte Dateien gehören nobody¶
Problembeschreibung¶
Wenn die eingehängten Daten am Client dem Benutzer nobody
gehören und sich dies auch nicht ändern lässt, ist das ein Zeichen dafür, dass hier mit einem NFS4-Client auf eine NFS3-Freigabe zugegriffen wird. Die Ursache ist in der Regel
a) Die Serverkonfiguration wurde nach der NFSv3-Syntax gebaut, es fehlt die Angabe des Pseudodateisystems mit fsid=0
b) Der NFS-Server unterstützt kein NFSv4. Dies ist zum Beispiel bei Storage-Systemen mit integriertem NFS-Server der Fall. *)
# ls -la total 17 drwxr-xr-x 2 nobody 4294967294 3 Apr 22 2021 ./ drwxrwxr-x 19 nobody service 19 Apr 22 2021 ../ -rw-r--r-- 1 nobody 4294967294 0 Apr 22 2021 file # sudo chown service file # ls -la total 17 drwxr-xr-x 2 nobody 4294967294 3 Apr 22 2021 ./ drwxrwxr-x 19 nobody service 19 Apr 22 2021 ../ -rw-r--r-- 1 nobody 4294967294 0 Apr 22 2021 file
Lösung¶
Sicherstellen, dass der NFS-Server das Protokoll in der Version 4 verwendet. Sollte dies nicht möglich sein
Client-seitig die Version3 verwenden. Dies geschieht durch die Angabe der Version3 im Mount-Befehl:
sudo mount -t nfs -o nfsvers=3 <nfs-server-version3>:/freigabe1 /mnt/nfsv4-test
Links¶
Intern¶
NFS – Grundartikel zu NFS (hauptsächlich Version 2/3)
Serverdienste – Übersichtsartikel
Heimnetzwerk – Einführender Artikel; betrifft vor allem einfache Anwendungen
Autofs – Erlaubt auch die Auswahl ("browse") und das Einbinden von NFS-Freigaben
Extern¶
NFSv4Howto 🇬🇧 – im Ubuntu Help Wiki
http://wiki.linux-nfs.org/wiki/index.php/NFSv41_Introduction 🇬🇧 - NFSv41_Introduction
https://patchwork.kernel.org/patch/9769919 🇬🇧 - Eintrag aus der Mailingliste zur Angabe der Minorversion
*) https://e.huawei.com/de/products/storage 🇩🇪 - Storage-Systeme von Huawei