Systemd per Script mit root rechten Prüfen lass ob Netzlaufwerke gemounted sind

Hallo.

Ich mounte meine Netzlaufwerke mittels systemd. (Da gabs eine gute Anleitung)
Ab und an passiert es das die Netzlaufwerke nicht gemounted sind, habe aktuell aber keine Ahnung warum.

Dafür habe ich mir ein Script gebastellt das überprüft ob die NAS online ist und ob die Netzlaufwerke gemounted sind.
Wenn sie es nicht sind, führt es z.B. folgendes aus.

systemctl start NetMounts-NAS01-BackUp_01.mount

Jedoch braucht das Script root rechte welche ich dann manuell per passwort erteilen muss.

Jetzt habe ich die fixe Idee das irgendwie mittels systemd das permanent prüfen zu lassen ob die Netzlaufwerke gemounted sind und falls nicht diese dann automatisch mounten zu lassen.

Im moment fehlt mir der Ansatz wie das zu machen ist.

Oder eine andere Möglichkeit wie man das hinbekommt.
Ohne das ich mir das system verbiege oder durch das script bzw systemd das system langsam oder blockiert wird.

Da fehlt mir die Erfahrung mit Manjaro (linux).

Erstelle doch einfach einen Timer der einen Systemd System Service startet. Der Timer könnte z.B. 5 Minuten nach dem Booten und dann alle 20 Minuten einen Service starten. Der Service besteht einfach als Typ oneshot aus deinem Script.
Bei Systemd laufen System Services immer als root außer du definierst in der Service Datei einen anderen Benutzer.
Die Zeiten des Timers kannst du natürlich frei wählen. Allerdings sollten die nicht zu kurz sein, alle 5 Sekunden wäre wahrscheinlich etwas zu häufig.

Ein ganz simples Beispiel. Es wäre sinnvoll zumindest das Netzwerk als Abhängigkeit mit einzubauen.

mount-check.timer

[Unit]
Description=Check Mounts timer

[Timer]
OnBootSec=5min
OnUnitInactiveSec=20min
 
[Install]
WantedBy=multi-user.target

mount-check.service

[Unit]
Description=Check Mounts service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/mountscipt.sh

------ edit
Kleine Ergänzung. Du verwendest aber schon automounts? Falls nicht mach das erst und schaue ob es hilft. Für ein Dateisystem mit Netzwerk-Abhängigkeit musst du immer automounts verwenden. Nur falls das immer noch nicht funktioniert, erstelle Scripte und Timer. Und ganz wichtig, niemals die mounts einschalten (“enable”) immer nur die autmounts einschalten und starten.

Translated from English to German using translation service

Wenn die Netzwerkverbindung getrennt ist, z.B. wenn Ihr System in den Suspend-State eingetreten ist - darf es nicht erneut eingebunden werden.

Um dies zu umgehen - es wird empfohlen, Ihre Montageeinheit zu deaktivieren - und eine ergänzende automatische Montageeinheit zu verwenden.

Bei dieser Methode wird die Freigabe beim Zugriff auf den Mount-Punkt montiert und nach einem vordefinierten Timeout wieder freigegeben.

Siehe dazu [root tip] [How To] systemd mount unit samples

Vor nicht allzu langer Zeit eine etwas ähnliche Frage

Unable to "control" the mounting of servers (or other removable media) - #2 by megavolt

Also das ist der Inhalt von einer meiner mounts.

NetMounts-NAS01-Data.mount

[Unit]
Description=NetMounts-NAS01-Data

[Mount]
What=//10.10.10.100/Data/
Where=/NetMounts/NAS01/Data/
Type=cifs
Options=_netdev,iocharset=utf8,rw,file_mode=0666,dir_mode=0777,credentials=/etc/smb.cred
TimeoutSec=30

[Install]
WantedBy=multi-user.target

wenn dann der mount nicht da ist lass ich mein script laufen.
Auszug enthält nur code der für “NetMounts-NAS01-Data.mount”

Auszug aus dem Script

echo ">>Script Start<<"
echo ""
echo ""

#WOL
echo "Es wird geprüft ob die NAS Online ist"
echo ""
if ping -c 1 10.10.10.100 &> /dev/null
	then
	echo "NAS ist per ping erreichbar"
	echo ""
	else
	echo "NAS ist per ping NICHT erreichbar"
	echo "Wake On Lan wird gestartet"
	wakeonlan AA:AA:AA:AA:AA:AA

	time=210
	echo "Warte " $time "Sek auf NAS Boot"
	while [ $time -gt 0 ]
		do
		sleep 1
		((time--))

		echo "Noch: " $time " Sekunden"
	done
fi

echo "Neu laden von systemctl daemon"
echo "systemctl daemon-reload"
systemctl daemon-reload

echo ""
echo ""
echo ""

echo "Teste ob Data gemounted ist"
test=$(systemctl show -p SubState --value NetMounts-NAS01-Data.mount)
if  [ "$test" = "failed" ]
        then
        echo "Data nicht gemounted"
        echo "Es wird versucht Data zu mounten"
        echo "sudo systemctl start NetMounts-NAS01-Data.mount"
        sudo sudo systemctl start NetMounts-NAS01-Data.mount
        Data="1"

    elif [ "$test" = "mounted" ]
        then
        echo "Data bereits gemounted"
fi

