Netzlaufwerke einbinden

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen
Wiki ‹ Netzwerk ‹ Netzlaufwerke einbinden


Getestet.png Getestet: Dieser Hinweis soll dir dabei helfen, zu entscheiden, ob dieser Artikel auf deinem System funktionieren wird oder nicht. Solltest du feststellen, dass dieser Artikel bei einer ungetestet Version funktioniert, kannst du das gerne hier korrigieren oder im Forum anmerken.




Ein simpler Mount von Netzwerk-Dateisystemen über die fstab ist oftmals nicht sinnvoll, da das Netzwerk mitunter erst nach dem Einhängen der Dateisysteme bereitsteht oder vor dem Aushängen derselben getrennt wird. Dies kann zu störenden Verzögerungen beim Hoch- oder Herunterfahren des Rechners führen. Deshalb ist es besser über das Netzwerk bereitgestellte Dateisysteme (SMB, NFS und weitere) automatisiert ein- und aushängen lassen.

Eine elegante Lösung ist, die Dateisysteme erst nach Verfügbarkeit des Netzwerks einzuhängen bzw. erst dann, wenn auf sie zugegriffen wird. Dies kann über systemd-Automounts umgesetzt werden. Automounts machen ältere Verfahren wie autofs überflüssig.

Alternativ können bei Nutzung von NetworkManager sog. Dispatcher-Skripte ereignisgesteuert ausgeführt werden, die das Ein- oder Aushängen von Netzwerk-Dateisystemen bewirken.

Verwendung von systemd-Automounts

Ein systemd-Automount bewirkt, dass das tatsächliche Einhängen erst in dem Moment passiert, in dem auf den Mountpoint zugegriffen wird. Umgekehrt kann man über einen Automount steuern, dass nach einer bestimmten Zeitspanne ohne Zugriff ein automatischer Umount erfolgt.

Wichtig: auch wenn der Automount in dem Moment wirksam wird, in dem ein normaler User auf den Mountpoint zugreift, handelt es sich um eine systemd-System-Unit. Man benötigt sowohl für das Schreiben in /etc/systemd/system/ als auch für das enablen/starten der Unit root-Rechte.

Zusammengefasst brauchen wir:

  • eine Mount-Unit, die beschreibt, wie und und unter welchem Mountpoint das Dateisystem eingehängt wird,
  • und eine Automount-Unit, die bei Zugriff auf den Mountpoint die Mount-Unit startet.

Das bedeutet, dass die Automount-Unit, nicht aber die Mount-Unit enabled wird.

Mount und Automount lassen sich in der /etc/fstab auch in einer Zeile definieren, die Definition über separate Units ist jedoch übersichtlicher.

Mount-Unit

Im folgenden werden Beispiele für Mount-Units gezeigt. Eine Mount-Unit hat nicht die Endung .service, sondern .mount. Der Name der Unit muss dem Namen des Mountpoints entsprechen, wobei bestimmte bestimmte Zeichen ersetzt werden müssen. Am einfachsten ist es, das Tool systemd-escape zu verwenden, um den Unit-Namen eines Pfades zu erzeugen.

Beispiel:

$ systemd-escape -p /home/user/VirtualBox\ VMs/
home-user-VirtualBox\x20VMs

Die Mount-Unit für den Pfad /home/user/VirtualBox VMs/ muss also home-user-VirtualBox\x20VMs.mount heißen. \x20 ist die Codierung des Leerzeichens.

Mount- und Automount-Units werden üblicherweise in /etc/systemd/system/ abgelegt, wofür root-Rechte benötigt werden. (Die unter /lib/systemd/system/ abgelegten Units stehen unter Kontrolle des Paketmanagements, daher sollte man dort keine Units manuell anlegen.) Bei Änderungen an Units muss man systemd über systemctl daemon-reload dazu bringen, veränderte Units zu erkennen, ggf. ist auch ein Neustart einer veränderten Unit erforderlich. Da es sich um systemd-System-Units handelt, sind auch dafür root-Rechte erforderlich. Der grundsätzliche Aufbau von Mount-Units wird in der Manpage 5 systemd.mount beschrieben.

Wichtig: die Mount-Unit wird nicht enabled, da sie bei Bedarf von der Automount-Unit gestartet werden soll.

Mount-Unit für NFS

Eine Mount-Unit mnt-datengrab.mount, die NFS-Exporte des Servers datengrab unter /mnt/datengrab einbindet, sieht folgendermaßen aus:

[Unit]
Description=Mount /mnt/datengrab via NFS

[Mount]
What=datengrab:/
Where=/mnt/datengrab/
Type=nfs
Options=soft,nfsvers=4,async

Die Optionen für NFS werden im Artikel NFSv4-Mini-Howto beschrieben.


Mount-Unit für SMB/CIFS

Die folgende Unit mnt-datengrab-music.mount bindet die Freigabe music vom Server datengrab über SMB/CIFS ein:

[Unit]
Description=CIFS-Freigabe //datengrab/music einbinden

