Contact us
Leave a message

Bitte benutzen:

Mein öffentlicher Kryptographie-Schlüssel


Mitglied bei

Überall zu Hause

Inzwischen sind wir ja ein komplett Windows-freier Haushalt, und alle unsere Linux-basierten Familien-PCs (Desktops, Laptops, Steam-Deck...) werden per ansible so konfiguriert, dass alle Familienmitglieder überall die gleiche Umgebung vorfinden. In jedem Home-Verzeichnis gibt es einen Roaming-Unterordner, in den ein nutzer*innen-spezifisches Verzeichnis auf dem Home-Server eingeblendet wird.

Die Herausforderung...

Der Remote-Mount erfolgt per sshfs. Die Frage ist nun: Unter welchem Namen und über welchen Port soll der Server angesprochen werden?

  • Über den Host-Namen, den der Server im lokalen Netzwerk hat? Das ist sicher die schnellste Verbindung, funktioniert aber nicht, wenn man z. B. mit dem Laptop woanders unterwegs ist.
  • Über den Domänen-Namen und Port, über den der Server aus dem Internet erreichbar ist? Das funktioniert immer, erzwingt aber auch innerhalb des LANs einen Roundtrip durch's Internet über die lahme Verbindung nach draußen.

...und die Lösung

Wie wäre es, wenn je nachdem, in welchem Netzwerk der Rechner gerade angemeldet ist, die jeweils passend Verbindung automatisch ausgewählt werden würde? Genau das tut server-mount.py!

Gedacht ist das Skript als Handler, der vom NetworkManager aufgerufen wird, sobald sich etwas am Netzwerk-Status des Systems ändert, es lässt sich aber auch prima als periodisch laufender systemd-Service benutzen. Für ersteres wird es in /etc/NetworkManager/dispatcher.d verlinkt, z. B. als 99-server-mount.py, in letzterem Falle installiert man das beigelegte server-mount.service-File.

Bei jeder Netzwerk-Verbindung oder -Trennung spielt sich dann Folgendes ab:

  • Das Skript geht alle konfigurierten Netzwerk-Verbindungen -- jeweils charakterisiert durch Host-Namen, Port und Pfad zum Verzeichnis, das die Roaming-Ordner der User*innen enthält -- durch und testet per ping, ob der Server unter dem jeweiligen Host-Namen erreichbar ist.
  • Beim erste Host-Namen, der erreichbar ist, wird die Suche abgebrochen.
  • Alle anderen Host-Namen werden durchgegangen; für jeden Hostnamen wird für jede*n User*in geprüft, ob eventuell noch ein Remote-Mount existiert. Falls ja, wird der Mount ausgehängt.
  • Wurde ein erreichbarer Host-Namen gefunden, wird für jede*n User*in ein entsprechender Mount eingerichtet, sofern noch kein solcher existiert.

Konfiguration

Das Skript erwartet eine Konfigurations-Datei namens server-mount.json an einem der drei folgenden Orte:

  • dem aktuellen Arbeitsverzeichnis
  • dem Verzeichnis, in dem das Skript liegt
  • /etc

Die Konfigurations-Datei hat folgende Struktur:

{
	"networks": [
		{
			"host": "host_in_local_network",
			"port": 22,
			"root": "/home"
		},
		{
			"host": "same_host.mydomain.net",
			"port": 2022,
			"root": "/home"
		}
	],
	"mountpoint": "roaming"
}
  • Die networks-Liste kann beliebig viele Einträge enthalten.
  • Wie gesagt: Der erste funktionierende Eintrag gewinnt. Daher sollten die schnelleren Verbindungen weiter vorne stehen.
  • Bei erfolgreicher Verbindung wird für jede*n User*in das Server-Verzeichnis <root>/<username> im lokalen <user-home>/<mountpoint> eingehängt.

Zu beachten:

  • Das Skript sollte mit den nötigen Rechten laufen, um für alle Benutzer*innen Mount-Vorgänge durchzuführen. (Beim Aufruf durch den Network-Manager ist das bereits der Fall.)
  • Um eine passwort-lose Authentifizierung zu ermöglichen, müssen die öffenlichen SSH-Schlüssel aller User*innen den ~/.ssh/authorized_keys ihrer jeweiligen Server-Accounts hinzugefügt werden.
  • Skript-Ausgaben erfolgen direkt ins syslog, nicht nach stdout.

Download

Siehe meine Gitlab-Seite.