File-Services mit NFS

Permalink

Unter Windows kennen die Meisten wohl die sogenannten Netzwerkfreigaben. Dieses System, basierend auf SMB bzw. CIFS, ermöglicht es auf Dateien zuzugreifen, die auf einem anderen Rechner als dem eigenen liegen. Diese Funktion kann man auf Unix-Systemen mit NFS realisieren.

Für eine genauere Betrachtung von NFS sei auf den entsprechenden Artikel der Wikipedia verwiesen. Hier betrachte ich nur die Umsetzung in einem beispielhaften Netzwerk mit vier Knoten:

Ausgangsbasis ist ein Server unter Debian, ein Notebook unter Ubuntu, ein PC unter Windows und ein Streaming-Client für das Wohnzimmer (Netgear NeoTV 550).

Der Server

Als Server wird wie üblich der Computer bezeichnet der einen Service, in diesem Fall also Dateien, zur Verfügung stellt. Das hat nichts damit zu tun das man spezielle Serverhardware bräuchte. In meinem Fall ist das Betriebssystem des Servers Debian GNU/Linux. Mittels des Paketmanagers von Debian lassen sich die Packete nfs-kernel-server, nfs-common und portmap installieren:

apt-get install nfs-kernel-server nfs-common portmap

Dieses Paket beinhaltet die Serverkomponenten von NFS. Nach der Installation muss noch die Konfiguration vorgenommen werden und schon ist im besten Fall Kommunikation möglich. In der Datei /etc/exports wird angegeben welche Verzeichnisse über das Netzwerk an welche Rechner freizugeben sind und welche Optionen dabei anzuwenden sind. Jede Zeile definiert dabei eine Freigabe. Beispielhaft gebe ich hier meine Streaminginhalte für ein ganzes Netzwerk frei:

/var/streaming 192.0.2.0/24(rw,no_root_squash,nohide)

Nachdem die Konfiguration erstellt wurde, muss sie noch aktiviert werden. Dies wird durch den folgenden Befehl erreicht:

exportfs -a

Wenn nicht irgendwelche Sicherheitseinstellungen im Weg sind (defaultmäßig sind sie das auch nicht) kann man jetzt aus dem Netz 192.0.2.0/24 auf den Ordner /var/streaming lesend und schreibend zugreifen. Zugriffsrechte natürlich vorausgesetzt.

Apropos Zugriffsrechte: Beim Zugriff auf den Server werden nicht Benutzernamen und Password übertragen sondern die ID-Nummern des am Client angemeldeten Benutzers und dessen Gruppen. Das heißt, selbst wenn es auf Server und Client Benutzer mit gleichem Namen gibt bedeutet das nicht, dass diese auch als gleich angesehen werden. Zentrale Benutzerverwaltung oder wenigstens synchrone Benutzerdatenbanken auf mehreren Systemen sind aber ein anders Thema. Wenn es zwar zu einer Verbindung kommt, aber der lesende oder schreibende der Zugriff trotzdem verweigert wird, sollte man untersuchen wie die Dateirechte gesetzt sind und ob man wirklich der ist der man glaubt zu sein.

Windows PC

Um mit Windows 7 auf NFS zuzugreifen braucht man leider die umfangreichste Version namens Ultimate oder alternative Software. Ehrlich gesagt hab ich aber keine Lust mehr letztere zu suchen, nachdem ich mehrere Artikel zu Windows 7 gelesen habe, in denen keiner darauf hingewiesen hat, dass es für die integrierte Lösung nun mal Ultimate sein muss.

Ubuntu Notebook

Ähnlich einfach wie unter Debian lässt sich NFS auch unter Ubuntu installieren. Für den Clientbetrieb benötigt man aber nur das Paket nfs-common:

apt-get install nfs-common

Nach der Installation kann man die Freigabe auf dem Client einhängen. Dazu verwendet man passend zur obigen Freigabe auf dem Server mit der IP-Adresse 192.0.2.2 folgenden Befehl:

mount 192.0.2.2:/var/streaming /media/streaming 

Wenn der Client aus dem Netzwerk 192.0.2.0/24 stammt, finden sich jetzt die Inhalte des Serververzeichnisses unter /media/streaming. Anderenfalls wird der Zugriff durch den Server verweigert bis wir dort die Datei /etc/exports entsprechend erweitern.

Das Mounten von Hand ist natürlich auf Dauer etwas lästig. Daher kann man in der Datei /etc/fstab einen Eintrag hinterlegen der dafür sorgt das, dass Verzeichnis beim Starten des Computers automatisch gemountet wird:

192.0.2.2:/var/streaming /media/streaming  nfs rw,rsize=8192,wsize=8192,hard,intr 0 0

