An unserer Schule haben wir etwas mehr als 150 Computerarbeitsplätze. In der Regel sind auf all diesen Computern zwei lokale Benutzer aktiv – Der Administratoraccount , dessen Zugangsdaten nur ein paar wenige Personen wissen und der Schüler/Lehrer-Account. Wie der Name schon sagt arbeiten die Schüler-/LehrerInnen mit diesem Account. Damit alle immer die gleiche Umgebung vorfinden, unabhängig davon was der vorherige Benutzer am PC gemacht hat, „heilen“ sich die Arbeitsstationen von selbst.

Technische Lösungen dazu gibt es mehrere. Wie wir es konkret umsetzen möchte ich hier beschreiben.

OverlayFS

Unter Linux gibt es das sogenannte OverlayFS. Es ermöglicht das Zusammenfassen mehrer Einhängepunkte (mount points) zu einem. Dieses Bild verdeutlicht das Prinzip:

https://commons.wikimedia.org/wiki/File:OverlayFS_Image.png

Das untere Verzeichnis (/home/schueler) ist nur lesbar und wird bei der 1. Installation entsprechend bespielt. Das obere Verzeichnis ist beschreibbar und ergibt mit dem unteren Verzeichnis das Overlay.
Die Umsetzung erfolgt in der Datei /etc/fstab mit folgendem Eintrag

none /home/schueler overlay lowerdir=/home/schueler,upperdir=/home/.schueler_rw,  workdir=/home/work 0 0

Das workdir wurde noch nicht erklärt: „The workdir option is required, and used to prepare files before they are switched to the upper dir in an atomic action (the workdir needs to be on the same filesystem as the upperdir).“

Das interessante an dem Eintrag ist, dass der Overlay-Einhängepunkt /home/schueler ist. Das heißt ich nehme /home/schueler, setze ein beschreibbares Verzeichnis darüber und hänge das ganze dann unter /home/schueler ein.
Mit Teil eins wird somit das Verzeichnis /home/schueler vor Veränderungen geschützt. Teil zwei muss jetzt den beschreibbaren Teil zu bestimmten Ereignissen löschen.

Das Skript zum Löschen sieht wie folgt aus

#!/bin/bash
cd /home/.schueler_rw && find . -maxdepth 1 -mindepth 1 $zusatz -print0|xargs -0 rm -rf
mount -o remount /home/schueler

Derzeit werden die Daten bei einem Reboot gelöscht. Dazu habe ich einen shutdown.hook installiert (shutdownhook.service).

[Unit]
Description=script that is executed on shutdown/reboot

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/usr/local/bin/cleanup-schueler.sh

[Install]
WantedBy=multi-user.target

und entsprechend verlinkt:

ln -s /etc/systemd/system/shutdownhook.service /etc/systemd/system/multi-user.target.wants/shutdownhook.service

Unter Xenial (16.04) wurde auch bei einem Login/Logout gelöscht. Dies wurde einfach mit einem session-setup-script bzw. session-cleanup-script in der /etc/lightdm.conf umgesetzt.

Unter Bionic Beaver (18.04) müsste das unter
/etc/gdm3/PostSession/Default bzw.
/etc/gdm3/PreSession/Default
geschehen. Wir haben das aber nicht umgesetzt, weil die Schüler-/LehrerInnen den PC immer ausschalten (sollten).

Mit diesen paar Zeilen werden die PCs nach einem Reboot immer in den ursprünglichen Zustand versetzt bzw. „geheilt“. Es ist egal ob Dateien am Desktop bleiben, Passwörter im Browser gespeichert wurden, das Hintergrundbild geändert wurde. Alle Schüler-/LehrerInnen finden immer die gleiche Umgebung vor.

Jetzt stellt sich vielleicht noch die Frage. Wie kann man dauerhaft Änderungen in /home/schueler vornehmen? Das geht sehr einfach. Bevor ich mich als Benutzer „schueler“ anmelde führe ich den Befehl „umount /home/schueler“ aus. Das hebt den Overlay auf. Jetzt logge ich mich als schueler ein, führe die dauerhaft gewünschten Änderungen durch. Nach einem Reboot oder händischen Einhängen (mount -t overlay -o lowerdir=/home/schueler,upperdir=/home/.schueler_rw,workdir=/home/workdir none /home/schueler) des Overlays sind die Änderungen wieder geschützt.


1 Kommentar

Thomas Weissel · 21.01.2020 um 10:09

Danke für diese saubere Lösung! Ich werde sie in der nächsten Version meines LiFE Images als Option anbieten! Derzeit wird einfach ein Backup der Konfigurationsdateien mit rsync drübergeschrieben 😉
Lg Thomas

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert