ubuntuusers.de

Du betrachtest eine alte Revision dieser Wikiseite.

NFS

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


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:

NFS (Network File System) 🇬🇧 ist ein stabiles und gut funktionierendes Netzwerk-Protokoll von Sun, um Dateien über das lokale Netzwerk auszutauschen (es würde auch über das Internet funktionieren, ist aber aus Sicherheitsgründen nicht zu empfehlen). NFS ist im Prinzip das *NIX-Pendant zu SMB aus der Windows-Welt.

Einsatzszenario

NFS setzt für einen reibungslosen und sicheren Betrieb voraus, dass

  • alle Benutzer im Netzwerk eindeutige UIDs haben

  • 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 LDAP- oder NIS-Server sicher. Die Zugriffskontrolle auf die einzelnen Dateien geschieht dann auf dem Server über das reguläre Dateiberechtigungssystem.

Wenn die Benutzer Administratorrechte auf ihren eigenen Rechnern haben, (oder ihre eigenen Notebooks ins Netz hängen können,) 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 müsste dann entweder ein zusätzliches Sicherheitsprotokoll wie Kerberos zum Einsatz kommen (nicht-trivial und nicht Gegenstand dieses Artikels) oder gleich Samba benutzt werden (langsamer).

Installation

Sollte NFS noch nicht vorhanden sein, lässt es sich sehr schnell installieren. Folgende Pakete müssen über die Paketverwaltung [1] noch zusätzlich installiert werden:

Wenn der Rechner als Server dienen soll, der Dateien bereitstellt:

  • nfs-common

  • nfs-kernel-server

  • portmap

Wenn der Rechner nur als Client agieren soll, der auf andere Freigaben zugreift:

  • nfs-common

  • portmap

Freigaben

Die Freigaben von Verzeichnissen und Dateien auf dem Server lassen sich entweder mit grafischer Oberfläche oder durch direkte Bearbeitung der Datei /etc/exports verwalten.

Verwalten mit grafischer Oberfläche

Die Freigaben können über die grafischen Oberflächen von GNOME bzw. KDE sehr einfach exportiert werden.

Unter Ubuntu/GNOME: Zum Einen geht dies über "System → Systemverwaltung/Administration → Gemeinsame Ordner" oder zum Anderen (noch einfacher) über Nautilus. Einfach mit der rechten Maustaste auf den gewünschten Ordner klicken und "Ordner freigeben" wählen (unter Gutsy lautet der Befehl im Kontextmenü "Ordner teilen"). Als Protokoll danach NFS angeben.

Unter Kubuntu/KDE: Zum Einen geht dies über "Systemeinstellungen → Freigaben"; das Hinzufügen von Ordnern erfordert Systemverwaltungsrechte; für die erweiterten Optionen vgl. den nächsten Abschnitt. Zum Anderen über Konqueror. Einfach mit der rechten Maustaste auf den gewünschten Ordner klicken und "Freigeben" wählen. Es erscheint ein einfacher Konfigurationsdialog.

Über die Konsole

Dazu muss die Datei /etc/exports angelegt und/oder bearbeitet werden [3]. Die Freigabe eines Verzeichnisses lässt sich mit einer Zeile nach folgendem Muster anlegen:

<pfad>   <computername> (<optionen>)

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 Partitonen 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

Hinweis:

insecure sollte nur verwendet werden, wenn es unbedingt notwendig ist! Da dann auch die unsicheren Ports verwendet werden. Leider verwendet das OSX 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.

Hinweis:

Mit der Option nohide sollte man aufpassen, 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:

<ip>  <computername> <computername.domain.tld>

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, die exports neu einzulesen.

sudo exportfs -ra 

Alternativ kann der gesamte NFS-Server neu gestartet werden:

sudo /etc/init.d/nfs-kernel-server restart 

Die eventuell auftauchende Warnung "exportfs: No options for..." kann ignoriert werden.

⚓︎

Zugriffskontrolle

Der NFS-Server beachtet die Zugriffsbeschränkungen, die durch die Dateien /etc/hosts.allow und /etc/hosts.deny beschrieben werden. (Siehe auch 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.

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

cd /media
sudo mkdir meinefreigabe
sudo mount ipadresse:/pfad/zur/freigabe /media/meinefreigabe 

eingeben. Im Falle einer Notebookfreigabe sieht das ca. so aus:

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 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 vom Dateimanager)
    timeo=<SEKUNDEN> In Verbindung mit "soft" kann festgelegt werden, wann der Timeout erfolgen soll
    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.

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.

sudo dpkg-reconfigure portmap


Diese Revision wurde am 31. Juli 2008 21:17 von boenki erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Netzwerk, Server, Freigaben, ungetestet