Im Folgenden wird ein „universelles“ postsync-Skript vorgestellt, das als Grundlage für Anpassungen beim linux-Client in linuxmuster.net dienen kann.
Das Skript synchronisiert zunächst den Verzeichnisbaum /var/linbo/linuxmuster-client/<patchklasse>
in den Cache des Clients.
Anschließend wird in der Reihenfoge wachsender Spezifizität der Inhalt der Unterverzeichtnisse
common
: für alle Rechner des Images<raumname>
: für alle Rechner des Raumes mit diesem Namen<hostname>
: für genau den Rechner mit diesem Namen über das ausgepackte Betriebssystem kopiert.
Die Anwendung macht man sich am besten mit einem Beispiel klar:
Man legt auf dem Server das Verzeichnis /var/linbo/linuxmuster-client/ubuntu1204/
und dort die Unterverzeichnisse common
r201
, r202
, r123
und r201-ws01
. 1)
Nun möchte man beispielsweise, dass man vom Server als root passwortlos auf alle Client gelangen kann. Dazu muss man eine passende sshd_config
Datei auf den Clients haben2) und der öffentliche Schlüssel des Benutzers root auf dem Server muss sich in der authorized_keys
-Datei des Benutzers root auf dem Client befinden.
Man passt also auf dem Client diese beiden Einstellungen an und kopiert die Dateien mit vollem Pfad anschließend auf den Server nach /var/linbo/linuxmuster-client/ubuntu1204/common
. Nach common
, weil das für alle Clients gelten soll. In der Dateiliste sind die Dateien zu sehen.
Anschließend konfiguriert man auf dem Client die Drucker, die in Raum r123
zur Verfügung stehen sollen - die Einstellungen finden sich nach der Konfiguration in der Datei /etc/cups/printers.conf
wieder. Diese kopiert man inklusive Pfad auf den Server nach /var/linbo/linuxmuster-client/ubuntu1204/r123
. Wenn in anderen Räumen andere Druckereinstellungen gewünscht sind, verfährt man ebenso. Das postsync-Skript kopiert dann die für den jeweiligen Raum passende printers.conf
ins System.
Analog werden im Beispiel unten die Drucker für r201
gesetzt, der Rechner r201-ws01
hat noch einen lokalen Drucker und weil die Dateien für einzelne Hosts zuletzt kopiert werden, werden zunächst die Einstellungen für den Raum kopiert und beim Rechner r201-ws01
danach nochmals mit der passenden printers.conf
ersetzt.
Die Rechner in Raum r201
und r202
starten mit Dualboot (Windows und Linux parallel), darum benötigen Sie eine andere fstab
, als die Maschinen die ausschließlich mit Linux bedient werden, beide verwenden aber dasselbe Image. Das Vorgehen ist wie oben: die korrekte /etc/fstab
muss mit Pfad in das jeweilige Raumverzeichnis auf dem Server in /var/linbo/linuxmuster-client/ubuntu1204/
und wird dann vom postsync Skript nach dem Synchronisieren (aber vor dem Booten) an die richtige Stelle geschrieben.
Auf dem Server stellt sich das dann so dar:
18:11/1 server /var/linbo # find linuxmuster-client/ -name '*' linuxmuster-client/ linuxmuster-client/ubuntu1204 linuxmuster-client/ubuntu1204/common linuxmuster-client/ubuntu1204/common/etc linuxmuster-client/ubuntu1204/common/etc/ssh linuxmuster-client/ubuntu1204/common/etc/ssh/sshd_config linuxmuster-client/ubuntu1204/common/root linuxmuster-client/ubuntu1204/common/root/.ssh linuxmuster-client/ubuntu1204/common/root/.ssh/authorized_keys linuxmuster-client/ubuntu1204/r201 linuxmuster-client/ubuntu1204/r201/etc linuxmuster-client/ubuntu1204/r201/etc/fstab linuxmuster-client/ubuntu1204/r201/etc/cups linuxmuster-client/ubuntu1204/r201/etc/cups/printers.conf linuxmuster-client/ubuntu1204/r202 linuxmuster-client/ubuntu1204/r202/etc linuxmuster-client/ubuntu1204/r202/etc/fstab linuxmuster-client/ubuntu1204/r123 linuxmuster-client/ubuntu1204/r123/etc linuxmuster-client/ubuntu1204/r123/etc/cups linuxmuster-client/ubuntu1204/r123/etc/cups/printers.conf linuxmuster-client/ubuntu1204/r201-ws01/etc linuxmuster-client/ubuntu1204/r201-ws01/etc/cups linuxmuster-client/ubuntu1204/r201-ws01/etc/cups/printers.conf
echo "##### POSTSYNC BEGIN #####" # IP-Adresse des Server SERVERIP=10.16.1.1 # Raum feststellen. Dieses Skript geht davon aus # dass die Rechner Namen der Form # raumname-hostname haben, also z.B. cr01-pc18 RAUM=${HOSTNAME%-*} # wenn der string leer ist, raum auf unknown setzen if [ "x${RAUM}" == "x" ]; then RAUM="unknown" fi # Das Verzeichnis, in dem die Serverpatches # local synchronisiert werden. PATCHCACHE=/linuxmuster-client/serverpatches # UVZ auf dem Server. Mit diesem Variablen kann # man verschiedene Images bedienen (was bei linux # selten nötig ist) PATCHCLASS="ubuntu1204" echo "" echo "Hostname: ${HOSTNAME}" echo "Raum: ${RAUM}" echo "Patchcache: ${PATCHCACHE}" echo "Patchclass: ${PATCHCLASS}" echo "" # ----------------------------------------- # Patchdateien auf das lokale Image rsyncen # ----------------------------------------- echo " - getting patchfiles" # RAUM -> Raumname # HOSTNAME -> Rechnername # Verzeichnis anlegen, damit es sicher existiert mkdir -p /cache/${PATCHCACHE} rsync --progress --delete -r "${SERVERIP}::linbo/linuxmuster-client/${PATCHCLASS}" "/cache/${PATCHCACHE}" echo " - patching local files" # zuerst alles in common if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/common ]; then cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/common/* /mnt/ fi # dann raumspezifisch if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/${RAUM} ]; then cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/${RAUM}/* /mnt/ fi # dann rechnerspezifisch if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/${HOSTNAME} ]; then cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/${HOSTNAME}/* /mnt/ fi # ----------------------------------- # Sonstige Aktionen # ----------------------------------- echo " - special postsync actions" # hostname in /etc/hosts patchen sed -i "s/HOSTNAME/$HOSTNAME/g" /mnt/etc/hosts sed -i "s/#SERVERIP/$SERVERIP/g" /mnt/etc/hosts # fstab anpassen, damit Swap-Partition stimmt SWAP=$(sed ':a;N;$!ba;s/\n/;UMBRUCH;/g' $STARTCONF | sed 's/ //g'|sed 's/\[Partition\]/\n/g' | grep -i 'fstype=swap' | sed 's/;UMBRUCH;/\n/g' | grep -i 'dev=/' | cut -d'=' -f2 | head -c9) echo "$SWAP" sed -i "s#\#dummyswap#$SWAP#g" /mnt/etc/fstab # ----------------------------------- # Berechtigungen anpassen, wenn nötig # ----------------------------------- echo " - setting permissions of patched local files" # printers.conf [ -f /mnt/etc/cups/printers.conf ] && chmod 600 /mnt/etc/cups/printers.conf # .ssh verzeichnis chmod 700 /mnt/root/.ssh/ chmod 600 /mnt/root/.ssh/authorized_keys # Epoptes Serverkey - Rechte if [ -e /mnt/etc/epoptes/server.key ]; then chmod 600 /mnt/etc/epoptes/server.key fi # Besitzverhältnisse für linuxadmin (hier GID 1000; ggf. anpassen) reparieren # chown -R 1000:1000 /mnt/home/linuxadmin echo "##### POSTSYNC END #####"
Man kann auf diese Weise auch ein virtuelles Windows, das in einer Virtualbox läuft und auf einer eigenen Partition liegt synchron halten.3)
Dazu richtet man die virtuelle Maschine auf dem Client ein und kopiert dann das ganze Verzeichnis nach /var/linbo/
auf den Server in ein Unterverzeichnis, das man im folgenden Skript korrekt konfigurieren muss.
Dann wir nach dem Sync noch die virtuelle Maschine mir rsync in Ihren Ursprungszustand versetzt.
echo "##### POSTSYNC BEGIN #####" # IP-Adresse des Server SERVERIP=10.16.1.1 # Raum feststellen. Dieses Skript geht davon aus # dass die Rechner Namen der Form # raumname-hostname haben, also z.B. cr01-pc18 RAUM=${HOSTNAME%-*} # wenn der string leer ist, raum auf unknown setzen if [ "x${RAUM}" == "x" ]; then RAUM="unknown" fi # Das Verzeichnis, in dem die Serverpatches # local synchronisiert werden. PATCHCACHE=/linuxmuster-client/serverpatches # UVZ auf dem Server. Mit diesem Variablen kann # man verschiedene Images bedienen (was bei linux # selten nötig ist) PATCHCLASS="ubuntu1204" # Die Partition auf der das # Virtualbox-Windows liegt, # muss raumabhängig angepasst # werden, solange es dualboot # Maschinen gibt VIRTUALDEVICE=/dev/sda3 # im Raum 201 und 202 ist das virtuelle Windows auf /dev/sda5 if [ ${RAUM} == "r201" ]; then VIRTUALDEVICE=/dev/sda5 fi if [ ${RAUM} == "r202" ]; then VIRTUALDEVICE=/dev/sda5 fi # Verzeichnis innerhalb /var/linbo/ auf dem Server, # in dem die Virtuelle Maschine liegt. # Im folgenden Beispiel ist die Maschine im Verzeichnis # /var/linbo/virtualmachines/winxp/ # abgelegt. VIRTUALMACHINESERVERDIR=virtualmachines/winxp/ echo "" echo "Hostname: ${HOSTNAME}" echo "Raum: ${RAUM}" echo "Patchcache: ${PATCHCACHE}" echo "Patchclass: ${PATCHCLASS}" echo "" # ----------------------------------------- # Patchdateien auf das lokale Image rsyncen # ----------------------------------------- echo " - getting patchfiles" # RAUM -> Raumname # HOSTNAME -> Rechnername # Verzeichnis anlegen, damit es sicher existiert mkdir -p /cache/${PATCHCACHE} rsync --progress --delete -r "${SERVERIP}::linbo/linuxmuster-client/${PATCHCLASS}" "/cache/${PATCHCACHE}" echo " - patching local files" # zuerst alles in common if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/common ]; then cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/common/* /mnt/ fi # dann raumspezifisch if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/${RAUM} ]; then cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/${RAUM}/* /mnt/ fi # dann rechnerspezifisch if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/${HOSTNAME} ]; then cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/${HOSTNAME}/* /mnt/ fi # ----------------------------------- # Berechtigungen anpassen, wenn nötig # ----------------------------------- echo " - setting permissions of patched local files" # printers.conf [ -f /mnt/etc/cups/printers.conf ] && chmod 600 /mnt/etc/cups/printers.conf # .ssh verzeichnis chmod 700 /mnt/root/.ssh/ chmod 600 /mnt/root/.ssh/authorized_keys # ----------------------------------- # Virtuelles Windows rsyncen # ----------------------------------- echo " - getting virtual windows" mkdir -p /virtual > /dev/null 2>&1 # unmounten (to be shure) umount /virtual > /dev/null 2>&1 mount $VIRTUALDEVICE /virtual && \ rsync --progress -r "${SERVERIP}::linbo/${VIRTUALMACHINESERVERDIR}" "/virtual/" echo " - setting permissions for virtual windows" cd / chmod -R 777 /virtual umount /virtual echo "##### POSTSYNC END #####"
Alternativ kann man für das syncen auch die linbo-eigene Funktionalität bemühen:
# Name des Basisimages das zusaetzlich synchronisert werden soll (muss angepasst werden) mybaseimage=vbox.cloop # Name des Rsyncimages, ggf. eintragen myrsyncimage="" # Zielpartition auf die gesynct werden werden soll, muss angepasst werden myrootpartition=/dev/sda3 # Ab hier muss nichts mehr veraendert werden. # IP des LINBO-Servers, wird automatisch aus dhcp.log ermittelt myserverip="$(grep ^linbo_server /tmp/dhcp.log | tail -1 | awk -F\' '{ print $2 }')" # Ausgabe der Parameter auf der LINBO-Konsole echo "cachepartition: $1" echo "myserverip: $SERVERIP" echo "mybaseimage: $mybaseimage" echo "myrsyncimage: $myrsyncimage" echo "myrootpartition: $myrootpartition" # Syntax fuer linbo_cmd synconly: # /usr/bin/linbo_cmd synconly "<LINBO-Server-IP>" "<Cachepartition>" "<Basisimage>" "<Rsyncimage>" "<Bootpartition>" "<Rootpartition>" /usr/bin/linbo_cmd synconly "$SERVERIP" "$1" "$mybaseimage" "$myrsyncimage" "" "$myrootpartition"
Hat man mit Hilfe des Postsync-Scripts z.B. Desktop-Icons in das Home-Verzeichnis des linuxadmin kopiert, also nach /home/linuxadmin/Desktop, so stimmen die Rechte von /home/linuxadmin nicht mehr, mit der Folge, dass der linuxadmin sich nicht mehr anmelden kann. Dies kann man nicht per chown linuxadmin:linuxadmin korrigieren, da LINBO den Benutzer linuxadmin zum Zeitpunkt des Postsyncs noch nicht kennt. Statt dessen muss man mit der Benutzer-ID des linuxadmin arbeiten. Normalerweise ist diese die 1000 (erster angelegter Benutzer des Clients). Sie kann auf dem Client mit folgendem Befehl ermittelt werden:
# id linuxadmin
Sollte es sich um die ID 1000 handeln, so baut man am Ende des Postsync-Scripts die folgende Zeile ein:
chown 1000:1000 /mnt/home/linuxadmin
Jetzt sind die Rechte wieder richtig gesetzt.
Das obige universelle Skript lässt sich besonders gut im Zusammenspiel mit Hardlinks oder Softlinks verwenden. Bsp: Es gibt innerhalb der Hardwareklasse ubuntu1204
einige Räume, dieselbe printers.conf bekommen sollen, diese kann man dann außerhalb des Unterbaumes ablegen (/var/linbo/printers.conf
) und dann mit Hilfe von softlinks in den Baum verlinken.
Hardlinks können auch von Vorteil sein, wenn zunächst an mehreren Stellen dieselbe (große) Datei liegen soll, ohne dass sie auf dem Server den Platz mehrfach verbraucht. Wenn sie dann an einer Stelle geändert wird, passiert das nicht für die anderen Stellen, bspw. enthält /var/linbo/virtual/
ein virtuelles Windows, dann kann man es in die gesamte Klasse mit folgendem Befehl „kopieren“:
rsync -va --link-dest=/var/linbo/virtual/ /var/linbo/virtual/ /var/linbo/linuxmuster-client/ubuntu1204/common/virtual/