Einleitung / Ziel
Die folgende Anleitung soll eine Hilfestellung geben, wie ein Netzlaufwerk mit dem Raspberry Pi erfolgreich gemountet werden kann.
Es handelt sich beispielhaft um eine Samba Netzwerkfreigabe die von einer Fritz!Box bereitgestellt wird.
Ein möglicher Weg führt über einen Eintrag in der Datei /etc/fstab. Da ich oft Probleme, mit zur Bootzeit noch nicht erreichbaren Freigaben im Netz, hatte und sich diese auch nicht mit Parametern wie _netdev lösen ließen, beschreibe ich hier jedoch den Weg mit einer Systemd Mount Unit. Auf aktuellen Systemen werden im Hintergrund die Einträge in der Datei /etc/fstab automatisch in eine Mount Unit gewandelt.
Der schnelle Weg
Um die wiederkehrende Arbeit zur Einrichtung zu erleichtern, habe ich ein kleines Hilfsskript erstellt.
https://github.com/Hofei90/create_automount
Hier kann man sich auch eine Konfigurationsdatei erstellen lassen, um bei einer zukünftigen Erstellung alles automatisiert erstellen lassen zu können. Praktisch bei einer erneuten Einrichtung oder wiederholten Einrichtung, wenn mehrere Raspberry Pi auf die Netzwerkfreigabe zugreifen sollen.
Es empfiehlt sich jedoch, den Thread trotzdem vollständig zu lesen, um auch zu verstehen was gemacht wird!
Das Skript weicht an einem Punkt ab, es verwendet ein anderes Skript um das Ziel zu pingen.
Vorbereitungen
Zum Ausführen der meisten Befehle werden root Rechte benötigt. Es empfiehlt sich, das Tutorial komplett als root umzusetzen.
Verzeichnis erstellen
Zunächst muss das Verzeichnis, auf dem später gemountet werden soll, erstellt werden. Existiert das Verzeichnis nicht, schlägt das mounten fehl.
mkdir /media/fritz_nas
Der hier vergebene Verzeichnisname kann bei Bedarf abgeändert werden, muss dann jedoch in den folgenden Pfadangaben auch angepasst werden. Außerdem ist der Pfad- und Verzeichnisname die Vorgabe für den Namen der Mount Unit.
Zugangsdaten hinterlegen
Als Nächstes werden die entsprechenden Zugangsdaten für die Authentifizierung bei der Gegenstelle (Fritz!Box) in einer Datei gespeichert. Der verwendete Benutzer muss natürlich in der Gegenstelle eingerichtet und der Zugriff auf die NAS Funktion freigegeben sein.
nano /etc/smbcredentials
Rechte der erstellten Datei an root übergeben und Zugriff beschränken:
Manuellen Mount durchführen
Vor der Erstellung des automatischen Mounts führe ich zuvor einen manuellen Mount aus, um sicher sein zu können, dass die Verbindung zum Netzlaufwerk mit den übergebenen Optionen prinzipiell funktioniert.
mount -t cifs -o credentials=/etc/smbcredentials,uid=1000,gid=1000 //192.168.178.1/fritzbox/ /media/fritz_nas
Erfolgreichen Mount mit df überprüfen.
Hinweis: Im Beispiel wird eine Freigabe der Fritz!Box gemounted.
Ist die Firmware der Fritzbox < Fritz!OS V7.2 so wird nur die smb Version 1.0 unterstützt.
In diesem Fall muss der Mountbefehl bei den Optionen erweitert werden mit vers=1.0. Diese Option ist abhängig vom Server, der die Freigabe zur Verfügung stellt. Weiteres hier.
Muss nicht auf vers=1.0 zurückgegriffen werden, so empfiehlt es sich, diesen Parameter nicht mit anzugeben.
Verlief der Test erfolgreich, müssen wir den Mount wieder rückgängig machen:
umount /media/fritz_nas
Erstellung der Mount Unit mit Abhängigkeiten
systemd Mount Unit
Wie schon erwähnt, ist der Name der Mount Unit abhängig vom gewählten Einhängepunkt.
Mit folgendem Befehl bekommt man die Ausgabe, wie der Name der Mount Unit zu vergeben ist:
systemd-escape --suffix=mount --path <EINHÄNGEPUNKT>
In unserem Beispiel ist der Name: media-fritz_nas.mount
nano /etc/systemd/system/media-fritz_nas.mount
[Unit]
Description=Mount der fritz_nas
Requires=serverctl.service
After=serverctl.service
Conflicts=shutdown.target
ConditionPathExists=/media/fritz_nas
[Mount]
What=//192.168.178.1/fritzbox/
Where=/media/fritz_nas
Options=credentials=/etc/smbcredentials,uid=1000,gid=1000
Type=cifs
[Install]
WantedBy=multi-user.target
Display More
Abhängigkeit serverctl.service
nano /etc/systemd/system/serverctl.service
[Unit]
Description=serverctl.service: Waiting for Network or Server to be up
After=network.target
[Service]
Type=oneshot
TimeoutStartSec=95
ExecStart=/usr/local/sbin/serverctl 192.168.178.1
[Install]
WantedBy=multi-user.target
Display More
Bash Skript serverctl
nano /usr/local/sbin/serverctl
#!/bin/bash
#==============================================================================================
# serverctl by TomL*thlu.de
#
# Script-Name : serverctl
# Version : 1.0
# Date : 31.07.2017
# Lizenz : GNU GPL3
# Description : Check if given server is reachable
#==============================================================================================
[ -z "$1" ] && Server="8.8.8.8" || Server=$1
echo "active/running Server=$Server" | systemd-cat -t "thlu:`basename $0`" -p "info"
timeout=85
Diff=0
HomeNetIsConnect=-1
Start=$(date +%s);
while [ true ]; do
/bin/ping -c1 -W1 -q $Server &>/dev/null
HomeNetIsConnect=$?
[ $HomeNetIsConnect -eq 0 ] && break
/bin/sleep 0.5
End=$(date +%s);
Diff=$((End-Start))
[[ Diff -gt timeout ]] && break
done
rc=0
if [[ $HomeNetIsConnect -eq 0 ]]; then
echo "Host $Server is reachable! (RC:$HomeNetIsConnect, after $Diff Seconds wait)" | systemd-cat -t "thlu:`basename $0`" -p "info"
else
echo "Host $Server is not reachable! (RC:$HomeNetIsConnect, after $Diff Seconds wait)" | systemd-cat -t "thlu:`basename $0`" -p "err"
rc=1
fi
echo "Successful terminated with exitcode=$rc" | systemd-cat -t "thlu:`basename $0`" -p "info"
exit $rc
Display More
Kurze Erklärung
Die IP Adressen sind bitte den entsprechenden eigenen IP Adressen anzupassen.
Das bash Skript, welches durch serverctl aufgerufen wird, prüft, ob das Ziel erreichbar ist. Wenn ja, gibt serverctl grünes Licht, womit die Mount Unit die Freigabe bekommt, um den Mount auszuführen. Wer die einzelnen Befehle in den Units genau erklärt haben möchte, den verweise ich an diese Stelle an den Punkt Nützliche Links.
Rechte anpassen
Anschließend passen wir die Rechte für die erstellten Dateien an:
chown root:root /usr/local/sbin/serverctl /etc/systemd/system/serverctl.service /etc/systemd/system/media-fritz_nas.mount
chmod 644 /etc/systemd/system/serverctl.service /etc/systemd/system/media-fritz_nas.mount
chmod 755 /usr/local/sbin/serverctl
Inbetriebnahme
Mount Unit testen
Nun starten wir den Mount über die Mount Unit:
systemctl start media-fritz_nas.mount
Ob das ganze erfolgreich verlief, kann wieder mit df oder mittels systemctl status media-fritz_nas.mount überprüft werden
Damit das ganze nun abschließend bei jedem Systemstart ausgeführt wird, muss die Mount Unit enabled werden:
systemctl enable media-fritz_nas.mount
Ab diesem Punkt wird bei jedem Neustart die Freigabe automatisch eingehängt.
Problembehandlung
Kommt es zu Fehlern beim Mounten, so ist es unbedingt notwendig vor einem erneuten Versuch das Ziel mittels umount /media/fritz_nas wieder auszuhängen.
Bekannte Fehler
- Bei Zugriff auf eine Datei im gemounteten Ordner kommt die Meldung: "<Dateiname> kann nicht zum Lesen geöffnet werden: Veraltete Dateizugriffsnummer (file handle)"
Lösung: Options ergänzt mit Parameter noserverino
Nützliche Links
Wo funktioniert es?
Tutorial wurde am 26. August 2018 erstellt
Zuletzt wesentlich angepasst: 12. Januar 2021
Getestet auf folgenden Systemen:
- Linux Mint 19 Tara
4.15.0-33-generic #36-Ubuntu SMP Wed Aug 15 16:00:05 UTC 2018 x86_64 x86_64 x86_64 GNU/Linu - Raspbian 9 Stretch
4.14.52-v7+ #1123 SMP Wed Jun 27 17:35:49 BST 2018 armv7l GNU/Linux - Raspbian 10 Buster
5.4.72-v7+ #1356 SMP Thu Oct 22 13:56:54 BST 2020 armv7l GNU/Linux
Danksagung
Ein spezieller Dank geht von mir an ThomasL , von ihm stammt die serverctl Datei und das zugehörige Bash Skript.
Außerdem für die Ermittlung des notwendigen Aufbaus der Mount Unit.
Ebenfalls Danke an STF der das Tutorial Korrekturgelesen hat und es besser lesbar gemacht hat
Weiteres
Es wird immer hier der Beitrag #1 aktuell gehalten bei neuen Erkenntnissen.
Konstruktive Kritik und Anmerkungen zum Tutorial sind hier im Thread gerne willkommen. Sollte es aber Probleme bei der Umsetzung des Ganzen geben, so bitte ich darum, dass du für deine Fragen/Probleme einen separaten Thread eröffnest.