echo ""
echo ""
echo ""

check="0"

if [ "$Data" = "1" ]
        then
        echo "Data wird erneut geoprüft"
        test=$(systemctl show -p SubState --value NetMounts-NAS01-Data.mount)
        echo "Status: "$test
        echo "es wird zur sicherheit versucht den Service auf enable zu setzen"
        echo "sudo systemctl enable NetMounts-NAS01-Data.mount"
        sudo systemctl enable NetMounts-NAS01-Data.mount
        check="1"
        echo ""
fi

if [ "$check" = "1" ]
then
echo "sudo systemctl daemon-reload"
sudo systemctl daemon-reload
fi

echo ""
echo "Script wurde beendet"
echo "zum verlassen des Scripts >Enter< drücken"
read tmp
exit

Das mounten und das script habe ich aus Anleitungen bzw. Beispiele erstellt.
Ob das jetzt der richtige Weg ist kann ich aus Mangel an Wissen und Erfahrung leider nicht sagen.

In der Summe sind 4 Mounts im Systemd als auch im Script.
Wegen der Länge habe ich nur die Teile für das Data Mount hier eingefügt.

In dem Fall ist das der falsche Weg. Erstelle für deine Mount-Units zusätzlich passende Automount-Units, aktivere diese (“enable”) und deaktiviere (“disable”) die normalen Mount-Units. Beim Starten werden dann die Automount-Units und wenn zugriffe auf die Daten erfolgt, werden diese erst wirklich gemountet.
Beim ersten Zugriff kann es dann wenige Sekunden länger dauern, aber dafür sie die immer Verfügbar.

@linux-aarhus hat da eine sehr gute Anleitung zu erstellt. [root tip] [How To] systemd mount unit samples

1 Like

Ok.
Habe mir die Anleitung angeschaut.
Nur habe ich da wohl ein Verständniss Problem.

Das automount im Beispiel (SMB) enthält weder “Type” noch “Options”
Werden die einfach mit eingefügt wie beim normalen mount?
Oder greift das automount auf das normale mount zu, was mir unlogisch erscheint vom Inhalt her des automount.

Stell dir eine Automount-Unit wie einen Starter für eine Mount-Unit vor. Systemd überwacht mit einer Automount-Unit den im Namen angegeben Pfad und falls ein Programm auf den Pfad bzw. Dateien in dem Pfad zugreifen will, wird von Systemd die Mount-Unit gestartet.

Eine Automount-Unit kann auch einen Timeout enthalten nach dem die Mount-Unit wieder deaktiviert wird. Das ist Optional, wird aber oft verwendet.

Damit eine Automount-Unit funktioniert muss es auch immer eine passende Mount-Unit geben. In deinen Fall gibt es dann nicht nur eine Datei in /etc/systemd/system names NetMounts-NAS01-Data.mount sondern auch noch NetMounts-NAS01-Data.automount
Am Inhalt von NetMounts-NAS01-Data.mount ändert sich nichts. Die Automount-Unit erstellst du wie in dem “How To” gezeigt.

Wichtig ist nur NetMounts-NAS01-Data.mount zu deaktivieren (“disable”)

systemctl disable NetMounts-NAS01-Data.mount 

und dann für den nächsten Computerstart die Automount-Unit zu aktiveren (“enable”)

systemctl enable NetMounts-NAS01-Data.automount

Jetzt nach dem ich dein Post gelesen habe und nochmal in die Anleitung gegangen bin habe ich dort das

Automount units starts the mount unit on demand

bestimmt das 3te mal überlesen -.- und an der falschen stelle im text nach ner erklärung geschaut.

noch mal zusammengefasst

systemctl disable NetMounts-NAS01-Data.mount
mit dem Inhalt

[Unit]
Description=NetMounts-NAS01-Data

[Mount]
What=//10.10.10.100/Data/
Where=/NetMounts/NAS01/Data/
Type=cifs
Options=_netdev,iocharset=utf8,rw,file_mode=0666,dir_mode=0777,credentials=/etc/smb.cred
TimeoutSec=30

[Install]
WantedBy=multi-user.target

erstelle mir folgende automount unit (/etc/systemd/system/)

sudo touch NetMounts-NAS01-Data.automount

mit dem inhalt

[Unit]
Description=NetMounts-NAS01-Data.automount
ConditionPathExists=/NetMounts/NAS01/Data/

[Automount]
Where=/NetMounts/NAS01/Data/
TimeoutIdleSec=10

[Install]
WantedBy=multi-user.target

setze dann diese auf

systemctl enable NetMounts-NAS01-Data.automount

Das wäre dann die korrekte Variante für diesen Fall um die Netzlaufwerke automatisch zu mounten.

So sollte das funktionieren. Am besten einfach ausprobieren.

Hi, sollte eure Lösung nicht zufriedenstellend sein, hab ich hier noch zu dem Thema einen Link.
Hier wird mittels des NetworkManager Dispatcher die Verbindung hergestellt, wenn die Netzwerkverbindung erstellt ist.
5.2 Dispatcher examples

Bin bei meinem gescheiterten Versuch mein WLAN als Fallback für mein Powerline/Ethernet zu nutzen, darüber gestopert. (Falls einer von Euch einen Tipp zu dem Thema hat, gerne her damit. Bin mittlerweile bei Netzwerk-Bonding gelandet :wink: )