winlin
Goto Top

VMBackup unter Linux

Hallo Leute,

ich möchte von Linux aus virtuelle Win7-Maschinen sichern. Diese laufen alle auf einer VMware Workstation v8. Aus diesem Grund will ich das gerne mit "vmrun" durchführen. Folgende Anforderungen sind gegeben und ich hoffe das mir jemand helfen kann das Bash-Skript fertigzustellen oder einfach ein paar Tipps zu geben da ich nicht so der Programmiere bin:

1. Die virtuellen Maschinen laufen auf drei verschiedenen Linux Workstations
2. Diese sollen immer am Monatsanfag "in Wartung gehen"
3. Die Sicherung erfolgt auf einem Linux Fileserver, der Share besteht auf allen Maschinen
4. Nach der Sicherung der VM´s sollen diese wieder gestartet werden


1. Überprüfen ob die VM´s laufen, falls ja Schritt 1 ausführen falls nicht gleich zu Schritt 2 übergehen

2. STOPPEN der VM´s
vmrun -T server -h https://server01.com/sdk stop '[ha-datacenter/standard] win7vm/win7vm.vmx' soft 
vmrun -T server -h https://server02.com/sdk stop '[ha-datacenter/standard] win7vm/win7vm.vmx' soft 
vmrun -T server -h https://server03.com/sdk stop '[ha-datacenter/standard] win7vm/win7vm.vmx' soft 

3. Die VM´s auf den drei Servern in .tar packen mit Datumsstempel und in das Share verzeichnis kopieren

4. NAch Beendigung des Kopiervorgangs alle VM´s wieder starten

vmrun -T server -h https://server01.com/sdk start'[ha-datacenter/standard] win7vm/win7vm.vmx'  
vmrun -T server -h https://server02.com/sdk start'[ha-datacenter/standard] win7vm/win7vm.vmx'  
vmrun -T server -h https://server03.com/sdk start'[ha-datacenter/standard] win7vm/win7vm.vmx'  

5. Alle Aktionen in einer Logfile ablegen.

Kann das ganze ja auch als Batch von einem Windowsrechner ausführen da ich VMIX installiert hab.

Content-Key: 202727

Url: https://administrator.de/contentid/202727

Printed on: April 20, 2024 at 08:04 o'clock

Mitglied: 64748
64748 Mar 04, 2013 at 11:49:17 (UTC)
Goto Top
Hallo,

Kann das ganze ja auch als Batch von einem Windowsrechner ausführen da ich VMIX installiert hab.
wieso Batch? wieso Windows?

Ich würde auf jedem der Linux-Server einen Cronjob einrichten. Der startet zum vorgesehenen Datum auf dem Linuxserver das Skript welches die VM anhält, einpackt, rüberkopiert und wieder startet.

Für infos über den cron-Dämon lese die Manpage für crond und crontab. Es gibt darüber auch im Internet Informationen.

Zusätzlich solltest Du es so einrichten, dass jedes der drei Skripten Dich darüber informiert, wenn was nicht funktioniert und dass Du nach Abschluss der Aufgabe informiert wirst.

Markus
Member: winlin
winlin Mar 04, 2013 at 11:51:32 (UTC)
Goto Top
ja mach es unter linux.

gibt es irgendwo ein beispiel skript das ich für mich anpassen könnte?
Mitglied: 64748
64748 Mar 04, 2013 at 12:03:14 (UTC)
Goto Top
http://www.techgras.de/2009/10/vmware-server-2-backup-script-fur-linux- ...

Das sieht doch vielversprechend aus, wenn Du den Code nicht verstehst, findest Du hier http://tldp.org/LDP/abs/html/ alles was Du brauchst. Ansonsten einfach hier fragen.

Markus
Member: winlin
winlin Mar 04, 2013 at 12:04:19 (UTC)
Goto Top
habe eigentlich ein gutes skript - abr der will hier vmware-cmd ausführen. ich habe nur vmrun. Kannst du mir helfen?
#! /bin/bash
# Roderick Derks
# www.r71.nl
# 20070227
#
# backup vmware's virtual machines to a remote computer  
# 1. check if backupserver is running
# Actions 2, 3 and 4 are per vm:
# 2. stop the vm if it is running
# 3. local copy the vm files
# 4. start the vm if it was running
# 5. remote copy of the backups created in step 3
###################################################################


### day and hour
    DAY=$(date | cut -d" " -f1)  
    HOUR=$(date|tr -s " "|cut -d" " -f4| cut -d":" -f1)  
### logfile
    export LOGFILE="/var/log/backup_vmware_servers.log"  
    if [ ! -e "${LOGFILE}" ]  
       then touch "$LOGFILE" # create a new logfile if not present  
    fi
### variables
    VM_HOST_SRC="HOST"  
    VM_HOST_REMOTE_DEST="TARGETHOST"  
    VM_ROOT_SRC="/lok/HOST/w7vm"  
    VM_LOCAL_BACKUP_DEST="/lok2/backup"  
    VM_ROOT_REMOTE_DEST="/lok2/backup"  
    VM_REMOTE_DEST="${VM_HOST_REMOTE_DEST}:${VM_ROOT_REMOTE_DEST}"  
 ##   MAILSERVER="yourmailserver.yourmail.com"  
 ##   EMAILADDRESS=" test@test.de"  


###################################################################
### check local machine name
if [ $HOSTNAME != "${VM_HOST_SRC}" ]; then  
   echo Hostname=${HOSTNAME}:
   echo "Dit script will only run on ${VM_HOST_SRC}"  
   exit
fi

echo $HOSTNAME > ${LOGFILE}          # flush logfile and add data
date >> ${LOGFILE}
echo >> ${LOGFILE}


###################################################################

IFS=$'\n' # needed to prevent problems with filenames containing spaces in arrays  
for VM_PATH_FILE in $(find ${VM_ROOT_SRC} -type f -name *.vmx)
do

  echo VM: ${VM_PATH_FILE} | tee -a ${LOGFILE}
  echo | tee -a ${LOGFILE}

  ##
  ## stop vm's if they are running  
  ##

  vmrun ${VM_PATH_FILE} list|grep -q "getstate() = on"  
  if [ $? -eq 0 ]; then
     echo "Shutting down VM at `date`." | tee -a ${LOGFILE}  
     #array0=( "${array0[@]}" "${VM_PATH_FILE}" ) # add to array, these vm's  will  be started later on  
     BOOT="1"  
####     vmware-cmd ${VM_PATH_FILE} stop soft >> ${LOGFILE}
  else
     echo "VM is not running." >> ${LOGFILE}; echo "VM is not running."  
     BOOT="0"  
  fi



  ##
  ## start backup
  ##

  VM_PATH=`echo ${VM_PATH_FILE}|rev|cut -d"/" -f2-|rev` # remove last field (using rev to remove first field, is easier)  
  echo VM_PATH: $VM_PATH

  echo "Starting local backup at `date`. (This is going to take a while...)" | tee -a ${LOGFILE}  

  # Local rsync copy command (to a local disk)
  VM_ROOT_SRC_VMDIR=`echo ${VM_PATH}|awk -F "${VM_ROOT_SRC}" '{ print $2 }'`  
  #echo rsync -avu ${VM_PATH}/ ${VM_LOCAL_BACKUP_DEST}${VM_ROOT_SRC_VMDIR}
