Virtualbox Script zum exportieren einer VM

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
irgendwas
Beiträge: 278
Registriert: 04.04.2016 18:53:19
Lizenz eigener Beiträge: MIT Lizenz

Virtualbox Script zum exportieren einer VM

Beitrag von irgendwas » 16.08.2016 06:43:59

Hallo zusammen,

ich hab im Netz ein Script gefunden (und etwas bearbeitet), um eine laufende VM zu exportieren.
Leider schaffe ich es nicht, dass nur eine bestimmte VM (Debian8_1) exportiert wird.
Genauer gesagt ist es diese Zeile, die ja dann alle laufenden VMs auflistet

Code: Alles auswählen

for VMNAME in $(vboxmanage list runningvms | cut -d " " -f 1 | sed -e 's/^"//'  -e 's/"$//')
Ich möchte an dieser Stelle nur eine bestimmte und nicht alle laufenden VMs sichern und werde über die Doku nicht schlauer.
Habt ihr vielleicht eine Idee?

Code: Alles auswählen

#!/bin/bash
 
# This scripts loops through all the user's VirtualBox vm's, pauses them,
# exports them and then restores the original state.
#
# VirtualBox's snapshot system is not stable enough for unmonitored use yet.
#
# Vorkbaard, 2012-02-01
 