Mit dieser Zeile erreicht man dasselbe wie mit dem Mount-Befehl von vorher – nur immer gleich beim Starten des Systems.

Da ich hier aber von einem Notebook ausgehen und ich damit öfter unterwegs bin, habe ich dieses Vorgehen etwas modifiziert. Mittels einer kleinen Änderung in der etc/fstab verhindere ich das automatische Einhängen des Systems:

192.0.2.2:/var/streaming  /media/streaming  nfs rw,user,noauto,rsize=8192,wsize=8192,hard,intr  0 0

Wie der geneigte Leser sicherlich schon vermutet verhindert noauto das automatische Mounten. Mittels user wird das Mounten dieser Freigabe auch normalen Benutzern erlaubt. Damit verkürzt sich der Mount-Befehl schon mal um einige Zeichen:

mount /media/streaming

Aber richtig komfortabel wird es durch ein kleines Script das immer dann ausgeführt wird, wenn das Notebook sich mit meinem Heimnetzwerk verbindet. Dies wird möglich, da der Network Manager von Ubuntu jedes Mal, wenn eine Verbindung aufgebaut oder getrennt wird, die Scripte im Ordner /etc/NetworkManager/dispatcher.d/ aufruft und dabei Informationen über die betroffene Verbindung mitgibt.

Um nun die Verbindung zur Netzwerkfreigabe zu steuern muss als erstes eine Datei unter obigem Ordner angelegt werden. Diese muss root gehören und ausführbar sein. Bei der Benennung ist zu berücksichtigen, dass die Scripte in der Reihenfolge ausgeführt werden, die ihrer lexikalischen Ordnung entspricht.

Das Script verwendet zur Identifizierung des richtigen Netzwerks dessen UUID. Diese vom Netzwerkmanager vergebene Identifizierung erhält man indem man, den Inhalt des Ordners /etc/NetworkManager/system-connections/ einsieht. Dort findet man für jede bestehende Verbindung eine Datei. In dieser sind einige Daten zu der jeweiligen Verbindung hinterlegt, unter anderem die UUID. Das Script selbst prüft die UUID jeder neuen Verbindung und wenn es sich dabei um das gewünscht WLAN handelt führt es den mount-Befehl aus. Beim Beenden einer Verbindung hingegen wird geprüft, ob der Mount-Point eingehängt ist und trennt diesen bei Bedarf.

#!/bin/sh -e
# Script to Unmount and Mount NFS-Shares connecting special WLANs
#

UUID="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
MOUNTPOINT="/media/streaming"

#Parameter 2 enthält das Event das zum Aufruf des Scripts geführt hat.
case "$2" in 
   up) #neue Verbindung geöffnet
	if [ "$CONNECTION_UUID" = "$UUID" ] ; then
		mount $MOUNTPOINT
	fi
	;;

   down) #Verbindung geschlossen
	if mount | grep "on $MOUNTPOINT type" > /dev/null ; then
		umount -f $MOUNTPOINT
	fi
        ;;
esac

Seit dem Update auf Ubuntu 11.10 werden Einträge in der /etc/fstab wie sie hier verwendet werden in dem Dateimanager Nautilus als Geräte angezeigt. Durch einen Klick auf diese “Geräte” werden diese gemountet. Das führt aber zu einem Fehler da das NFS-Verzeichnis ja bereits über das Script ins Dateisystem eingehängt wurde. Um diesem Fehler entgegenzuwirken kann man den Mountpoint für das NFS-Verzeichnis nach /mnt/ verschieben oder eben auf das Script verzichten.

NeoTV 550

Das NeoTV 550 von Netgear ist eine Set-Top-Box, die Video- und Audioinhalte aus dem LAN auf den Fernseher oder die Stereoanlage überträgt. Die Inhalte können auf verschiedene Arten bereitgestellt werden. Eine davon ist NFS. Problematisch ist hierbei lediglich das Menü. Um hier zurecht zu kommen, brauchte ich einige Zeit. Die Symbole sind teilweise zu klein und einzelne teilweise recht versteckt. Eine NFS-Verbindung richtet man im Menü unter EinstellungenMedienspeicherortMedienquellen auswählenEs werden keine Medien angezeigtMedienspeicherort manuell hinzufügen ein. Wenn man dort angekommen ist, muss man als Typ NFS wählen, die IP unter Server oder IP sowie den Pfad auf dem Server unter Freigabename angeben. Darüber hinaus kann man mittels Display as einen Namen Vergeben und Anmeldedaten unter Benutzer und Passwort angeben. Wenn man das erst einmal soweit eingerichtet hat, sollten eigentlich die Inhalte unterhalb der Einträge Photo, Musik und Video im Menü auftauchen. Ab hier funktioniert der Betrieb dann reibungslos und zu meiner Zufriedenheit.