####  rsync -avu ${VM_PATH}/ ${VM_LOCAL_BACKUP_DEST}${VM_ROOT_SRC_VMDIR} >> ${LOGFILE}

  echo Local backup finished at `date`. | tee -a ${LOGFILE}


  ##
  ## start VM if it was running
  ##

  if [ $BOOT -eq 1 ]; then
  echo "Starting VM" | tee -a ${LOGFILE}  
####  vmware-cmd "${VM_PATH_FILE}" start >> ${LOGFILE}  
  fi
  if [ $BOOT -eq 0 ]; then
  echo "VM wasn't running so it will not be started." | tee -a ${LOGFILE}  
  fi

  echo | tee -a ${LOGFILE}

  echo "------------------------------------------------------------" | tee -a ${LOGFILE}  
done


date >> ${LOGFILE}
echo "All VM's have been backed up and started at `date`." | tee -a ${LOGFILE}  


###################################################################


# check if remote server is up using return value: 1 is failed (down), 0 is success (up)
echo | tee -a ${LOGFILE}
echo Starting remote backup procedure. | tee -a ${LOGFILE}

ping ${VM_HOST_REMOTE_DEST} -c2|grep -q " 0% packet loss"  
if [ $? -eq 0 ]; then
   echo
   echo ${VM_HOST_REMOTE_DEST} is up, ping test succeeded. | tee -a ${LOGFILE}

   # Copy local backup to a remote server.
   echo Remote backup started at `date`.. | tee -a ${LOGFILE}
####   rsync -avu -e ssh ${VM_LOCAL_BACKUP_DEST}/ ${VM_REMOTE_DEST} >> ${LOGFILE}
   echo Remote backup finished at `date`. | tee -a ${LOGFILE}

else
   echo
   echo ${VM_HOST_REMOTE_DEST} unreachable, ping failed: no remote backup. | tee -a ${LOGFILE}
fi

echo | tee -a ${LOGFILE}


###################################################################


##
## Mail
##


#ping ${MAILSERVER} -c2|grep -q " 0% packet loss"  
#if [ $? -eq 0 ]; then
#   echo
#   echo ${MAILSERVER} is up, ping test succeeded. | tee -a ${LOGFILE}

#else
#   echo
#   echo ${MAILSERVER} unreachable, ping failed: waiting for 90 seconds to give it some time to boot. | tee -a ${LOGFILE}

 #  sleep 90 # my mailserver is probably booting now so wait a little bit
   #exit 1
#fi

#echo "Sending e-mail to ${EMAILADDRESS}" >> ${LOGFILE}  
#date >> ${LOGFILE}          # logfile aanvullen
#mail -s "VMWare backupscipt finished" ${EMAILADDRESS} <${LOGFILE}  

#exit 0
Mitglied: 64748
64748 Mar 04, 2013 updated at 12:20:45 (UTC)
Goto Top
Wahrscheinlich reicht es, den vmrun-Befehl, so wie in Deinem Eingangsposting ins Skript zu schreiben. Ich kann das hier nicht ausprobieren weil hier kein Vmware läuft.
Wenn Du den Befehl so ins Skript schreibst, wie Du ihn auch auf der Kommandozeile ausführen kannst, dann sollte das erstmal reichen.
vmrun -T server -h https://server01.com/sdk stop '[ha-datacenter/standard] win7vm/win7vm.vmx' soft >> ${LOGFILE}
Du musst überlegen, wie elaboriert Dein Skript sein soll/muss. Wahrscheinlich reichen wenige Zeilen. Ein Logfile ist sinnvoll.

Markus
Mitglied: 64748
64748 Mar 04, 2013 at 12:31:13 (UTC)
Goto Top
Also das hier
### day and hour 
17.   DAY=$(date | cut -d" " -f1) 
18.   HOUR=$(date|tr -s " "|cut -d" " -f4| cut -d":" -f1) 
ist Blödsinn.
Es reicht stattdessen
DAY=$(date +%a)
HOUR=$(date +%H)
Ich guck mir das Skript mal weiter an, aber vermutlich kann man ziemlich viel ausmisten.

Markus
Member: winlin
winlin Mar 04, 2013 updated at 12:55:54 (UTC)
Goto Top
ach du hast recht ich nehme besser dein Beispiel aus dem Link. Kannst du mir nur sagen wie ich anstatt den USB Platten ganz normale Verzeichnisse zum sichern verwenden kann? Würde es gerne auf einem /share speichern das auf allen MAschinen verbinden ist anstatt auf USB Platten (Zeile 13-20):
# Ab hier alle Einstellungen überprüfen und ggf. anpassen!!
# ---------------------------------------------------------
VM_ORDNER1="/hdd1/vm/w7vm01" #In welchem Ordner liegt die VM  
VM_BACKUP1="/share/backup/vm" #Der komplette Pfad zum VM Ordner  
VM_1="w7-vm01" #Name der VM  
BACKUPORDNER="backup" #Name des Backup-Ordners, wird angelegt falls nicht vorhanden.  
LOGZIEL="/hdd1/vm/vm_backup_logs" #Pfad zu den Logs, muss vorhanden sein.  
MAIL="test@test.de" #Mailempfänger  
USER="root" #Administrator für VMware Server 2  
PW="PWD" #PW für Administrator VMware Server 2  
IP="https://127.0.0.1:8333/sdk" #Nur in AUSNAHMEFÄLLEN ändern. (Bei Standartinstallationen kann dies so bleiben)  
PLATTEN="2" #USB-Platten wurden vorher in Datei /etc/fstab mit der option *noauto* und der entsprechenden UUID eingetragen  
#Beispiel für die Zeile in der fstab.
##Platte1
#UUID=C0364D39364D31A8   /mnt/usb        ntfs    noauto,user,defaults    0
##Platte2
#UUID=4234536453323A34   /mnt/usb1       ntfs    noauto,user,defaults    0
#Es werden NTFS formatierte Platten vorausgesetzt.
USB="/media/usb1" #Mountpoints müssen "/mnt/einhängepunkt(nummer_laufend)" lauten.  
CLEAN=0 #Alte Backups im Ordner "BACKUPORDNER" bei Platzmangel löschen? 1=ja, 0=nein 
# ---------------------------------------------------------
# AB HIER NICHTS MEHR ÄNDERN
# ---------------------------------------------------------
Mitglied: 64748
64748 Mar 04, 2013 updated at 15:25:03 (UTC)
Goto Top
Wenn Du auf dem Server, wo die Backups gespeichert werden sollen, ein NFS-Share einrichtest, dann wäre diese Freigabe einzubinden, wie eine lokale Partition, Beispiel:
mount backupserver:/usr/local/backups /mnt/backup
Und Du kannst dann als Pfad /mnt/backup nehmen. In Deinem obigen Skript
VM_BACKUP1="/mnt/backup/"
Wobei das mit dem NTFS-Dateisystem in diesem Falle irrelevant ist.

Ich würde allerdings eher rsync benutzen um die tar-Datei auf den anderen Computer zu kopieren.

Markus
Mitglied: 64748
64748 Mar 05, 2013 at 08:02:56 (UTC)
Goto Top
Guten Morgen,