# =============== Set your variables here ===============
 
  EXPORTDIR=/media/*****
  MYMAIL=*****
  VBOXMANAGE="/usr/bin/VBoxManage -q"
  DATE=$(date +%Y-%m-%d_%H-%M)
 
# =======================================================
 
# Generate a list of all vm's; use sed to remove the double quotes.
 
# Note: better not use quotes or spaces in your vm name. If you do,
# consider using the vms' ids instead of friendly names:
# for VMNAME in $(vboxmanage list vms | cud -t " " -f 2)
# Then you'd get the ids in your mail so you'd have to use vboxmanage 
# showvminfo $id or something to retrieve the vm's name. I never use
# weird characters in my vm names anyway.
 
for VMNAME in $(vboxmanage list runningvms | cut -d " " -f 1 | sed -e 's/^"//'  -e 's/"$//')
do
 
  ERR="nothing"
  SECONDS=0
 
  # Get the vm state
    VMSTATE=$(vboxmanage showvminfo Debian8_1 --machinereadable | grep "VMState=" | cut -f 2 -d "=")
    echo "$VMNAME's state is: $VMSTATE."
 
  # If the VM's state is running or paused, save its state
    if [[ $VMSTATE == \"running\" || $VMSTATE == \"paused\" ]]; then
      echo "Saving state..."
      vboxmanage controlvm "Debian8_1" acpipowerbutton
      if [ $? -ne 0 ]; then ERR="saving the state"; fi
    fi
 
  # Export the vm as appliance
    if [ "$ERR" == "nothing" ]; then
      echo "Exporting the VM..."
      sleep 10
      vboxmanage export "Debian8_1" --ovf20 --output /media/*****/Debian8_$DATE.ova
      if [ $? -ne 0 ]; then
        ERR="exporting"
      else
       # Get file size
       FILESIZE=$(du -h $EXPORTDIR/Debian8_$DATE.ova | cut -f 1)
       fi
    else
      echo "Not exporting because the VM's state couldn't be saved."
    fi
 
  # Resume the VM to its previous state if that state was paused or running
    if [[ $VMSTATE == \"running\" || $VMSTATE == \"paused\" ]]; then
        echo "Resuming previous state..."
        vboxmanage startvm "Debian8_1" --type headless
        #vboxmanage import /media/*****/Debian8_$DATE.ova
        if [ $? -ne 0 ]; then ERR="resuming"; fi
        if [ $VMSTATE == \"paused\" ]; then
          vboxmanage controlvm $VMNAME pause
          if [ $? -ne 0 ]; then ERR="pausing"; fi
        fi
      fi
done
Das hier ist dann die Fehlermeldung, die ich per E-Mail bekomme:

Code: Alles auswählen

Debian8_1's state is: "running".
Saving state...
Exporting the VM...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Successfully exported 1 machine(s).
Resuming previous state...
Waiting for VM "Debian8_1" to power on...
VM "Debian8_1" has been successfully started.
Debian8_pyload's state is: "running".
Saving state...
Exporting the VM...
0%...
Progress state: VBOX_E_FILE_ERROR
VBoxManage: error: Appliance write failed
VBoxManage: error: Could not create OVA file '/media/*****/Debian8_2016-08-16_05-00.ova' (VERR_ALREADY_EXISTS)
VBoxManage: error: Details: code VBOX_E_FILE_ERROR (0x80bb0004), component Appliance, interface IAppliance
VBoxManage: error: Context: "int handleExportAppliance(HandlerArg*)" at line 1121 of file VBoxManageAppliance.cpp
Resuming previous state...
VBoxManage: error: The machine 'Debian8_1' is already locked by a session (or being locked or unlocked)
VBoxManage: error: Details: code VBOX_E_INVALID_OBJECT_STATE (0x80bb0007), component Machine, interface IMachine, callee nsISupports
VBoxManage: error: Context: "LaunchVMProcess(a->session, sessionType.raw(), env.raw(), progress.asOutParam())" at line 592 of file VBoxManageMisc.cpp

owl102

Re: Virtualbox Script zum exportieren einer VM

Beitrag von owl102 » 16.08.2016 08:45:08

nobody2311 hat geschrieben:Leider schaffe ich es nicht, dass nur eine bestimmte VM (Debian8_1) exportiert wird.
Genauer gesagt ist es diese Zeile, die ja dann alle laufenden VMs auflistet

Code: Alles auswählen

for VMNAME in $(vboxmanage list runningvms | cut -d " " -f 1 | sed -e 's/^"//'  -e 's/"$//')
Ich möchte an dieser Stelle nur eine bestimmte und nicht alle laufenden VMs sichern
Dann ersetze die Zeile einfach durch

Code: Alles auswählen

VMNAME="Debian8_1"
und werfe "do" und "done" der dazugehörigen Schleife weg. (Oder ersetze alternativ die obrige Zeile durch "for VMNAME in Debian8_1", das hätte auch den Vorteil, daß man es später einfach um weitere VMs ergänzen kann.) Und mache deine anderen Änderungen rückgängig. Im Moment ist es so, daß wenn du 5 VMs hast, er fünf mal die Debian-VM sichern möchte.
VBoxManage: error: Could not create OVA file '/media/*****/Debian8_2016-08-16_05-00.ova' (VERR_ALREADY_EXISTS)
Das Script prüft nicht, ob schon eine Sicherung existiert. Und VBoxManage wirft obrige Fehlermeldung, wenn die Sicherung bereits existiert.
Zuletzt geändert von owl102 am 23.08.2016 14:10:34, insgesamt 1-mal geändert.

irgendwas
Beiträge: 278
Registriert: 04.04.2016 18:53:19
Lizenz eigener Beiträge: MIT Lizenz

Re: Virtualbox Script zum exportieren einer VM

Beitrag von irgendwas » 16.08.2016 10:46:25

Danke für deine schnelle Antwort ;)

Würdest du mir verraten, was das für eine Programmiersprache ist?
Dann könnte ich schauen, wie Schleifen aufgebaut sind und sie entfernen.
owl102 hat geschrieben:Im Moment ist es so, daß wenn du 5 VMs hast, er fünf mal die Debian-VM sichern möchte.

Das Script prüft nicht, ob schon eine Sicherung existiert. Und VBoxManage wirft obrige Fehlermeldung, wenn die Sicherung bereits existiert.
Ja, so war auch das ursprüngliche Skript.. Es wurden dann alle VMs gesichert, egal ob sie liefen oder nicht.. Mit der Doku konnt ich das dann zumindest auf die laufenden VMs beschränken

Benutzeravatar
iKilledKenny
Beiträge: 31
Registriert: 21.03.2011 09:38:46

Re: Virtualbox Script zum exportieren einer VM

Beitrag von iKilledKenny » 16.08.2016 14:44:47

Das ist ein bash Script, also ein Shell Script.

irgendwas
Beiträge: 278
Registriert: 04.04.2016 18:53:19
Lizenz eigener Beiträge: MIT Lizenz

Re: Virtualbox Script zum exportieren einer VM

Beitrag von irgendwas » 16.08.2016 21:01:50

Nach unzähligen versuchen/varianten hat es nun geklappt ;) Ist einfacher als man denkt...wenn man das script als Benutzer "vbox" startet ^^

Danke für eure Hilfe :THX:

irgendwas
Beiträge: 278
Registriert: 04.04.2016 18:53:19
Lizenz eigener Beiträge: MIT Lizenz

Re: Virtualbox Script zum exportieren einer VM

Beitrag von irgendwas » 23.08.2016 12:16:00

Nachtrag: Ich würde in das Script gerne ein paar Zeilen einfügen, damit Dateien, die älter als z.B. 30 Tage sind automatisch gelöscht werden.

Im Moment bin ich soweit:

Code: Alles auswählen

#!/bin/bash
echo "Dateien älter als 30 Tage:"
find "VERZEICHNIS" -type f -mtime +30 | xargs ls -l
Wenn ich das Script als Benutzer "rsync" starte, dann erhalte ich folgende Ausgabe:

Code: Alles auswählen

$ bash ./vm-rm.sh
Dateien älter als 30 Tage:
-rw-------+ 1 rsync ds        4327907328 Aug 10 08:35 Debian8_2016-08-10_08-27.ova
-rw-------+ 1 rsync ds        4440093696 Aug 13 05:06 Debian8_2016-08-13_05-00.ova
-rw-------+ 1 rsync ds        4510857728 Aug 16 05:06 Debian8_2016-08-16_05-00.ova
-rw-------+ 1 rsync ds        4499406336 Aug 16 20:38 Debian8_2016-08-16_20-31.ova
-rw-------+ 1 rsync ds        4537549312 Aug 19 05:07 Debian8_2016-08-19_05-00.ova
-rw-------+ 1 rsync ds        4537659904 Aug 22 05:07 Debian8_2016-08-22_05-00.ova
-rwxrwx--x+ 1 rsync ds               173 Aug 23 12:10 vm-rm.sh
Leider sind die Dateien nicht älter als 30 Tage, sondern jünger.. :cry:
Hab ich was übersehen? Oder listet "find" die Dateien nur auf, wenn welche gefunden werden und ansonsten alle?

EDIT: Problem behoben! Lösung findet sich hier: https://wiki.ubuntuusers.de/find/#xargs-und-Schleifen

Code: Alles auswählen

#!/bin/bash
echo "Dateien älter als 30 Tage:"
find "VERZEICHNIS" -type f -mtime +30 -ls

Antworten