NFS-Server auf einem Raspberry Pi installieren und einrichten

Als Video ansehen
Bereitgestellt über YouTube

NFS-Server auf einem Raspberry Pi installieren und einrichten

Das Network File System (kurz NFS) ist ein standartisiertes, offenes Protokoll, um über das Netzwerk auf Dateien zuzugreifen. Im Gegensatz zu FTP oder SFTP werden diese nicht vom Server auf den Client übertragen. Man kann dadurch auf Dateien des Servers so zugreifen, als wären sie lokal. Programme können dadurch ihre Daten per NFS direkt auf einem Server speichern, ohne dass das Programm diese Funktion ausdrücklich unterstützen muss. Es ist vergleichbar mit SMB unter Windows.

Wofür NFS einsetzen?

NFS ist vergleichsweise einfach und setzt ursprünglich keine Benutzerauthentifizierung ein, dies änderte sich erst vergleichsweise spät in Version 4. Stattdessen war das ursprüngliche Konzept, den Zugriff auf Clients zu beschränken – also Hostname bzw. IP-Adresse eines Clients oder Servers. Das hat seine Vor- und Nachteile, je nach Anwendungsfall. Grundsätzlich würde ich mir aber auch die Frage stellen, ob ein klassischer Dateiserver noch das beste Werkzeug ist – unabhängig ob man das offene NFS oder für die Windows-Welt eher SMB einsetzen möchte. Es lohnt sich, eine private Cloud wie z.B. Nextcloud als Alternative zumindest in Betracht zu ziehen.

Sinn kann es dagegen beispielsweise als zentraler persistenter Speicher für Kubernetes machen. Uneingeschränkt empfehlenswert ist es auch für wenig sensible Dateien, die man innerhalb eines Netzwerkes allen zur Verfügung stellen möchte. Etwa Installationsdateien. Hierzu sei erwähnt, dass es – vor allem für Kubernetes – einige Alternativen gibt. Für erste Erfahrungen bietet sich NFS durch seine Einfachheit an. Wer sich unsicher ist, kann mit folgendem Artikel auch einfach erst einmal Praxiserfahrung in einer Testumgebung sammeln.

NFS-Server in Version 3 auf dem Raspberry Pi installieren

Im folgenden konzentrieren wir uns auf die ältere, einfachere Version 3, die auf Maschinenebene arbeitet. Die Installation selbst ist vergleichsweise einfach. Wie immer sollten wir zunächst alle Paketquellen aktualisieren, um dann das benötigte Paket nfs-kernel-server zu installieren.

sudo apt update
sudo apt upgrade
sudo apt install nfs-kernel-server

Erstellen der ersten Ordnerfreigabe

Damit unser NFS-Server eine Funktion erfüllen kann, müssen wir mindestens eine Freigabe anlegen. Dies kann entweder ein bestehender Ordner im Dateisystem sein, oder ein neu erstellter. Im folgenden erstellen wir beispielhaft einen neuen:

mkdir /home/pi/nfs-share

Wichtig ist, dass die Berechtigungen stimmen. Wir verwenden im folgenden den Standardbenutzer pi. Vor allem wenn der Ordner bereits existiert, sollte sichergestellt werden, dass der Pi entsprechende Berechtigungen darauf besitzt:

sudo chown pi:pi /home/pi/nfs-share

Damit wir später den entsprechenden Benutzer für Änderungen seitens der NFS-Clients setzen können, müssen wir in Erfahrung bringen, welche Id der Nutzer (hier pi) besitzt. Dies lässt sich mit dem Befehl id umsetzen. Sind wir als der entsprechende Benutzer angemeldet, benötigt es keine Parameter. Ansonsten kann man den Benutzername übergeben:

$ id pi
uid=1000(pi) gid=1000(pi) ...

Benutzer und gleichnamige Gruppe haben hier also die Id 1000. Das notieren wir uns für die Erstellung der Freigabe in der Datei /etc/exports. Diese mit einem Texteditor nach Wahl öffnen, für Anfänger empfiehlt sich nano:

sudo nano /etc/exports