ich habe nochmal über das Skript nachgedacht. Eine Sache mache ich immer anders, und zwar teile ich solche Skripten in zwei Dateien auf. Die Konfiguration kommt in eine Datei, das ist der Teil, den Du um 13:55 gepostet hast, daraus machst Du eine Datei "vmbackup.conf" und den ausführbaren restlichen Teil des Skripts nennst Du entsprechend "vmbackup.sh". Dann kannst Du die Konfiguration sourcen. Wenn also z.B. das ausführbare Skript in /usr/local/bin/ liegt und die Konfiguration in /usr/local/etc/, dann würdest Du im Skript so:
. /usr/local/etc/vmbackup.conf
die Konfiguration einlesen.

Der Vorteil ist, dass Du für alle VMs ein und dasselbe Skript benötigst, nur die Konfigurationsdateien auf den verschiedenen Servern sind unterschiedlich.

Markus
Member: winlin
winlin Mar 05, 2013 at 08:23:58 (UTC)
Goto Top
Hallo,

habe den Fileservershare auf der Maschine gemountet unter /mnt/cdrom. Kann auch drauf zugreifen
Das habe ich dann im Backupskript eingetragen:
VM_BACKUP1="/mnt/cdrom" #Der komplette Pfad zum VM Ordner   
USB="/mnt/cdrom" #Mountpoints müssen "/mnt/einhängepunkt(nummer_laufend)" lauten.  
Nachdem ich es ausgeführt habe, erscheint das im Logfile:
mount: can't find /mnt/cdrom1 in /etc/fstab or /etc/mtab  
Keine Speichermedien gefunden. Backup wurde abgebrochen!
Mitglied: 64748
64748 Mar 05, 2013 updated at 08:36:14 (UTC)
Goto Top
Das hier
mount: can't find /mnt/cdrom1 in /etc/fstab or /etc/mtab 
bedeutet, dass Du entweder die zu mountende Partition in /etc/fstab einfügen musst, dann kann mit
mount /mnt/cdrom
gemountet werden. Oder Du muss den mount-Befehl anders schreiben, nämlich welche -Partition Freigabe wo im Verzeichnis gemountet werden soll. Im Skript steht ja nur
mount $USB$DEVICE -o force 1>> $LOG 2>> $LOG_ERR
es setzt also den Eintrag in fstab voraus.

Der Mount-Befehl im Skript müsste die Form
mount server:/pfad/zur/backup/partition/ /mnt/cdrom
haben.

Markus
Member: winlin
winlin Mar 05, 2013 at 08:58:30 (UTC)
Goto Top
das hat natürlich geklappt nachdem ich es geändert habe. Nun läuft das Skript an aber die Berechnung der Speicherplatzmenge ist aber falsch:
Größe VM........................: 368 GB
Verfügbarer Speicherplatz.......: 153 GB
Freier Speicherplatz nach Backup: -215 GB
Platzbedarf in %................: 240 %

Speicherplatz nicht ausreichend. Backup-Vorgang wird abgebrochen.
Mitglied: 64748
64748 Mar 05, 2013 at 09:11:05 (UTC)
Goto Top
Du musst den Befehl zur Berechnung des Speicherplatzes anpassen, hast Du den denn mal ausprobiert? also man kann den verfügbaren Speicherplatz auch auf einem NFS-share prüfen, das habe ich gerade ausprobiert.

Markus
Member: winlin
winlin Mar 05, 2013 updated at 09:22:37 (UTC)
Goto Top
naja das hat jetzt geklappt nachdem ich etwas rumprobiert habe...Ist halt etwas unverständlich die Konstanten die man am Anfang des Skripts angeben muss...aber ich denke das es nun korrekt ist:
VM_ORDNER1="w7vm01" #HIER HABE ICH DEN NAMEN MEINES VM ORDNERS ANGEGE NINDEM DIE VMX DATEI LIEGT  
VM_BACKUP1="/pfad/vm/w7vm01/" #Der komplette Pfad zum VM Ordner Indem die vmx liegt  
VM_1="Windows_7_x64.vmx" #Name der VM  
BACKUPORDNER="backup" #Name des Backup-Ordners, wird angelegt falls nicht vorhanden.  
Member: winlin
winlin Mar 05, 2013 updated at 09:22:13 (UTC)
Goto Top
aber nun erhalte ich den Fehler das die VM nicht in den Suspend Modus versetzt werden konnte....oh mann:
mount: can't find /mnt/cdrom in /etc/fstab or /etc/mtab  
ACHTUNG: Die Virtuelle Maschine (w7vm01/Windows_7_x64.vmx) konnte nicht in den Suspend Modus versetzt werden.
Backup wurde abgebrochen
Mitglied: 64748
64748 Mar 05, 2013 updated at 09:31:07 (UTC)
Goto Top
Das mit dem mount-Befehl musst Du wahrscheinlich zuerst in Ordnung bringen, sonst weiß man nicht, wo das Skript Fehler produziert.

Du solltest die Befehle im Skript mal Schritt für Schritt auf der Kommandozeile durchführen. Dann siehst Du, was nicht funktioniert. Wenn was nicht geht, dann passe den Code auf der Kommandozeile an, wenn es dann klappt, dann schreib ihn ins Skript.

Falls es wirklich ein Problem mit dem Suspend Modus ist, da kenne ich mich nicht aus. Wie lautet denn nun der mount-Befehl der im Skript ausgeführt wird?

Markus
Member: winlin
winlin Mar 05, 2013 at 09:33:27 (UTC)
Goto Top
Habe ich gerade so gemacht....den Fehler mit dem mount Befehl habe ich gefunden und behoben...nun bleibt er jedoch immer noch hier stehen:
ACHTUNG: Die Virtuelle Maschine (w7vm01/Windows_7_x64.vmx) konnte nicht in den Suspend Modus versetzt werden. Backup wurde abgebrochen
Ist der einzogste Fehler im LOG. Die Codezeilen sehen so aus:
# VMs in den Suspend setzen und Erfolg abfragen
# 0 = i.O.
# 255 = Fehler

echo | vmrun -T server -h $IP -u $USER -p $PW suspend "[standard] $VM_ORDNER1/$VM_1" 1>>$LOG 2>>$LOG_ERR  
if  [ $? = 255 ]; then
                echo "ACHTUNG: Die Virtuelle Maschine ($VM_ORDNER1/$VM_1) konnte nicht in den Suspend Modus versetzt werden." >>$LOG_ERR  
                echo "Backup wurde abgebrochen" >>$LOG_ERR  
                umount $USB$DEVICE >> $LOG_ERR
                mail_err
                exit
                        else
                                echo "$(date +%H:%M): Virtuelle Maschine ($VM_1) wurde erfolgreich in den Suspend-Mode versetzt" >>$LOG  
fi
Mitglied: 64748
64748 Mar 05, 2013 updated at 09:43:05 (UTC)
Goto Top
Probier erstmal den vmrun-Befehl, so wie er dort steht auf der Kommandozeile aus. Die Abfrage
if [ $? = 255 ]; then 
bedeutet, dass nach dem Rückgabewert des vmrun-Befehls gefragt wird. Genauer: $? enthält den Rückgabewert des letzten Befehls, meistens 0 wenn alles glatt gelaufen ist.
Also nachdem Du vmrun auf der Kommandozeile ausgeführt hast, mache mal
echo $?
Um das obige zu interpretieren, musst Du Dich mit den Rückgabewerten des vmrun-Befehls (Fehlercodes) beschäftigen. In Deinem Skript wird erwartet, dass 255 bedeutet, dass die VM nicht suspended werden konnte. Wenn das tatsächlich nicht klappt (auch auf der Kommandozeile), dann schau Dir mal die Berechtigungen an.

