[[Vorlage(Getestet, bionic, focal)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] [:mount:] [:fstab:] }}} [[Inhaltsverzeichnis(2)]] [[Bild(Wiki/Icons/service.png, 48, align=left)]] Dieser Artikel behandelt den Umgang mit dem [wikipedia:Network_File_System: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 [:Benutzer_und_Gruppen#Nummerierung-der-UID-GID: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''. {{{#!vorlage Hinweis Es sollte darauf geachtet werden, dass [#Server Server] und [#Client 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 Problembehebung] }}} = Installation = Sollte NFS noch nicht vorhanden sein, lässt es sich 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: {{{#!vorlage Paketinstallation nfs-kernel-server }}} Die unterstützten Protokollversionen des Servers können mit dem Befehl {{{#!vorlage Befehl sudo cat /proc/fs/nfsd/versions }}} abgefragt werden. == Client == Wenn der Rechner nur als Client agieren soll, der auf andere Freigaben zugreift: {{{#!vorlage Paketinstallation 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]: {{{#!vorlage Befehl 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. {{{#!vorlage Befehl sudo mkdir /srv/nfsv4/freigabe1 sudo mkdir /srv/nfsv4/freigabe2 }}} Damit in diesen Verzeichnissen auch Daten erscheinen, müssen die Ziele dorthin eingebunden werden: {{{#!vorlage Befehl 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''' {{{ (,fsid=0) () () }}} 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) }}} {{{#!vorlage Warnung 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. {{{#!vorlage Befehl sudo service nfs-kernel-server reload }}} Ein Test auf dem Server zeigt die Freigaben: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl sudo mkdir /mnt/nfsv4-test }}} Dann wird die erste Freigabe in das Verzeichnis eingehängt: {{{#!vorlage Befehl sudo mount -t nfs -o nfsvers=4 :/freigabe1 /mnt/nfsv4-test }}} Stattdessen kann auch das ganze Wurzelverzeichnis eingehängt werden: {{{#!vorlage Befehl sudo mount -t nfs -o nfsvers=4 :/ /mnt/nfsv4-test }}} Wenn bis hierher alles geklappt hat, kann man sich alle Mountpoints noch mit dem Befehl {{{#!vorlage Befehl mount }}} anzeigen lassen. Wenn alles geklappt hat, kann man die NFS-Freigabe in die [:fstab:] eintragen, z.B. {{{ :/ /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/#Befehlszeilenoptionen:Mount-Option] `minorversion=` angeben. Der fstab-Eintrag {{{ :/ /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 === 1. Sicherstellen, dass der NFS-Server das Protokoll in der Version 4 verwendet. Sollte dies nicht möglich sein 1. Client-seitig die Version3 verwenden. Dies geschieht durch die Angabe der Version3 im Mount-Befehl: {{{#!vorlage Befehl sudo mount -t nfs -o nfsvers=3 :/freigabe1 /mnt/nfsv4-test }}} = Links = ==Intern== * [:NFS:] {Übersicht} – Grundartikel zu NFS (hauptsächlich Version 2/3) * [:Serverdienste:] {Übersicht} – Übersichtsartikel * [:Heimnetzwerk:] {Übersicht} – Einführender Artikel; betrifft vor allem einfache Anwendungen * [:Autofs:] – Erlaubt auch die Auswahl ("browse") und das Einbinden von NFS-Freigaben ==Extern== * [ubuntu_doc:community/NFSv4Howto: NFSv4Howto] {en} – im Ubuntu Help Wiki * [http://wiki.linux-nfs.org/wiki/index.php/NFSv41_Introduction] {en} - NFSv41_Introduction * [https://patchwork.kernel.org/patch/9769919] {en} - Eintrag aus der Mailingliste zur Angabe der Minorversion * *) [https://e.huawei.com/de/products/storage] {de} - Storage-Systeme von Huawei # tag: Netzwerk, Server, Freigaben