[[Vorlage(Getestet, oneiric, natty, lucid, hardy)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] [:fstab:] }}} [[Inhaltsverzeichnis(2)]] [[Bild(Wiki/Icons/service.png, 48, align=left)]] [http://nfs.sourceforge.net/ NFS (Network File System)] {en} ist ein stabiles und gut funktionierendes Netzwerk-Protokoll von Sun, um Dateien über das lokale Netzwerk auszutauschen. Prinzipiell würde es auch über das Internet funktionieren, was aber aus Sicherheitsgründen nicht zu empfehlen ist. NFS ist im Prinzip das *NIX-Pendant zu [:Samba:SMB] aus der Windows-Welt. = Einsatzszenario = NFS setzt für einen reibungslosen und sicheren Betrieb voraus, dass * alle Benutzer im Netzwerk eindeutige UIDs haben und * alle Rechner im Netzwerk zentral administriert werden Die Rechner müssen also so konfiguriert werden, dass jeder Benutzer netzweit seine eigene feste, numerische UID erhält, die auf allen Rechnern dann gleich ist. Bei größeren Netzwerken stellt man das mit einem [wikipedia:Lightweight_Directory_Access_Protocol:LDAP]- oder [wikipedia:Network_Information_Service:NIS]-Server sicher. Die Zugriffskontrolle auf die einzelnen Dateien geschieht dann auf dem Server über das reguläre Dateiberechtigungssystem. Wenn die Benutzer Root-Rechte auf ihren eigenen Rechnern haben bzw. ihre eigenen Notebooks ins Netz einbinden dürfen, können sie das aber umgehen und sich auf ihren Rechnern beliebige UIDs besorgen, die vom NFS-Server auch nicht weiter getestet werden. In diesem Fall muss dann entweder ein zusätzliches Sicherheitsprotokoll wie [:Kerberos:] zum Einsatz kommen (nicht-trivial und Gegenstand des eigenen Artikels [:Kerberos/NFS_mit_Kerberos_sichern:NFS mit Kerberos sichern]) oder gleich [:Samba:] benutzt werden (langsamer). = Installation = Sollte NFS noch nicht vorhanden sein, lässt es sich sehr schnell installieren. Folgende Pakete und deren Abhängigkeiten müssen über die Paketverwaltung [1] installiert werden: Wenn der Rechner als Server dienen soll, der Dateien bereitstellt: {{{#!vorlage Paketinstallation nfs-kernel-server }}} Wenn der Rechner nur als Client agieren soll, der auf andere Freigaben zugreift: {{{#!vorlage Paketinstallation nfs-common }}} = Freigaben = Die Freigaben von Verzeichnissen und Dateien auf dem Server lassen sich durch direkte Bearbeitung der Datei '''/etc/exports''' verwalten. Dazu muss diese Datei angelegt und/oder bearbeitet werden [3]. Die Freigabe eines Verzeichnisses lässt sich mit einer Zeile nach folgendem Muster anlegen: {{{ () }}} Hier sind einige Beispiele: {{{ # freigabe1 wird für zwei Rechner freigegeben # notebook darf nur lesen (ro) # desktop darf lesen und schreiben (rw) /pfad/zur/freigabe1 notebook(ro,async) desktop(rw,async) }}} Alternativ kann die IP-Adresse angegeben werden: {{{ # Freigabe gilt nur für 192.168.1.13, jedoch nur mit Leserechten: /pfad/zur/freigabe2 192.168.1.13(ro,async) # Freigabe gilt für alle IPs von 192.168.1.1 bis 192.168.1.255, mit Lese-/Schreibrechten: /pfad/zur/freigabe3 192.168.1.0/255.255.255.0(rw,async) # Freigabe gilt nur für den Rechner mit dem Namen notebook /pfad/zur/freigabe4 notebook(ro,async) }}} Die Parameter in den Klammern lauten: || `rw` || Lesen und Schreiben || || `ro` || nur Lesen || || `async` || Asynchroner Datentransfer || || `insecure` || Ports oberhalb 1024 auch verwenden || || `no_root_squash` || Bindet man per NFS Verzeichnisse ein, die auf dem Server dem User root gehören, werden diese auf den User nobody gemapped und man kann diese nicht modifizieren. Um dieses Sicherheitsfeature zu umgehen, dient der Parameter no_root_squash (weitere Info mit man 5 exports) || || `nohide` || Wenn unterhalb eines exportierten Verzeichnisses (z.B. /home/user auf /dev/hda1) ein weiteres Dateisystem eingebunden wurde (z.B. /dev/hdb1 in /home/user/Musik), so wird dieses Verzeichnis durch einen eigenen exports-eintrag exportiert. Im Normalfall (option 'hide') sieht der Client dieses Unterverzeichnis nicht, wenn er nur das Oberverzeichnis einbindet, weswegen er beide einbinden muss. Durch die Option 'nohide' werden die eingebundenen Unterverzeichnisse dem Client nicht mehr als eigene Partitionen präsentiert, sondern als normale, zum Oberverzeichnis gehörende Verzeichnisse. Daher muss man zwar am Server noch alles explizit exportieren, am Client aber nur noch das Oberverzeichnis einbinden || || `subtree_check` || Wenn nur einzelne Verzeichnisse eines Dateisystems freigegeben wurden, wird hiermit überprüft ob eine vom Client angeforderte Datei in diesen Verzeichnissen des Dateisystems ist. Wurde das komplette Dateisystem freigegeben, werden die Übertragungsgeschwindigkeiten beim deaktivieren mittels 'no_subtree_check' erhöht. Darüberhinaus stellt diese Option sicher, dass beim Einbinden eines NFS Verzeichnisses mittels 'root_squash' alle Dateien, die dem user 'root' gehören, nicht abrufbar sind (selbst wenn die Datei-Rechte dies vorsehen). Diese Option kann jedoch Probleme verursachen, insbesondere wenn Dateien umbenannt werden, die auf dem Client gerade geöffnet sind. Deshalb ist seit nfs-utils 1.0.x 'no_subtree_check' voreingestellt. || {{{#!vorlage Hinweis Achtung: Zwischen Freigabe und der Parameterklammer darf kein Leerzeichen stehen: z.B. 192.168.1.13(ro,async) und __nicht__ 192.168.1.13 (ro,async) `insecure` sollte nur verwendet werden, wenn es unbedingt notwendig ist! Da dann auch die unsicheren Ports verwendet werden. Leider verwendet das Mac OS X von Apple diese Ports für NFS-Verbindungen. Ein aktueller Apple Computer kann sich nur dann mit dem NFS-Server verbinden, wenn die Option `insecure` gesetzt ist. Bei der Option `nohide` sollte man beachten, da es dadurch passieren kann, dass verschiedene Dateien, welche auf unterschiedlichen Partitionen bzw. Dateisystemen dieselbe Inode besitzen, im gemounteten Oberverzeichnis dieselbe Inode auf dem gleichen (NFS-)Dateisystem haben; manche Treiber verkraften das nicht. Zumindest bei mir führte es beim Client zu einer Kernel Panic, wenn ich gleichzeitig lesend und schreibend auf den Server zugegriffen habe. Des Weiteren sei angemerkt, dass die Option 'nohide' nur funktioniert, wenn die Client-Angabe ein bestimmter Rechner ist; bei Wildcards oder ganzen IP-Bereichen klappt das ''nicht''. }}} Damit sich der Rechner ''notebook'' auch zu der Freigabe /pfad/zur/freigabe3 verbinden kann, muss er mit der IP-Adresse in der Datei '''/etc/hosts''' [3] stehen. Die Datei muss wie folgt aufgebaut sein: {{{ }}} z.B.: {{{ 192.168.1.12 notebook notebook.meinedomain.local 192.168.1.13 desktop desktop.meinedomain.local }}} Nun muss dem NFS-Server im Terminal [2] nur noch gesagt werden, '''/etc/exports''' neu einzulesen. {{{#!vorlage Befehl sudo exportfs -ra }}} Alternativ kann der gesamte NFS-Server neu gestartet werden: {{{#!vorlage Befehl sudo /etc/init.d/nfs-kernel-server restart }}} Die eventuell auftauchende Warnung ''"exportfs: No options for..."'' kann ignoriert werden. [[Anker(ACL)]] == Zugriffskontrolle == Der NFS-Server beachtet die Zugriffsbeschränkungen, die durch die Dateien '''/etc/hosts.allow''' und '''/etc/hosts.deny''' beschrieben werden (siehe auch [:inetd:inetd#tcpwrapper] und `man hosts_access`). Falls man diese Art der Zugriffskontrolle (zusätzlich zu der aus '''/etc/exports''') verwenden will, sind folgende Einträge vorzunehmen (für den Fall, dass diese Dateien noch nicht existieren, kann man sie einfach selber anlegen): In der '''/etc/hosts.deny''': {{{ portmap: ALL }}} Und in der '''/etc/hosts.allow''': {{{ # falls nur die IP 192.168.1.13 Zugriff erhalten soll: portmap: 192.168.1.13 # falls das gesamte LAN Zugriff erhalten soll: portmap: 192.168.1. # oder portmap: 192.168.1.0/24 }}} Auf dieselbe Art sollte man dann auch den Zugriff auf den '''mountd''' und den '''statd''' beschränken. Zu beachten ist, dass für diese Dienste nur IP-Adressen in den hosts_access-Dateien funktionieren, keine Domainnamen. {{{#!vorlage Hinweis Die Einschränkung des '''statd''' bietet sich auch auf Client-Rechnern an, insbesondere auf Notebooks, die auch mal in unsicheren Netzen unterwegs sind. Hier muss der Zugriff nur dem/den Server(n) erlaubt werden. }}} = Auf Freigaben zugreifen = Damit der Client auf die Freigaben zugreifen kann, muss er sie einfach einbinden können. Hierzu ein Terminal öffnen [2] und {{{#!vorlage Befehl cd /media sudo mkdir meinefreigabe sudo mount ipadresse:/pfad/zur/freigabe /media/meinefreigabe }}} eingeben. Im Falle einer Notebookfreigabe sieht das ca. so aus: {{{#!vorlage Befehl cd /media sudo mkdir server sudo mount 192.168.1.13:/home /media/server }}} Man könnte nun ein Shellskript schreiben, das bei Aufruf eine Verbindung zum Server herstellt. (Achtung: Wenn das Verzeichnis schon erstellt wurde, muss dieses natürlich nicht mehr erstellt werden.) Die zweite Möglichkeit ist, das Ganze mit Root-Rechten in die '''/etc/fstab'''-Datei[4] zu schreiben [3]. Beispiel für den Eintrag in die '''/etc/fstab''': {{{ 192.168.6.13:/home /media/server nfs rw 0 0 }}} \\ || `rw` || Lese- und Schreibrechte || || `ro` || Nur Leserechte || Weitere Optionen in der '''/etc/fstab''' || `hard` || Bei Unterbrechungen ohne Timeout warten bis der Server wieder normal erreichbar ist || || `soft` || Bei Unterbrechungen sofort einen Timeout machen (verhindert ein Einfrieren des Dateimanagers) || || `timeo=` || In Verbindung mit `soft` kann festgelegt werden, wann der Timeout erfolgen soll || || `bg` || Bei einem Timeout, wird der mount im Hintergrund weiter versucht. Ist z.B. bei einem Laptop, dass im Heimnetz automatisch einen NFS-Server mounten soll, nützlich. || || `intr` || Erlaubt einem wartenden Programm bei Bedarf dennoch zu unterbrechen/killen || || `nolock` || Deaktiviert das Sperren von Dateien. Wird gelegentlich für die Verbindung zu alten NFS-Servern benötigt || || `rsize=8192,wsize=8192` || '''Vorsicht''': Mit diesen Optionen kann man die Blockgröße der übertragenen Daten festlegen. In den allermeisten Fällen ist es nicht empfehlenswert diese Optionen zu setzen. Server und Client handeln diese Werte selbst aus und erreichen so ein Maximum an Performance. Falsche Werte können die Geschwindigkeit von NFS um bis zu '''50%''' reduzieren.|| Weitere Optionen stehen in der [:man:Manpage] zu nfs. {{{#!vorlage Hinweis Portmap öffnet seinen Port standardmäßig an allen Netzwerkschnittstellen, was auf einem Client-Rechner nicht unbedingt erwünscht ist (vor allem bei Laptops, die auch in anderen Netzen unterwegs sind). Man kann das ändern, indem man einfach folgenden Befehl ausführt und die Frage, ob Portmap nur an localhost gebunden werden soll, mit einem ''JA'' beantwortet. Damit ist der Port von anderen Rechnern nicht mehr erreichbar. {{{#!vorlage Befehl sudo dpkg-reconfigure portmap \}}} }}} = Problembehebung = Sollten beim Zugriff auf NFS-Freigaben Probleme auftreten (z.B. Fehlermeldungen der Art ''"Permission denied"'', kein Schreibzugriff, scheinbar leere Ordner oder Ähnliches), so hängt dies sehr häufig mit mangelnden bzw. fehlerhaft vergebenen [:Rechte: Rechten] im eingebundenen (entfernten) Dateisystem zusammen. Weitere Hinweise hierzu finden sich vor allem unter [:mount#Rechte: mount -> Rechte ] sowie [:mount#Externe-Laufwerke-einhaengen: Externe Laufwerke einhängen]. {{{#!vorlage Hinweis Dateien und Ordner, die sich auf Partitionen mit dem Dateisystem [:NTFS:] befinden, können erst mit Kernel-Versionen ab 2.6.27 über NFS freigegeben werden. Dies ist in Ubuntu ab der Version 8.10 (Intrepid Ibex) der Fall. Bei der Freigabe von Dateien auf VFAT-Partitionen (FAT32) über NFS muss mit Problemen gerechnet werden. Als Ausweg empfiehlt sich dann [:Samba:]. }}} Sollte die Dateiübertragung langsam sein oder gar abbrechen, so sollte man prüfen, ob in der Datei '''/var/log/kernel.log''' des Clients Einträge der Form {{{ nfs: server not responding, timed out }}} auftauchen. Sollte dies der Fall sein, so könnte es helfen im Mount-Eintrag in '''/etc/fstab''' die Option `hard` statt `soft` zu verwenden. = Links = * [http://de.linwiki.org/index.php/Linuxfibel_-_Netzwerk_Server_-_NFS_Server NFS-Server] {de} - Linuxfibel * [http://www.selflinux.org/selflinux/html/nfs.html NFS] {de} - Ausführliche Erklärung (für fortgeschrittene Benutzer) von selflinux.org * [ubuntu:community/NFSv4Howto:NFSv4 Howto] {en} im Ubuntu-Wiki ##nächster Link funktioniert nur mit Highlight * [http://notes.setvisual.de/NFSv4%20mit%20Ubuntu?highlight=((NFSv4+mit+Ubuntu)) NFSv4 mit Ubuntu] {de} - älteres knappes NFSv4 HowTo * [http://nfs.sourceforge.net/nfs-howto/ar01s07.html NFS-HowTo - Troubleshooting] {en} - Gute Hilfestellung, wenn etwas nicht funktionieren sollte! * [:Serverdienste:] {Übersicht} Übersichtsartikel # tag: Netzwerk, Server, Freigaben