Markus
Member: winlin
winlin Mar 05, 2013 at 09:42:25 (UTC)
Goto Top
juhuuu jetzt macht er ja wasface-smile)) es lag an $IP da stand 127.0.0.1 drin...habe nun mal den FQDN reingeschrieben und nun läuft er durch und macht mir auch ein Backup! Also Backup läuft noch sag dir bescheid wenn es abgeschlossen ist. Du bist echt ne superhilfe gewesen. Danke für deinen rat.
Mitglied: 64748
64748 Mar 05, 2013 updated at 09:46:24 (UTC)
Goto Top
Zitat von @winlin:
juhuuu jetzt macht er ja wasface-smile)) es lag an $IP da stand 127.0.0.1 drin...habe nun mal den FQDN reingeschrieben und nun läuft
er durch und macht mir auch ein Backup! Also Backup läuft noch sag dir bescheid wenn es abgeschlossen ist. Du bist echt ne
superhilfe gewesen. Danke für deinen rat.
Nichts zu danken, freut mich, dass es jetzt funktioniert.

Markus
Member: winlin
winlin Mar 05, 2013 updated at 09:58:19 (UTC)
Goto Top
noch eine Sache hätt ich noch markus...wenn ich in meinem vm Ordner mehrere VM´s habe, kann ich die doch auch mit diesem Skript sichern, oder?!

Pfad zum VM-Ordner:
/hdd01/vm/

VM´s:
w7vm01/Windows_7_x64.vmx
w7vm02/Windows_7_x64.vmx
w7vm03/Windows_7_x64.vmx

Würd dann so aussehen:
# VM01
VM_ORDNER1="w7vm01" #HIER HABE ICH DEN NAMEN MEINES VM ORDNERS ANGEGEBEN NINDEM DIE VMX DATEI LIEGT   
VM_BACKUP1="/pfad/vm/w7vm01/" #Der komplette Pfad zum VM Ordner Indem die vmx liegt   
VM_1="Windows_7_x64.vmx" #Name der VM   
# VM02
VM_ORDNER2="w7vm02" #HIER HABE ICH DEN NAMEN MEINES VM ORDNERS ANGEGEBEN NINDEM DIE VMX DATEI LIEGT   
VM_BACKUP2="/pfad/vm/w7vm02/" #Der komplette Pfad zum VM Ordner Indem die vmx liegt   
VM_1="Windows_7_x64.vmx" #Name der VM   
# VM03
VM_ORDNER2="w7vm02" #HIER HABE ICH DEN NAMEN MEINES VM ORDNERS ANGEGEBEN NINDEM DIE VMX DATEI LIEGT   
VM_BACKUP2="/pfad/vm/w7vm02/" #Der komplette Pfad zum VM Ordner Indem die vmx liegt   
VM_1="Windows_7_x64.vmx" #Name der VM   

Problem ist nur das im kompletten Skript immer $VM_ORDNER1/$VM_1 angegeben ist. Muss ich das ändern in $VM_ORDNER%/$VM_% ???
Mitglied: 64748
64748 Mar 05, 2013 updated at 09:59:43 (UTC)
Goto Top
Ach so, ich hatte das so verstanden, dass die VMs auf drei verschiedenen Rechnern laufen.

Du musst die dann nur hintereinander ausführen. Ich würde das allerdings nicht in einer Schleife machen, also
for vm in w7vm01/Windows_7_x64.vmx w7vm02/Windows_7_x64.vmx w7vm03/Windows_7_x64.vmx; do
sondern für jede VM einen eigenen Cronjob anlegen und das vielleicht an drei aufeinanderfolgenden Tagen machen. Dann hast Du bei einer Fehlfunktion länger Zeit um zu reagieren.

Du könntest das so machen, dass das Skript den Pfad zur VM also Kommandozeilenparameter bekommt. Die Variablen $1, $2 usw enthalten die Kommandozeilenparameter. Du lässt also das Skript aufrufen mit
/usr/local/bin/backupscript.sh w7vm01/Windows_7_x64.vmx VM_BACKUP1
im Skript ist dann
$1 = w7vm01/Windows_7_x64.vmx
$2 = VM_BACKUP1

Markus
Member: winlin
winlin Mar 05, 2013 at 10:06:12 (UTC)
Goto Top
also dann so:
#VM01
VM_ORDNER%1="w7vm01" #In welchem Ordner liegt die VM  
VM_BACKUP%1="/share/pfad/vm/w7vm01/" #Der komplette Pfad zum VM Ordner  
VM_%1="Windows_7_x64.vmx" #Name der VM  
#VM02
VM_ORDNER%1="w7vm02" #In welchem Ordner liegt die VM  
VM_BACKUP%1="/share/pfad/vm/w7vm02/" #Der komplette Pfad zum VM Ordner  
VM_%1="Windows_7_x64.vmx" #Name der VM  
#VM03
VM_ORDNER%1="w7vm03" #In welchem Ordner liegt die VM  
VM_BACKUP%1="/share/pfad/vm/w7vm03/" #Der komplette Pfad zum VM Ordner  
VM_%1="Windows_7_x64.vmx" #Name der VM  
Mitglied: 64748
64748 Mar 05, 2013 at 10:10:49 (UTC)
Goto Top
Du meinst vermutlich '$' anstatt '%'. Und ich werde da nicht richtig schlau draus, beschreib mal, wie Du es genau machen möchtest.

Markus
Member: winlin
winlin Mar 05, 2013 at 10:59:50 (UTC)
Goto Top
Auf das komm ich dann nochmal zurück wenn ich mein eigentliche Frage "verarbeitet" habe....

