Installation und Beschreibung siehe → http://docs.linuxmuster.net/de/latest/clients/leoclient2/index.html
Mit dem Befehl:
# leovirtstarter2 --vbox
wird die Virtual-Box GUI der ausgewählten VM gestartet, jedoch nicht die VM selbst. Danach kann man z.B. die Hardwarekonfiguration der VM ändern. Diese Änderung landet dann in der /<MASCHINENPFAD>/<MACHINENNAME>.vbox
- Datei. Beim Zurücksetzen eines Snapshots wird aber auch die Konfiguration zurückgesetzt.
Um Änderungen dauerhaft zu übernehmen startet man am Besten das Script:
# sudo leoclient2-base-snapshot-renew
Dieses setzt alle Konfigurationsdateien dauerhaft im „defaults“-Verzeichnis der entsprechenden VM und verändert auch den „base-Snapshot“, d.h. den Basisfestplatten-Zustand.
Nachfolgendes Script legt mit dem aktuellen Snapshot der VM einen neuen auswählbaren Snapshot an. Ohne Angabe eines Snapshot-Namens wird der standard-Snapshot neu gesetzt. Script muss mit root-Rechten gestartet werden, man legt es am besten unter /usr/bin/
ab und macht es ausführbar. Der „base-Snapshot“, d.h. die zugrundeliegende Basisfestplatte wird dabei nicht verändert. Eine veränderte Hardwarekonfiguration speichert das Script auch nicht → ggf. selbst die .vbox-Datei sichern.
Vorgehensweise:
# sudo leoclient2-snapshot-create -m winxp1 -s Software2015
oder für den standard-Snapshot
# sudo leoclient2-snapshot-create -m winxp1
Damit gibt es nun einen neuen Snapshot mit dem Namen „Software2015“ im Auswahlmenü des Snapshotstarters.
#!/bin/bash # # /usr/bin/leoclient2-snapshot-create # # Usage: leoclient2-snapshot-create -m <VM-name> -s <Snapshot-name> # Ohne Snapshot-name wird der standard-Snapshot gesetzt # Script als root ausführen # etcdir="/etc/leoclient2/machines" OPTIND=1 VMPATH="/var/virtual" vm="" S_NAME="standard" MACHINENAME="" MACHINEPATH="" while getopts "m:s:" opt; do case "$opt" in m) vm=$OPTARG ;; s) S_NAME=$OPTARG ;; esac done shift $((OPTIND-1)) [ "$1" = "--" ] && shift for file in "$etcdir"/*.conf; do pfad=`cat $file` b=$(basename "$pfad") if [ "$b" = "$vm" ] ; then MACHINENAME=$b MACHINEPATH=$pfad fi done if [ "$MACHINENAME" = "" ] ; then echo "ERROR: Virtual Machine $vm wurde nicht gefunden!" exit 1 fi snapshotdir="$MACHINEPATH/Snapshots" s_filepfad=`find $snapshotdir -name "*.vdi" -print -quit` if [ "$s_filepfad" = "" ] ; then echo "ERROR: Kein Snapshot *.vdi gefunden!" exit 1 fi SNAPSHOTPATH="$MACHINEPATH/snapshot-store/$S_NAME" if [ -d "$SNAPSHOTPATH" ]; then rm -Rf $SNAPSHOTPATH/* else mkdir "$SNAPSHOTPATH" fi cp -f "$s_filepfad" "$SNAPSHOTPATH" FILESIZE=$(stat -c%s "$s_filepfad") echo $FILESIZE > "$SNAPSHOTPATH/filesize.vdi" sf=$(basename "$s_filepfad") z_filepfad="$SNAPSHOTPATH/$sf.zip" zip -9 -j $z_filepfad $s_filepfad FILESIZE=$(stat -c%s "$z_filepfad") echo $FILESIZE > "$SNAPSHOTPATH/filesize.vdi.zipped" chmod -R 755 "$SNAPSHOTPATH" echo " OK: Snapshot $sf wurde als $S_NAME gesetzt." exit 0
Nachfolgendes Script startet direkt ohne Dialog eine VM. Das Script ermittelt den aktuellen Snapshot-Namen „{…}.vdi“ aus der VBox-XML-Datei der VM. Dann wird der gezippte-Snapshot verwendet. Starten, „wie vorgefunden“ klappt nicht, wenn sich die VM im einem „gespeicherten Zustand“ befindet.
Script unter /usr/bin
ablegen und ausführbar machen. Die Rechteanpassung erfolgt mit Hilfe des leovirtstarter2
. Eine Datei network.conf
wird von dem Script nicht ausgewertet. Bei den Berechtigugen wird nur der Snapshot und die primäre Gruppe des Users überprüft
Aufruf z.B.:
# leoclient2-directstart -m winxp -r 1024 - s standard
#! /bin/bash # # /usr/bin/leoclient2-directstart -m <VM> -s <Snapshot> -r <RAM> # # m: Name der lokalen VM # s: Name des lokalen Snapshots, ohne wird "wie vorgefunden" verwendet # r: RAM in MB # # Version 3 - September 2015 etcdir="/etc/leoclient2/machines" OPTIND=1 vm="" S_NAME="" MACHINENAME="" MACHINEPATH="" RAM="1024" while getopts "m:s:r:" opt; do case "$opt" in m) vm=$OPTARG ;; s) S_NAME=$OPTARG ;; r) RAM=$OPTARG ;; esac done shift $((OPTIND-1)) [ "$1" = "--" ] && shift for file in "$etcdir"/*.conf; do pfad=`cat $file` b=$(basename "$pfad") if [ "$b" = "$vm" ] ; then MACHINENAME=$b MACHINEPATH=$pfad fi done if [ "$MACHINENAME" = "" ] ; then echo "ERROR: Die Virtuelle Maschine $vm wurde nicht gefunden!" exit 1 fi sudo /usr/bin/leovirtstarter2 --set-permissions if [ "$S_NAME" != "" ] ; then SNAPSHOTPATH="$MACHINEPATH/snapshot-store/$S_NAME" if [ -d "$SNAPSHOTPATH" ]; then # Name des aktuellen Snapshots aus der VBox-XML-Dstei ermitteln XMLPATH="$MACHINEPATH/defaults/$MACHINENAME.vbox" SNAPSHOTNAME=`sed -n 's|.*location="Snapshots\/\([^"]*\).*|\1|p' $XMLPATH` # echo $SNAPSHOTNAME if [ -f "$SNAPSHOTPATH/$SNAPSHOTNAME.zip" ]; then rm -Rf "$MACHINEPATH/Snapshots"/* unzip "$SNAPSHOTPATH/$SNAPSHOTNAME.zip" -d "$MACHINEPATH/Snapshots" cp -f "$MACHINEPATH/defaults/$MACHINENAME.vbox" "$MACHINEPATH" echo "zip" elif [ -f "$SNAPSHOTPATH/$SNAPSHOTNAME.ZIP" ]; then rm -Rf "$MACHINEPATH/Snapshots"/* unzip "$SNAPSHOTPATH/$SNAPSHOTNAME.ZIP" -d "$MACHINEPATH/Snapshots" cp -f "$MACHINEPATH/defaults/$MACHINENAME.vbox" "$MACHINEPATH" else echo "ERROR: Snapshot $S_NAME wurde nicht gefunden!" exit 1 fi fi fi # Berechtigungen des Snapshots Ueberpruefen if [ -f "$SNAPSHOTPATH/image.conf" ]; then auser=1 ahost=1 buser=0 bhost=0 HOST=$(hostname) ROOM=`groups $HOST | gawk -F" " '{ print $3 }'` GROUP=`groups $USER | gawk -F" " '{ print $3 }'` # echo "---$USER---$GROUP---$HOST---$ROOM---" IFS="=" while read -r name value do liste=${value//\"/} # echo "Inhalt von $name ist $liste" if [ "$name" == "user" ]; then auser=0 IFS="," for u in $liste do if [ "$USER" == "$u" ]; then buser=1 echo "Berechtigung user gefunden: $u" fi done fi if [ "$name" == "group" ]; then auser=0 IFS="," for u in $liste do if [ "$GROUP" == "$u" ]; then buser=1 echo "Berechtigung group gefunden: $u" fi done fi if [ "$name" == "host" ]; then ahost=0 IFS="," for u in $liste do if [ "$HOST" == "$u" ]; then bhost=1 echo "Berechtigung host gefunden: $u" fi done fi if [ "$name" == "room" ]; then ahost=0 IFS="," for u in $liste do if [ "$ROOM" == "$u" ]; then bhost=1 echo "Berechtigung room gefunden: $u" fi done fi IFS="=" done < "$SNAPSHOTPATH/image.conf" if [ $auser = 0 ] && [ $buser = 0 ]; then echo "User/Group hat keine Berechtigung -> ABBRUCH" exit 1 fi if [ $ahost = 0 ] && [ $bhost = 0 ]; then echo "Host/Room hat keine Berechtigung -> ABBRUCH" exit 1 fi fi export VBOX_USER_HOME=$MACHINEPATH /usr/bin/VBoxManage sharedfolder remove "$vm" --name home /usr/bin/VBoxManage sharedfolder add "$vm" --name home --hostpath "$HOME/Home_auf_Server" /usr/bin/VBoxManage modifyvm "$vm" --memory "$RAM" /usr/bin/VBoxManage startvm "$vm" --type gui exit 0
Zum bequemen Starten kann man einen Desktop-Starter anlegen, z.B. für die VM „winxp“ mit 1024 MB RAM und „standard“-Snapshot:
[Desktop Entry] Version=1.0 Type=Application Name=VirtualBox Direktstart Comment=Starting Snapshots of VirtualBox Comment[de]=Starten von VirtualBox Snapshots Exec=/usr/bin/leoclient2-directstart -m winxp -r 1024 -s standard Icon=leovirtstarter2 Categories=Graphics;Engineering; Categories=Emulator;System;Application; Terminal=false
Hinweis: Nach Anlegen dieser Datei muss diese ausführbar gesetzt werden.
Bei der Anmeldung eines Benutzers werden die Rechte an den virtuellen lokalen Maschinen so gesetzt, dass der Benutzer die Maschine starten kann, Logs anlegen kann und den aktiven Snapshot verändern kann. Legen Sie nachfolgendes Script ab unter /etc/linuxmuster-client/post-mount.d/
.
#!/bin/bash # # Script /etc/linuxmuster-client/post-mount.d/015-leoclient2 # Setzt die Rechte für die lokalen VMs auf den aktuellen USER # # etcpfad="/etc/leoclient2/machines" for file in "$etcpfad"/*.conf ; do vmpfad=`cat $file` vmname=$(basename "$vmpfad") chmod ugo+rwt $vmpfad chown -R $USER "$vmpfad/Logs" chown -R $USER "$vmpfad/Snapshots" chown $USER "$vmpfad"/VBoxSVC.log* chown $USER "$vmpfad/$vmname.vbox" chown $USER "$vmpfad/$vmname.vbox-prev" done exit 0
Standardmäßig werden die Dateien einer lokalen VM unter /var/virtual/
abgelegt, dieses Verzeichnis liegt im normalen Dateisystem des Linuxclients. Um diesen Speicherort auf eine extra Partition auszulagern, kann man diese Partition nach /var/virtual
per fstab mounten. Eine Partition dynamisch unter /media
dafür zu verwenden ist ungeeignet, da sich deren Namen und Zugriffsberechtigung je nach User ändern kann.
Beispiel: Es existiert eine Partition /dev/sda3
(wie z.B. bei der start.conf zum default-cloop), die mit ext4 formatiert ist. Zunächst den Mountpoint /var/virtual/
leeren bzw. den Inhalt wegsichern. Dann die Datei /etc/fstab
als root editieren und letzte Zeile ergänzen:
# /etc/fstab: static file system information. # ... /dev/sda3 /var/virtual ext4 defaults 0 0
Danach als root an der Konsole ausführen, um die Partition zu mounten und das ganze dann noch mit „df“ überprüfen:
# mount -a # df -h
Nun ggf. die weggesicherten Dateien wieder nach /var/virtual/
zurückspielen und von beiden Partitionen ein Image erstellen.
Frage: Wann muss welche Partition geimaged werden?
/etc/leoclient2/machines
registiert.
Am Client findet man unter /tmp/leovirtstarter2.log
die aktuelle log-Datei des leovirtstarters2 zur Fehlersuche.
Problem: Das Script leoclient2-base-snapshot-renew
läuft in eine Endlosschleife, wenn im Verzeichnis <lokaler Maschinenpfad>/Snapshots/
eine verweiste Snapshot-Datei übrig bleibt.
Lösung: Die verweiste Snapshot-Datei manuell löschen, dann leoclient2-base-snapshot-renew
nochmals ausführen.
Nach einem „leoclient2-base-snapshot-renew
“ werden bisherige Snapshots unbrauchbar und sollten auch nicht mehr verwendet werden. Der Snapshotname wird dabei auch geändert.
In der Datei <Maschinennamen>.vbox
wird der aktuell gültige Snapshotnamen {…}.vdi aufgeführt.
Problem: Unter <Maschinenpfad>/Snapshots
liegt ein alter Snapshot, der Name passt nicht. VirtualBox startet deshalb nicht.
Lösung: Den Snapshot in <Maschinenpfad>/Snapshots
manuell löschen und dann einen Snapshot mit dem aktuellen Namen aus <Maschinenpfad>/snapshot-store/standard/
in das Verzeichnis <Maschinenpfad>/Snapshots
kopieren.
Problem: Aktuell wertet der leovirtstarter2 eine network.conf
im Verzeichnis des lokalen Snapshots nicht aus. (leoclient2-Version: 0.5.4-1)
Lösung: Wenn man jedoch eine network.conf
im remote-Pfad des Snapshots ablegt, wird diese ausgewertet. Weitere Dateien müssen im remote-Pfad nicht vorhanden sein. Der remote-Pfad muss nicht zwingend remote liegen!
Z.B. mit den voreingestellten Standard-Pfaden des Snapshots „physik“:
/var/virtual/winxp1/snapshot-store/physik/…
/media/leoclient2-vm/winxp1/snapshot-store/physik/network.conf
Problem: Im Auswahlmenü wird „wie vorgefunden“ nicht angezeigt oder kann nicht gestartet werden.
Ursache 1: Die VM wurde nicht ausgeschaltet sondern befindet sich in einem gespeicherten Zustand. Im Verzeichnis …/Snapshots
befindet sich eine *.sav
-Datei.
Lösung 1: Den „Standard“-Snapshot starten oder die Maschine direkt mit VirtualBox starten und dann herunterfahren.
Ursache 2: Im Verzeichnis <Maschinenpfad>/Snapshots/
befinden sich überflüssige Dateien.
Lösung 2: Alle Dateien löschen bis auf den aktuellen Snapshot: {…}.vdi
. Der Name/die UUID des aktuellen Snapshots kann man (falls unklar) aus der <Maschinenname>.vbox
-Datei ermitteln.