[Mount]
What=//datengrab/music
Where=/mnt/datengrab/music
Options=username=CIFS-Benutzername,password=CIFS-Passwort,workgroup=CIFS-Arbeitsgruppe,rw
Type=cifs

[Install]
WantedBy=multi-user.target

Unter Options müssen die Angaben zu Benutzernamen, Passwort und Arbeitsgruppe entsprechend gepflegt werden. Das Passwort kann auch aus einer Datei gelesen werden.


Automount-Unit

Die Automount-Unit startet die Mount-Unit, wenn der zugehörige Mountpoint betreten wird. Sie muss den gleichen Namen wie die zugehörige Mount-Unit haben, jedoch mit der Endung .automount. Die Automount-Unit muss enabled und gestartet werden.

Der Aufbau von Mount-Units wird in der Manpage 5 systemd.automount beschrieben.

Für die obige NFS-Mount-Unit mnt-datengrab.mount kann eine Automount-Unit mnt-datengrab.automount wie folgt aussehen:

[Unit]
Description=Automount /mnt/datengrab
Requires=NetworkManager.service
After=network-online.target
Wants=network-online.target

[Automount]
Where=/mnt/datengrab
TimeoutIdleSec=10min

[Install]
WantedBy=multi-user.target

Ab Debian 11 „Bullseye“ muss die Unit etwas anders aussehen:

[Unit]
Description=Automount /mnt/datengrab

[Automount]
Where=/mnt/datengrab
TimeoutIdleSec=10min

[Install]
WantedBy=multi-user.target

Die Angaben entsprechen im Wesentlichen denen einer „normalen” systemd-Unit, weshalb hier nicht weiter darauf eingegangen werden soll.

  • Über Where wird der Mountpoint angegeben, der überwacht werden soll.
  • Über die optionale Angabe TimeoutIdleSec kann man angeben, dass ein Umount versucht werden soll, wenn innerhalb der angebenen Zeitdauer keine Zugriffe stattgefunden haben.

Analog einer Mount-Unit wird diese Automount-Unit als root mit

# systemctl daemon-reload
# systemctl enable --now mnt-datengrab.automount

aktiviert und gestartet.

Eine Automount-Unit für die oben gezeigte CIFS-Mount-Unit muss den darin angegebenen Mountpoint Where=/mnt/datengrab/music überwachen.

Verwendung von NetworkManager-Dispatcherskripten

NetworkManager arbeitet beim Eintritt von Ereignissen die in /etc/NetworkManager/dispatcher.d/ liegenden Skripte der Reihe nach ab. Die hier maßgeblichen Ereignisse sind up und down, die nach Aktivierung bzw. Deaktivierung eines Netzwerkgerät eintreten. Der Name der Netzwerkverbindung und das Ereignis werden als Parameter übergeben und können im Skript ausgewertet werden.

Details lassen sich in der manpage 8 NetworkManager nachlesen.

 Starten/Stoppen von systemd-Automounts

Das folgende Skript startet die Automount-Unit für /mnt/datengrab, wenn Verbindung mit „Zuhause“ besteht und stoppt ihn, wenn die Verbindung getrennt wurde. Die Umgebungsvariable $CONNECTION_ID enthält nicht die SSID des WLANs, sondern den Namen der Verbindung in NetworkManager. Die zugehörige Mount-Unit wird gleichermaßen gestoppt; wenn das Dateisystem eingehängt war, wird dabei es ausgehängt. Die Automount-Unit darf nicht enabled werden. Zusätzlich werden Aufträge für einen im Netzwerk verfügbaren Drucker abgelehnt oder akzeptiert.

#!/bin/bash

# anderes WLAN: nichts tun und raus
if [ "$CONNECTION_ID" != 'Zuhause' ]; then exit 0; fi

case "$NM_DISPATCHER_ACTION" in
    'up')
        systemctl start mnt-datengrab.automount
        cupsaccept HP_LaserJet
        ;;
    'down')
        systemctl stop mnt-datengrab.automount
        cupsreject HP_LaserJet
        ;;
    *)  ;;
esac

exit 0

Alternativ kann man anstelle des Namens der Verbindung deren UUID über $CONNECTION_UUID abfragen, da der Name nicht eindeutig ist. Die UUID lässt sich über nmcli c show ermitteln.

Bei VPN-Verbindungen lauten die Actions vpn-up und vpn-down. Das Skript muss entsprechend angepasst werden.

Aus einem Dispatcher-Skript heraus lassen sich weitere Verbindungen aufbauen, so bspw. der Aufbau eines VPN bei Verbindung mit einem bestimmten WLAN.

Weitere Details zu Dispatcher-Skripten lassen sich der Manpage des NetworkManagers entnehmen.

Man kann den Drucker alternativ starten und stoppen. Dann werden Druckaufträge auch bei fehlender Verbindung angenommen und nach Aufbau der Verbindung gedruckt.

unmittelbares Mounten/Umounten

In einem Skript lässt sich analog zum obigen Beispiel eine Mount-Unit starten oder stoppen oder ein Dateisystem per mount/umount einhängen oder aushängen.