Darin befinden sich ein paar Hinweise, wie die Freigabeeinträge aussehen müssen. Alle Zeilen mit Raute (#) am Anfang sind Kommentare, sie werden vom Programm ignoriert. Der grundsätzliche Aufbau einer v3 Freigabe (= Authentifiziert eine Maschine) lautet

/pfad/zur/freigabe hostname1(optionen)

Statt dem Hostname kann auch eine IP-Adresse angegeben werden. Als Optionen sollten wir mindestens rw (Read + Write = Schreibrechte) oder ro (Readonly) übergeben. Nicht zwingend erforderlich aber empfehlenswert ist, mit all_squash die Eigentümer auf anonuid und anongid zu setzen. Hier geben wir die zuvor ermittelte User (1000) und Gruppen-Id (1000) aus dem id Befehl an. Wird eine Datei von einem Client per NFS erzeugt oder angelegt, steht somit unser Pi-Benutzer als Eigentümer darin.

/home/pi/nfs-share vmanjaro(rw,subtree_check,anonuid=1000,anongid=1000,all_squash)

Der Client mit dem Hostname vmanjaro darf damit auf /home/pi/nfs-share schreibend zugreifen. Optional können wir im Format hostname(optionen) mit einem Leerzeichen getrennt weitere Hosts oder IPs angeben, um einem weiteren Server/Client auf diesen Ordner zu berechtigen. Möchte man eine Freigabe für JEDEN Client im Netzwerk freigeben, lässt sich der Hostname durch einen Stern * ersetzen. Dies sollte man allerdings mit Bedacht einsetzen!

subtree_check ist bei Teilfreigaben eines Dateisystemes sinnvoll. Es prüft, ob die angeforderte Datei tatsächlich im angegebenen Unterordner liegt. Sicherheitstechnisch ist das sinnvoll, aber es hat zwei Nachteile: Zum einen reduziert die Prüfung die Performance. Zum anderen kann dies in bestimmten Konstellationen Probleme machen. Etwa wenn Dateien umbenannt werden und sich diese auf einem Client noch im Zugriff befinden (z.B. in einem Programm geöffnet).

Mit no_subtree_check kann man dies abschalten. Wenn es (durch häufiges Schreiben) Probleme gibt oder ein gesamtes Dateisystem freigegeben wird, kann dies sinnvoll sein.

Damit diese Freigabe wirksam wird, folgenden Befehl ausführen:

sudo exportfs -ra
# Auflisten aller Freigaben:
# sudo exportfs -v

Falls der Ordner unserer Freigabe leer ist, können wir eine Testdatei anlegen, die der Client später sieht:

touch /home/pi/nfs-share/testdatei-auf-dem-pi

Zugriff auf die Freigabe mit einem Linux-Client

Unter Linux muss nichts installiert werden – alle Werkzeuge sind standardmäßig vorhanden. Hier können wir uns mit showmount anzeigen lassen, welche NFS-Freigaben ein Server bereitstellt:

$ sudo showmount -e testpi
Export list for testpi:
/home/pi/nfs-share vmanjaro.fritz.box

Hier taucht unsere Freigabe auf, das ist ein gutes Zeichen. Wir legen auf dem Client einen Ordner an und mounten den freigegebenen Ordner:

mkdir pi-nfs
sudo mount testpi:/home/pi/nfs-share pi-nfs
$ ls -lh pi
insgesamt 0
-rw-r--r-- 1 daniel autologin 0  5. Sep 00:45 testdatei-auf-dem-pi

Wir sehen die zuvor auf dem Pi erstellte Testdatei. Wurde die Freigabe am NFS-Server mit rw (Schreiben + Lesen) erstellt, kann der Client nun auch Dateien erstellen oder ändern.

NFS-Freigabe automatisch & permanent über die /etc/fstab einhängen

Möchte man die Freigabe auf dem Client automatisch beim Systemstart einhängen, ist dies über die Datei /etc/fstab möglich:

testpi:/home/pi/nfs-share /home/daniel/pi nfs rsize=8192,wsize=8192 0 0

testpi ist der Hostname (alternativ IP-Adresse) des NFS-Servers, nach dem Doppelpunkt folgt der dortige Pfad. Auf dem Client wird nach /home/daniel/pi gemountet, der Order muss ggf. angelegt werden, falls noch nicht geschehen. nfs ist der Typ des Dateisystemes. rsize und wsize geben die Puffergröße für Lese- bzw. Schreiboperationen an. Diese Optionen sind optional, können jedoch die Leistung verbessern.

Um den Eintrag zu testen, hängen wir die darin definierten Mounts ein:

sudo mount -a

Sofern hierbei keine Fehler auftreten, sollte der NFS-Server im jeweiligen Pfad nun zur Verfügung stehen.

Zugriff auf die Freigabe mit einem Windows-Client

Standardmäßig unterstützt Windows 10 kein NFS, dies kann aber einfach nachinstalliert werden. Dazu im Startmenü nach „Features“ suchen und „Windows-Features aktivieren oder deaktivieren“ starten:

Es öffnet sich ein kleines Fenster. Darin nach „Dienste für NFS“ suchen und dies ausklappen. Darunter befindet sich „Client für NFS“, dieser Eintrag ist standardmäßig nicht aktiviert. Setzt links einen Haken und bestätigt mit OK. Dadurch installiert Windows die Funktionalität.

Nun benötigen wir ein Windows Explorer-Fenster und geben in die Adresszeile oben \\testpi ein, wobei testpi durch den Hostname oder die IP-Adresse des Raspberry Pi zu ersetzen ist. Ihr solltet nun alle Freigaben sehen, in diesem Beispiel die zuvor eingerichtete nfs-share Freigabe im Homeverzeichnis des Pi-Benutzers:

Gerade beim ersten Aufruf kann dies einige Sekunden dauern. Öffnet man diese Freigabe, sollten die darin enthaltenen Dateien und Ordner sichtbar sein. Hier sind das die Testdateien, welche zuvor auf dem Pi und Linux-Client angelegt wurden.

So könnt ihr Dateien unter Windows auf dem NFS-Server ändern

Nun lassen sich Dateien lesen und neue Anlegen. Falls auf dem NFS-Server die Freigabe mit RW erfolgte, erscheint beim Ändern bereits vorhandener Daten jedoch eine Schreibschutz-Fehlermeldung. Während dies unter Linux standardmäßig kein Problem ist, erfordert Windows mehr Konfigurationsarbeit: Zunächst müssen wir zwei Schlüssel in der Registry anlegen. Dazu öffnen wir den Registrierungseditor, etwa über die Suche im Startmenü. Darin folgenden Pfad öffnen:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default

Seit Windows 10 muss man nicht mehr mühsam in diesen Pfad klicken sondern fügt ihn in die weiße Adresszeile oben ein und drückt Enter. Darin zwei Schlüssel anlegen, jeweils vom Typ DWORD (32-Bit). Dazu macht ihr einen Rechtsklick im rechten Bereich:

Die zwei Schlüssel heißen AnonymousUID und AnonymousGID. Sie werden auf die Benutzer- und Gruppen-Id gesetzt, die wir zuvor auf dem Raspberry Pi ermittelt haben. In diesem Fall ist das jeweils 1000. Achtung: Rechts bei Basis Dezimal auswählen!

Schlussendlich sollten beide Einträge ähnlich wie im folgenden Beispiel vorhanden sein:

Nach einem Neustart des Windows-Clients ist es noch wichtig, die Freigabe als Netzlaufwerk zu verbinden. Beim direkten Zugriff auf die Freigabe funktioniert es unter Windows nicht. Dazu öffnen wir ein Konsolenfenster (CMD) und nutzen den mount-Befehl:

> mount \\testpi\home\pi\nfs-share y:
y: ist jetzt erfolgreich mit "\\testpi\home\pi\nfs-share" verbunden.

Im Windows Explorer unter „Dieser PC“ gibt es nun ein Netzlaufwerk Y: über das ihr vollen Schreibzugriff habt.

Wichtig: Wenn ihr mit Windows schreiben möchtet, solltet ihr unseren Artikel zur Problematik mit Sonderzeichen (v.a. Umlauten) ebenfalls anschauen!

Weitere Überlegungen

  • Abhängig von der Nutzung machen möglicherweise noch weitere Konfigurationsoptionen Sinn. Details hierzu finden sich in der Dokumentation, etwa in der Manpage von nfs.
  • Soll ein Client verschiedene Berechtigungen besitzen (= Benutzer-Authentifizierung), kann dies mit SMB Version 4 umgesetzt werden. Allerdings ist dies komplizierter.
  • SMB ist eine mögliche Alternative. Die Authentifizierung auf Benutzerbene ist hier von Anfang an eingebaut. Vor allem unter Windows ist es das Protokoll für Netzwerkfreigaben, welches standardmäßig unterstützt und genutzt wird.
  • Eine mögliche Alternative ist eine eigene, private Cloud – beispielsweise mit der kostenfreien und quelloffenen Software Nextcloud. Dadurch ist man unabhängiger, hat zusätzliche Möglichkeiten (z.B. Versionierung) sowie kann auf die Daten von jedem Endgerät aus zugreifen. Auch die Nutzung über das Internet ist möglich, was bei NFS, SMB & co. eher unsicherer ist und daher nicht empfohlen wird.
  • Als Datenspeicher sollte man eine Festplatte in Betracht ziehen, z.B. extern per USB angeschlossen. Die Speicherkapazität von SD-Karten ist begrenzt, außerdem sind sie nicht für viele Schreibzugriffe ausgelegt.

Leave a Reply