wie stelle ich das Skript (http://www.techgras.de/2009/10/vmware-server-2-backup-script-fur-linux- ..) so um das er gar keine USB Platten mehr mounted etc. Wenn ich es einfach auf die zweite Festplatte die in der Maschine ist sichern will?
Mitglied: 64748
64748 Mar 05, 2013 updated at 11:14:51 (UTC)
Goto Top
Zitat von @winlin:
Auf das komm ich dann nochmal zurück wenn ich mein eigentliche Frage "verarbeitet" habe....

wie stelle ich das Skript (http://www.techgras.de/2009/10/vmware-server-2-backup-script-fur-linux- ..) so um das er gar
keine USB Platten mehr mounted etc. Wenn ich es einfach auf die zweite Festplatte die in der Maschine ist sichern will?
Wenn die Partition immer gemounted ist, dann kommentiere einfach im Skript den Teil mit dem Mounten aus.
#USB-Platten werden gemountet 
#for i in $(seq 1 $PLATTEN); do
#    if [ $MOUNTED = 0 ]; then
#        echo "Datum: "$DATUM >> $LOG
#        echo "Zeit: "$(date +%H:%M) >> $LOG
#        echo | mount $USB$DEVICE -o force 1>> $LOG 2>> $LOG_ERR
#        if [ $? = 0 ]; then
#            ZIEL=$USB$DEVICE"/"$BACKUPORDNER
#            MOUNTED=1
#            echo "${USB}${DEVICE} gemountet." >>$LOG
#        else
#            DEVICE=$(( $DEVICE + 1 ))
#        fi
#    fi
#done
Dann änderst Du
USB="/mnt/usb" #Mountpoints müssen "/mnt/einhängepunkt(nummer_laufend)" lauten.
in
BKPPARTITION=/pfad/zur/backup/partition/  # dorthin sichern
Und dann außerhalb dieses Codeblocks überall da, wo $USB steht $BKPPARTITION schreiben. Beachte, dass Du die Anführungszeichen im Code nicht brauchst, es kommen ja keine Leerzeichen im Pfad vor. Allerdings solltest Du um unliebsame Überraschungen zu vermeiden, die Umlaute vermeiden, also z.B. 'ä' durch 'ae' ersetzen! auch in den Kommentaren! Das funktioniert nämlich u.U. nicht mehr, wenn auf dem Rechner mal nach einem Update z.B. $LANG falsch gesetzt ist.

Falls Du jedoch die Partition nur zum Sichern mountest, also die lokale Partition mounten willst, dann mache einfach einen entsprechenden Eintrag in der /etc/fstab und ändere in dem Codeblock wo gemountet wird ebenfalls $USB nach $BKPPARTITION.

Markus
Member: winlin
winlin Mar 05, 2013 at 11:28:46 (UTC)
Goto Top
hab ich genauso gemacht...
Logfile:
Keine Speichermedien gefunden. Backup wurde abgebrochen!
Mitglied: 64748
64748 Mar 05, 2013 at 11:33:09 (UTC)
Goto Top
Zitat von @winlin:
hab ich genauso gemacht...
Logfile:
> Keine Speichermedien gefunden. Backup wurde abgebrochen!
> 
Ja, das ist klar
#Wenn keine der Platten eingebunden werden kann: EXIT mit Error-Mail
if [ $MOUNTED = 0 ]; then
    echo "Keine Speichermedien gefunden. Backup wurde abgebrochen!" >>$LOG_ERR
    mail_err
    exit
fi
das muss auch auskommentiert werden, sonst wird die Variable $MOUNTED abgefragt, die aber in dem auskommentierten Codeblock angelegt wird.

Markus
Member: winlin
winlin Mar 05, 2013 at 12:14:14 (UTC)
Goto Top
hatte ich eben auskomentiert...is mir auch aufgefallen...naja sieht alles schon besser aus...jetzt hab ichs mal wieder ausgeführt und warte...beim ausführen kam ein error den ich danach auswerten werden...vorab schon mal:
[root@hostname vm]# ./BACKUP_skript.sh
1
./BACKUP_skript.sh: line 111: /dev/mapper/vgroot-root
208520816 / 1048576 : syntax error: operand expected (error token is "/dev/mapper/vgroot-root  
208520816 / 1048576 ")  
Mitglied: 64748
64748 Mar 05, 2013 at 12:19:05 (UTC)
Goto Top
Was genau steht denn in Zeile 111?

Markus
Member: winlin
winlin Mar 05, 2013 at 12:23:42 (UTC)
Goto Top
88 #Speicherplatzabfrage.
     89 #Wenn CLEAN auf 1 gesetzt, wird bei zu geringem Speicherplatz der Backupordner gelöscht.
     90 #Backup-Rotation in Planung....
     91 S="/"  
     92 MB=0
     93 MENGEQ=" GB"  
     94 MENGEZ=" GB"  
     95 MENGED=" GB"  
     96 LIMIT=1
     97 LAUF=2
     98 END=0
     99 echo 1
    100 for i in $(seq 1 $LAUF); do
    101         if [ $END = 0 ]; then
    102                 QUELLE=$(du -s $S$VM_BACKUP1 | tr -s " " | cut -d "/" -f 1)  
    103                 ZIEL1=$(df $S$ZIEL | tr -s " " | cut -d " " -f 4 | grep -v "Avai")  
    104                 QUELLEERG=$(( $QUELLE / 1048576 ))
    105                         if [ $QUELLEERG -lt $LIMIT ]; then
    106                                 QUELLEERG=$(( $QUELLE / 1024 ))
    107                                 MB=1
    108                                 MENGEQ=" MB"  
    109                         fi
    110
    111                 ZIELERG=$(( $ZIEL1 / 1048576 ))
    112                         if [ $MB = 1 ]; then
    113                                 ZIELERG=$(( $ZIEL1 / 1024 ))
    114                                 MENGEZ=" MB"  
    115                                 MENGED=" MB"  
    116                         fi
    117
    118                 DIFFERENZ=$(( $ZIELERG - $QUELLEERG ))
    119                 PROZENT=$(( $DIFFERENZ * 100 / $ZIELERG ))
    120                 NUTZ=$(( 100 - $PROZENT ))
    121
    122                                 if  [ $ZIELERG -lt $QUELLEERG ]; then
    123                                         if [ $CLEAN = 1 ]; then
    124                                                 echo "Größe VM........................: "$QUELLEERG$MENGEQ         >> $LOG  
    125                                                 echo "Verfügbarer Speicherplatz.......: "$ZIELERG$MENGEZ >>         $LOG  
    126                                                 echo "Freier Speicherplatz nach Backup: "$DIFFERENZ$MENGED         >> $LOG  
Mitglied: 64748
64748 Mar 05, 2013 updated at 12:56:35 (UTC)
Goto Top
Lass die Berechnung komplett weg und parse stattdessen die Ausgabe von
df -h

Beispiel: Ausgabe von df -h bei mir
markus@samsung:~$ df -h
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda5        25G     19G  4,5G   81% /
/dev/sda6        20G     16G  3,1G   84% /home
/dev/sda10       11G    8,2G  2,2G   80% /usr/local
/dev/sda7        60G     55G  1,6G   98% /usr/local/public
/dev/sda8        60G     37G   20G   65% /usr/local/vm
tmpfs           2,0G    1,7M  2,0G    1% /dev/shm
/dev/sda3        98G     49G   50G   50% /usr/local/win7
und mit folgendem Befehl
markus@samsung:~$ MEM=$(df -h | grep vm | cut -d G -f 3)
markus@samsung:~$ echo $MEM
20
ergibt sich der verfügbare Speicher auf der vm-Partition. Aber Vorsicht, der cut-Befehl ist hier sehr unsicher.

Markus
Member: winlin
winlin Mar 05, 2013 at 13:06:14 (UTC)
Goto Top
nach dem auskommentieren mit der berechnung des speichers, läuft er seit einigen minuten ohne fehler...mal sehen was als ergebnis rauskommt... Speicher hat er wirklich genug und die Platten sind sehr gross...
Member: winlin
winlin Mar 06, 2013 updated at 11:31:47 (UTC)
Goto Top
hi habe ein erfolgreiches Logfile:
atum: 06-03-2013
Zeit: 10:40
/mnt/cdrom gemountet.
Erstelle Ziel-Ordner (/mnt/cdrom/backup).
Ordner /mnt/cdrom/backup wurde erstellt.
Größe VM........................: 0 MB
Verfügbarer Speicherplatz.......: 229397 MB
Freier Speicherplatz nach Backup: 229397 MB
Platzbedarf in %................: 0 %

Speicherplatz ausreichend. Backup wird gestartet.
10:42: Virtuelle Maschine (Windows7.vmx) wurde erfolgreich in den Suspend-Mode versetzt
scr2/vm/
Errorlevel TAR: 0
-------------------------------------------------------------------
10:42: Virtuelle Maschine (Windows7.vmx) wurde erfolgreich gestartet
------------------------------------------------------------
Das Backup von Windows7.vmx wurde am 06-03-2013 um 10:42 Uhr erfolgreich beendet und in /mnt/cdrom/backup/06-03-2013/06-03-2013.tar.gz gespeichert.

Sieht ja alles gut aus bis auf oben mit der Grösse des VM-Ordners...wieso denn 0MB? Wo berechnet er etwas falsches?

Konfiguration:
# Ab hier alle Einstellungen überprüfen und ggf. anpassen!!
# ---------------------------------------------------------
VM_ORDNER1="Windows7" #In welchem Ordner liegt die VM  
VM_BACKUP1="hdd2/vm/" #Der komplette Pfad zum VM Ordner  
VM_1="Windows7.vmx" #Name der VM  
BACKUPORDNER="backup" #Name des Backup-Ordners, wird angelegt falls nicht vorhanden.  
LOGZIEL="/tmp/vm/" #Pfad zu den Logs, muss vorhanden sein.  
MAIL="testuser@test.de" #Mailempfänger  
USER="root" #Admin für VMware Server 2  
PW="password" #PW für Administrator VMware Server 2  
IP="https://hostname.domain.com/sdk" #Nur in AUSNAHMEFÄLLEN ändern. (Bei Standartinstallationen kann dies so bleiben)  
PLATTEN="2" #USB-Platten wurden vorher in Datei /etc/fstab mit der option *noauto* und der entsprechenden UUID eingetragen  
CLEAN=0 #Alte Backups im Ordner "BACKUPORDNER" bei Platzmangel löschen? 1=ja, 0=nein 
# ---------------------------------------------------------
# AB HIER NICHTS MEHR ÄNDERN
# ---------------------------------------------------------
DATUM="$(date +%d-%m-%Y)"  
LOG="${LOGZIEL}/${DATUM}.log"  
LOG_ERR="${LOGZIEL}/${DATUM}_err.log"  
ZIEL=""  
MOUNTED=0
DEVICE=""  

Das erstellen der TAR Files:
#Verzeichnis für neues Backup erstellen falls noch nicht vorhanden
if ! [ -d $ZIEL/$DATUM ]; then
                echo | mkdir $ZIEL/$DATUM >> $LOG
fi

#Jetzt kann tar loslegen
cd /
echo | tar -czvf $ZIEL/$DATUM/$DATUM.tar.gz $VM_BACKUP1 1>>$LOG 2>>$LOG
Mitglied: 64748
64748 Mar 06, 2013, updated at Mar 07, 2013 at 09:25:45 (UTC)
Goto Top
Hallo,

also mindestens einige der if-statements im Script werden wohl nicht funktionieren.

Es muss z.B. heißen
if [ $MB == 1 ]; then
und nicht
if [ $MB = 1 ]; then

Den ganzen Codeblock solltest Du ersetzen. Berechnen des freien Speicherplatzes kann mit df erfolgen,

MEM=$(df -h --output=avail | grep -i vm)

wobei Du mit grep nach etwas suchen musst, dass nur im Pfad des Backverzeichnisses vorkommt.

Größe der VM
VMSIZE=$(ls -lh /usr/local/vm/slackware/ | cut -d " " -f 5)
wobei hier bei mir dieses Verzeichnis eine VM enthält.

Wenn Du das Skript ausgemistet hast, dann wird es wohl problemlos laufen, dann ist es aber auch wesentlich übersichtlicher.

Markus

Edit: der oben durchgestrichene Code funktioniert nicht, weil bei der Option --output der String nach dem grep sucht nicht ausgegeben wird.
Member: winlin
winlin Mar 06, 2013 at 11:55:07 (UTC)
Goto Top
ich denke das mit der Speicherabfrage etc. lass ich lieber sein...ich weiss ja das ich immer genug Platz auf dem Fileserver habe wo die VM gesichert wird....oder was denkst du? Und vor allem da ich mich ja net so gut auskenne....
Mitglied: 64748
64748 Mar 06, 2013 updated at 12:04:22 (UTC)
Goto Top
Es ist eine gute Möglichkeit zu Lernen. Wenn Du mal Zeit hast, dann gib Dich daran, die Speicherabfrage in's Skript einzubauen, dann kannst Du auch den Cronjob einrichten und z.B. die Konfiguration vom Skript trennen, so wie ich es oben beschrieben habe.

Du kannst das Skript auch als schlechtes Beispiel nehmen, es sind viel zu viele komplizierte Codeschnipsel darin enthalten und auch einige Fehler. Lies Dir mal die manpages von df und date durch, da merkst Du schnell, dass das meiste viel einfacher geht.

Und wenn Du mit dem Lesen der Manpages Schwierigkeiten hast, dann ist hier eine Anleitung: Manpages effizient nutzen

Markus
Member: winlin
winlin Mar 06, 2013 at 12:46:49 (UTC)
Goto Top
Die komplette Speicherabfrage erstmal rauskommentiert....Ich weiss nur icht wieso er mir zwar erfolgreich eine Log erstellt das alles geklappt hat, öffne ich jedoch das tar sehe ich nur meinen leeren VM-Ordner....der sichert gar nicht meine VM sondern nur den leeren ordner...
Mitglied: 64748
64748 Mar 06, 2013 at 12:58:19 (UTC)
Goto Top
Du muss prüfen, was die Variablen beinhalten, die in dem Skript benutzt werden, also einfach ein paar echo Befehle einbauen.
...
#Jetzt kann tar loslegen
echo $ZIEL
echo $DATUM
echo $VM_BACKUP1
cd /
echo | tar -czvf $ZIEL/$DATUM/$DATUM.tar.gz $VM_BACKUP1 1>>$LOG 2>>$LOG
...
vielleicht postest Du mal das gesamte Skript, so wie Du es jetzt laufen lässt, dann werde ich mir das heute abend mal ansehen. Im Moment habe ich zu wenig Überblick. Und bitte poste auch nochmal die genauen Pfade und Dateinamen.

Markus
Member: winlin
winlin Mar 06, 2013 updated at 13:05:23 (UTC)
Goto Top
das werde ich gleich mal ausprobieren um nachvollziehen zu können was gemacht wird...
hier aber das Skript:
#!/bin/bash
####################################
# Backupskript VMware              #       
####################################
 
# Ab hier alle Einstellungen überprüfen und ggf. anpassen!!
# ---------------------------------------------------------
VM_ORDNER1="w7-vm01"  
VM_BACKUP1="hdd2/vm/"   
VM_1="Windows7.vmx"  
BACKUPORDNER="backup"   
LOGZIEL="/hdd1/vm/"   
USER="root"   
PW="passwort"  
IP="https://hostname.domain.com/sdk"  
PLATTEN="2"  
USB="/mnt/cdrom"  
CLEAN=0
# ---------------------------------------------------------
# AB HIER NICHTS MEHR ÄNDERN
# ---------------------------------------------------------
DATUM="$(date +%d-%m-%Y)"  
LOG="${LOGZIEL}/${DATUM}.log"  
LOG_ERR="${LOGZIEL}/${DATUM}_err.log"  
ZIEL=""  
MOUNTED=0
DEVICE=""  
 
mail_err ()
{ 
  echo | mail -s "${DATUM}, $(date +%H:%M) Backup-Fehler" $MAIL < $LOG_ERR  
} 
 
mail_final ()
{ 
  echo | mail -s "${DATUM}, $(date +%H:%M) Backup-Erfolg" $MAIL <$LOG  
} 
 
#USB-Platten werden gemountet 
for i in $(seq 1 $PLATTEN); do
    if [ $MOUNTED = 0 ]; then
	echo "Datum: "$DATUM >> $LOG  
	echo "Zeit: "$(date +%H:%M) >> $LOG  
#	echo | mount $USB$DEVICE -o force 1>> $LOG 2>> $LOG_ERR
	echo | mount FILESERVER:/hdd2/vm/ /mnt/cdrom/
	if [ $? = 0 ]; then
	    ZIEL=$USB"/"$BACKUPORDNER  
	    MOUNTED=1
	    echo "${USB}${DEVICE} gemountet." >>$LOG  
	else
	    DEVICE=$(( $DEVICE + 1 ))
	fi
    fi
done
 
#Wenn keine der Platten eingebunden werden kann: EXIT mit Error-Mail
if [ $MOUNTED = 0 ]; then
    echo "Keine Speichermedien gefunden. Backup wurde abgebrochen!" >>$LOG_ERR  
	mail_err
    exit
fi
 
#Wenn nicht vorhanden wird Backup-Ordner erstellt.
if ! [ -d $ZIEL ]; then
	echo "Erstelle Ziel-Ordner (${ZIEL})." >>$LOG  
	echo | mkdir $ZIEL 1>> $LOG 2>> $LOG_ERR
		if ! [ $? = 0 ]; then
			echo "Ordner $ZIEL konnte nicht erstellt werden. Backup wird abgebrochen." >>$LOG  
			mail_err
			exit
			else
				echo "Ordner ${ZIEL} wurde erstellt." >> $LOG  
			fi
 
else
	echo "Ordner (${ZIEL}) bereits vorhanden." >> $LOG  
fi
 
#Speicherplatzabfrage. 
#Wenn CLEAN auf 1 gesetzt, wird bei zu geringem Speicherplatz der Backupordner gelöscht. 
#Backup-Rotation in Planung....
#S="/" 
#MB=0
#MENGEQ=" GB" 
#MENGEZ=" GB" 
#MENGED=" GB" 
#LIMIT=1
#LAUF=2
#END=0
#echo 1
#for i in $(seq 1 $LAUF); do
#	if [ $END = 0 ]; then
#		QUELLE=$(du -s $S$VM_BACKUP1 | tr -s " " | cut -d "/" -f 1) 
#		ZIEL1=$(df $S$ZIEL | tr -s " " | cut -d " " -f 4 | grep -v "Avai") 
#		QUELLEERG=$(( $QUELLE / 1048576 ))
#			if [ $QUELLEERG -lt $LIMIT ]; then
#				QUELLEERG=$(( $QUELLE / 1024 ))
#				MB=1
#				MENGEQ=" MB"  
#			fi
# 
#		ZIELERG=$(( $ZIEL1 / 1048576 ))
#			if [ $MB = 1 ]; then
#				ZIELERG=$(( $ZIEL1 / 1024 ))
#				MENGEZ=" MB" 
#				MENGED=" MB"  
#			fi
 #
#		DIFFERENZ=$(( $ZIELERG - $QUELLEERG ))
#		PROZENT=$(( $DIFFERENZ * 100 / $ZIELERG ))
#		NUTZ=$(( 100 - $PROZENT ))
 #
#				if  [ $ZIELERG -lt $QUELLEERG ]; then
#					if [ $CLEAN = 1 ]; then
#						echo "Größe VM........................: "$QUELLEERG$MENGEQ >> $LOG  
#						echo "Verfügbarer Speicherplatz.......: "$ZIELERG$MENGEZ >> $LOG  
#						echo "Freier Speicherplatz nach Backup: "$DIFFERENZ$MENGED >> $LOG  
#						echo "Platzbedarf in %................: "$NUTZ" %" >> $LOG  
#						echo " " >> $LOG  
#						echo "Speicherplatz nicht ausreichend. Ordner ${ZIEL} wird geleert." >> $LOG  
#						echo "...." >> $LOG  
#						echo | touch $ZIEL/test.file 1>> $LOG 2>> $LOG_ERR
#						echo | rm -r $ZIEL/* 1>> $LOG 2>> $LOG_ERR
#					else
#						echo "Größe VM........................: "$QUELLEERG$MENGEQ >> $LOG_ERR  
#						echo "Verfügbarer Speicherplatz.......: "$ZIELERG$MENGEZ >> $LOG_ERR  
#						echo "Freier Speicherplatz nach Backup: "$DIFFERENZ$MENGED >> $LOG_ERR  
#						echo "Platzbedarf in %................: "$NUTZ" %" >> $LOG_ERR  
#						echo " " >> $LOG_ERR  
#						echo "Speicherplatz nicht ausreichend. Backup-Vorgang wird abgebrochen." >> $LOG_ERR  
#						mail_err
#						exit
#					fi
#				else
#					END=1
#					echo "Größe VM........................: "$QUELLEERG$MENGEQ >> $LOG  
#					echo "Verfügbarer Speicherplatz.......: "$ZIELERG$MENGEZ >> $LOG  
#					echo "Freier Speicherplatz nach Backup: "$DIFFERENZ$MENGED >> $LOG  
#					echo "Platzbedarf in %................: "$NUTZ" %" >> $LOG  
#					echo " " >> $LOG  
#					echo "Speicherplatz ausreichend. Backup wird gestartet." >> $LOG  
#				fi				
#	fi
#done
 
# VMs in den Suspend setzen und Erfolg abfragen
# 0 = i.O.
# 255 = Fehler
 
echo | vmrun -T server -h $IP -u $USER -p $PW suspend "[ha-datacenter/standard] $VM_ORDNER1/$VM_1" 1>>$LOG 2>>$LOG_ERR  
if  [ $? = 255 ]; then
		echo "ACHTUNG: Die Virtuelle Maschine ($VM_ORDNER1/$VM_1) konnte nicht in den Suspend Modus versetzt werden." >>$LOG_ERR  
		echo "Backup wurde abgebrochen" >>$LOG_ERR  
		umount $USB$DEVICE >> $LOG_ERR
		mail_err
		exit
			else
				echo "$(date +%H:%M): Virtuelle Maschine ($VM_1) wurde erfolgreich in den Suspend-Mode versetzt" >>$LOG  
fi	
 
 
 
#Verzeichnis für neues Backup erstellen falls noch nicht vorhanden
if ! [ -d $ZIEL/$DATUM ]; then
		echo | mkdir $ZIEL/$DATUM >> $LOG
fi
 
#Jetzt kann tar loslegen
cd /
echo | tar -czvf $ZIEL/$DATUM/$DATUM.tar.gz $VM_BACKUP1 1>>$LOG 2>>$LOG
 
#Auf Fehler während tar prüfen:
# 0 = fehlerfrei,
echo "Errorlevel TAR: "$? >> $LOG   
 
if  [ $? != 0 ] ; then
    echo "ACHTUNG: Beim Backup (tar) von (${VM_BACKUP1}) wurden am ${DATUM} um $(date +%H:%M) Uhr Fehler/Meldungen ausgegeben!" >>$LOG  
    echo "Das erstellte Archiv befinden sich in ${ZIEL}/${DATUM}/${DATUM}.tar.gz" >>$LOG  
	umount $USB$DEVICE >> $LOG
    echo | vmrun -T server -h $IP -u $USER -p $PW start "[standard] $VM_ORDNER1/$VM_1" 1>>$LOG 2>>$LOG_ERR  
 
		# Prüfen ob VM gestartet werden konnte
		if  [ $? = 255 ]; then
			echo "ACHTUNG: Die Virtuelle Maschine ($VM_ORDNER1/$VM_1) konnte nicht gestartet werden." >>$LOG_ERR  
			mail_err
			else
 
			echo "$(date +%d-%m-%Y): Virtuelle Maschine ($VM_1) wurde erfolgreich gestartet" >>$LOG  
		fi 
 
		mail_final
		exit
 
		else
			echo | vmrun -T server -h $IP -u $USER -p $PW start "[standard] $VM_ORDNER1/$VM_1" 1>>$LOG 2>>$LOG_ERR  
 
			#Prüfen ob VM gestartet werden konnte
			if  [ $? = 255 ]; then
				echo "ACHTUNG: Die Virtuelle Maschine ($VM_ORDNER1/$VM_1) konnte nicht gestartet werden." >>$LOG_ERR  
				mail_err
					else
						echo "-------------------------------------------------------------------" >>$LOG  
						echo "$(date +%H:%M): Virtuelle Maschine ($VM_1) wurde erfolgreich gestartet" >>$LOG      
					fi
		#Backup war erfolgreich also beenden wir die .log entsprechend und verschicken die Mail	 
		echo "------------------------------------------------------------ " >> $LOG  
		echo "Das Backup von ${VM_1} wurde am ${DATUM} um $(date +%H:%M) Uhr erfolgreich beendet und in ${ZIEL}/${DATUM}/${DATUM}.tar.gz gespeichert." >> $LOG  
		umount $USB$DEVICE 1>>$LOG 2>>$LOG_ERR
		mail_final
 
fi
Mitglied: 64748
64748 Mar 06, 2013 at 19:00:36 (UTC)
Goto Top
Wie schon geschrieben, in den if-Ausdrücken muss == anstatt = stehen.

Und bei den Ordnernamen hast Du mindestens einen Fehler,
markus@samsung:~$ LOGZIEL="/hdd1/vm/"
markus@samsung:~$ DATUM="$(date +%d-%m-%Y)"
markus@samsung:~$ LOG="${LOGZIEL}/${DATUM}.log"
markus@samsung:~$ echo $LOGZIEL
/hdd1/vm/
markus@samsung:~$ echo $DATUM
06-03-2013
markus@samsung:~$ echo $LOGZIEL
/hdd1/vm/
markus@samsung:~$ echo $LOG
/hdd1/vm//06-03-2013.log
Du musst entweder
LOG="${LOGZIEL}${DATUM}.log"
schreiben, oder den Pfad
LOGZIEL=/hdd1/vm
schreiben, sonst ist der slash '/' doppelt.

Und Du kannst die meisten Anführungszeichen weglassen.

Markus
Mitglied: 64748
64748 Mar 06, 2013 at 20:15:18 (UTC)
Goto Top
Jetzt hab ich mal überall echo reingesetzt und das hier ist die Ausgabe davon
VM_ORDNER1 = w7-vm01
VM_BACKUP1 = hdd2/vm/
VM_1 = Windows7.vmx
BACKUPORDNER = backup
LOGZIEL = /hdd1/vm/
USER = root
PW = passwort
IP = https://hostname.domain.com/sdk
PLATTEN = 2
USB = /mnt/cdrom
CLEAN = 0
DATUM = 06-03-2013
LOG = /hdd1/vm//06-03-2013.log
LOG_ERR = /hdd1/vm//06-03-2013_err.log
ZIEL =
MOUNTED = 0
DEVICE =
USB mounten
i = 1
./bkp_2.sh: Zeile 61: /hdd1/vm//06-03-2013.log: Datei oder Verzeichnis nicht gefunden
./bkp_2.sh: Zeile 62: /hdd1/vm//06-03-2013.log: Datei oder Verzeichnis nicht gefunden
mount: Nur „root“ kann dies tun
DEVICE = 1
i = 2
./bkp_2.sh: Zeile 61: /hdd1/vm//06-03-2013.log: Datei oder Verzeichnis nicht gefunden
./bkp_2.sh: Zeile 62: /hdd1/vm//06-03-2013.log: Datei oder Verzeichnis nicht gefunden
mount: Nur „root“ kann dies tun
DEVICE = 2
Keine Speichermedien gefunden. Backup wurde abgebrochen!
./bkp_2.sh: Zeile 101: /hdd1/vm//06-03-2013.log: Datei oder Verzeichnis nicht gefunden
./bkp_2.sh: Zeile 176: vmrun: Kommando nicht gefunden.
ACHTUNG: Die Virtuelle Maschine (w7-vm01/Windows7.vmx) konnte nicht in den Suspend Modus versetzt werden.
Backup wurde abgebrochen
umount: /mnt/cdrom2 ist laut „mtab“ nicht eingehängt
mkdir: das Verzeichnis „/06-03-2013“ kann nicht angelegt werden: Keine Berechtigung
tar -czvf /06-03-2013/06-03-2013.tar.gz hdd2/vm/
./bkp_2.sh: Zeile 201: /hdd1/vm//06-03-2013.log: Datei oder Verzeichnis nicht gefunden
ACHTUNG: Beim Backup (tar) von (hdd2/vm/) wurden am 06-03-2013 um 20:38 Uhr Fehler/Meldungen ausgegeben!
Das erstellte Archiv befinden sich in /06-03-2013/06-03-2013.tar.gz
./bkp_2.sh: Zeile 206: /hdd1/vm//06-03-2013.log: Datei oder Verzeichnis nicht gefunden
./bkp_2.sh: Zeile 207: vmrun: Kommando nicht gefunden.
06-03-2013: Virtuelle Maschine (Windows7.vmx) wurde erfolgreich gestartet
wobei die Verzeichnisse und Dateien hier natürlich nicht vorhanden sind,

Markus
Mitglied: 64748
64748 Mar 07, 2013 updated at 09:28:10 (UTC)
Goto Top
Ich habe bei der Berechnung des Verfügbaren Speicherplatzes eine Fehler gemacht. Folgendes Skript nimmt zwei Argumente, 1. einen String der die Partition identifiziert und 2. den kompletten Pfad zur Datei (VM)
#!/bin/sh

# Zwei Argumente, 1. Partition und 2. Datei mit vollstaendigem Pfad
AVAIL=$(df --output=target,avail | grep $1 | awk '{ print $2 }')  
echo $AVAIL

FILESIZE=$(ls -l $2 | awk '{ print $5 }')  
echo $FILESIZE

if (( $AVAIL < $FILESIZE )); then
    echo "Nicht genug Speicherplatz"  
    exit 1 
else
    echo "Genug Speicherplatz verfuegbar"  
    exit 0 
fi
Der Rückgabewert ist 0 wenn genug Platz und 1 anderenfalls. Allerdings rechnet es nicht sehr genau, es wäre also noch genug Platz, wenn der verfügbare Platz und die Dateigröße auf ein Byte genau gleich sind. Das kann man aber problemlos ändern.

Den kompletten Codeblock zum Berechnen des Speicherplatzes und evtl. Löschen von Backups würde ich so nicht schreiben, es reicht aus, wenn das Skript bei zu wenig Speicher mit einer entsprechenden Fehlermeldung abbricht, dann kann man manuell löschen und es nochmal starten.

Markus