Inicio

Script BATCH para crear copias de seguridad de máquinas virtuales de VirtualBox desde Windows

Sábado, 21 de noviembre de 2015

0
+1.6K6

Si trabajas con VirtualBox y necesitas realizar copias de seguridad de tus máquinas virtuales, aquí tienes un script para hacerlo desde sistemas operativos Windows con un solo clic.

Publicidad

Script BATCH para crear copias de seguridad de máquinas virtuales de VirtualBox desde Windows

Para quienes trabajamos con herramientas de virtualización es muy útil disponer de copias de seguridad completas de nuestras maquinas virtuales, ya que en un caso extremo (y que esperamos que nunca ocurra) tan solo tenemos que hacer uso del backup más reciente para salir del contratiempo o, al menos, minimizarlo todo lo que sea posible.

El problema suele ser venir a la hora de determinar en qué momento vamos a realizar la copia de seguridad, ya que para copiar una máquina de VirtualBox es necesario detenerla o guardar su estado previamente. En este sentido, lo más usual es programar este tipo de tareas para que se realicen automáticamente de madrugada, o en aquellas horas en las que el período de inactividad de la máquina virtual ocasione el menor perjuicio posible.

Pues bien, para hacer esto de un modo rápido y sencillo he creado dos scripts (archivos de procesamiento por lotes BAT o BATCH) que funcionan bajo sistemas operativos Windows, que se pueden descargar desde el siguiente enlace:

Como podrás observar, al inicio del código son definidas varias variables, que habrá que establecer según el entorno y la configuración del sistema en el que se vayan a utilizar. En concreto, son la siguientes:

Además, en caso de que utilicemos el primer tipo (el que apaga la máquina virtual mediante ACPI), también será necesario definir las siguientes variables:

Script 1: backup-vm.bat

Bien, pues veamos con más detalle qué acciones realiza cada uno de los scripts. El primero de ellos, backup-vm.bat, hace lo siguiente:

Y aquí está su código fuente:

@ECHO OFF
CLS

SET "VM=Ubuntu Server 14.04"
SET "VM_DIR=C:\VirtualBox VMs\"
SET "BACKUP_DIR=C:\VirtualBox VMs\backup\"
SET VBOXMANAGE="C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"
SET RAR="C:\Program Files\WinRAR\Rar.exe"
SET CICLOS=10
SET PAUSAS=5
SET SOLICITUD_APAGADO=0
SET ERROR=0
SET RUNNING_INICIAL=2

ECHO Iniciando copia de seguridad de la VM "%VM%"...

:check_running
%VBOXMANAGE% list runningvms > %TEMP%\runningvms.txt
FIND "%VM%" %TEMP%\runningvms.txt > nul

IF %errorlevel% EQU 0 (
    SET RUNNING=1
) ELSE (
    SET RUNNING=0
)

IF %RUNNING_INICIAL% EQU 2 (
    SET RUNNING_INICIAL=%RUNNING%
)

IF %CICLOS% GTR 0 (
    IF %RUNNING% EQU 1 (
        IF %SOLICITUD_APAGADO% EQU 0 (
            SET SOLICITUD_APAGADO=1
            ECHO Apagando la VM "%VM%"...
            %VBOXMANAGE% controlvm "%VM%" acpipowerbutton
        )

        ECHO Esperando a que se apague la VM "%VM%"...
        TIMEOUT /t %PAUSAS% /nobreak > nul
        SET /a CICLOS-=1
        GOTO check_running
    ) ELSE (
        ECHO VM "%VM%" apagada...
    )
)

DEL %TEMP%\runningvms.txt

IF %RUNNING% EQU 1 (
    SET ERROR=1
    GOTO end
)

:copy_vm
ECHO Copiando VM "%VM%"...
TIMEOUT /t 3 /nobreak > nul
XCOPY "%VM_DIR%%VM%" "%BACKUP_DIR%%VM%" /E /I /Y

IF %errorlevel% NEQ 0 (
    SET ERROR=2
    GOTO end
)

:start_vm
IF %RUNNING_INICIAL% EQU 1 (
    ECHO Iniciando la VM "%VM%"...
    %VBOXMANAGE% startvm "%VM%"
    
    IF %errorlevel% NEQ 0 (
        SET ERROR=3
        GOTO end
    )
)

:compress_backup
ECHO Comprimiendo copia de seguridad de la VM "%VM%"...
SET FECHA=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%
%RAR% a -r -ep1 -o+ "%BACKUP_DIR%%VM% %FECHA%.rar" "%BACKUP_DIR%%VM%"

IF %errorlevel% NEQ 0 (
    SET ERROR=4
    GOTO end
)

:delete_uncompressed_backup
ECHO Eliminando copia de seguridad no comprimida de la VM "%VM%"...
RMDIR "%BACKUP_DIR%%VM%" /S /Q

IF %errorlevel% NEQ 0 (
    SET ERROR=5
    GOTO end
)

:end
IF %ERROR% GTR 0 (
    ECHO Se ha producido un error ^(%ERROR%^) al realizar la copia de seguridad de la VM "%VM%".
) ELSE (
    ECHO La copia de seguridad ha finalizado correctamente.
)

Script 2: export-vm.bat

El segundo de ellos, export-vm.bat, es una variante del primero sugerida por mis amigos Juanmi y Carlos, del Servicio Provincial Tributario de la Diputación de Granada. Este script utiliza el comando export de VirtualBox para exportar la máquina virtual en formato OVF y sus discos en formato VMDK.

Utilizar este modo puede resultar más elegante que hacerlo con el anterior y, además, se garantiza la compatibilidad con otras versiones de VirtualBox o con otro software de virtualización, como VMware. Sin embargo, también presenta algunos inconvenientes, como que la compresión obtenida es menor y que el tiempo durante el cual la máquina virtual se encuentra inoperativa es mayor que con la primera versión del script. Ya será decisión de cada uno elegir un método u otro, según su entorno y sus necesidades.

Este script realiza lo siguiente:

Su código fuente es el siguiente:

@ECHO OFF
CLS

SET "VM=Ubuntu Server 14.04"
SET "VM_DIR=C:\VirtualBox VMs\"
SET "BACKUP_DIR=C:\VirtualBox VMs\backup\"
SET VBOXMANAGE="C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"
SET ERROR=0
SET RUNNING_INICIAL=2

ECHO Iniciando copia de seguridad de la VM "%VM%"...

:check_running
%VBOXMANAGE% list runningvms > %TEMP%\runningvms.txt
FIND "%VM%" %TEMP%\runningvms.txt > nul

IF %errorlevel% EQU 0 (
    SET RUNNING_INICIAL=1
) ELSE (
    SET RUNNING_INICIAL=0
)

DEL %TEMP%\runningvms.txt

IF %RUNNING_INICIAL% EQU 1 (
    ECHO Guardando estado de la VM "%VM%"...
    %VBOXMANAGE% controlvm "%VM%" savestate

    IF %errorlevel% NEQ 0 (
        SET ERROR=1
        GOTO end
    )
)

:export_vm
ECHO Exportando VM "%VM%"...
TIMEOUT /t 3 /nobreak > nul
SET FECHA=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%
%VBOXMANAGE% export "%VM%" -o "%BACKUP_DIR%%VM% %FECHA%.ovf"

IF %errorlevel% NEQ 0 (
    SET ERROR=2
    GOTO end
)

:start_vm
IF %RUNNING_INICIAL% EQU 1 (
    ECHO Iniciando la VM "%VM%"...
    %VBOXMANAGE% startvm "%VM%"
    
    IF %errorlevel% NEQ 0 (
        SET ERROR=3
        GOTO end
    )
)

:end
IF %ERROR% GTR 0 (
    ECHO Se ha producido un error ^(%ERROR%^) al realizar la copia de seguridad de la VM "%VM%".
) ELSE (
    ECHO La copia de seguridad ha finalizado correctamente.
)

Para descargar las dos variantes de este script, no tenéis más que hacer clic en el siguiente enlace:

Como siempre, espero que este aporte sea de gran utilidad y no olvides dejarnos tu comentario.

Publicidad

6 comentarios

1

Peter Griffin

Carmelo Carrillo

17 de febrero de 2016 a las 11:20 h.17-feb-2016 11:20 h.

Hola!

Fantástico. Es justo lo que estaba buscando. Muy bien pensado.

Muchas gracias.

ResponderChrome 46.0.2486.0Windows

2

Antonio FR

Antonio

18 de febrero de 2016 a las 23:06 h.18-feb-2016 23:06 h.

@Carmelo Carrillo:

Me alegra saber que mi esfuerzo le sirve a otra gente.

Un saludo.

ResponderSafari 8.0iOS 8.4.1

3

Bender

Diego

10 de marzo de 2016 a las 14:43 h.10-mar-2016 14:43 h.

Genial, estaba buscando exactamente lo que hacen tus scripts! te pasaste!

ResponderChrome 48.0.2564.116Windows 7

4

Alf

Ramón

8 de abril de 2016 a las 13:17 h.8-abr-2016 13:17 h.

Hola, estupendo post!! nos has ayudado un montón.

Sin querer abusar de ti te planteo una mejora que queremos incorporar y en script estamos un poco verdes... u oxidados, segun se mire..

¿Como implementarías algo parecido pero para todas las máquinas virtuales que esten iniciadas sin tener que indicarlo "a pelo" en el script para cada una?

habíamos pensado recorrer las carpetas donde se almacenan las máquinas virtuales, y para cada una de ellas:

- pararla

- hacer la copia

- eliminar la penúltima copia que exista para esa maquina y así mantener simpre 2 copias

La verdad es que no tengo muy claro la sintasis para hacerlo

Muchas Gracias de antemano

ResponderFirefox 45.0Windows 8.1

5

Antonio FR

Antonio

8 de abril de 2016 a las 13:39 h.8-abr-2016 13:39 h.

Hola @Ramón:

Podrías hacerlo de este modo. En primer lugar, listas las máquinas virtuales que se encuentran en ejecución y guardas la salida en un fichero de texto:

VBoxManage.exe list runningvms > vms.txt

A continuación, creas un nuevo BAT que recorra el fichero anterior y procese línea a línea. Esto te puede servir (extraído de http://stackoverflow.com/questions/4527877/batch-script-read-line-by-line ):

@echo off

for /f "tokens=*" %%a in (vms.txt) do call :processline %%a

pause

goto :eof

:processline

echo line=%*

goto :eof

:eof

Lo único que en la sección processline deberías llamar al script de backup, pero modificándolo ligeramente para que el nombre de la VM lo reciba mediante un parámetro.

Espero que os sirva.

ResponderFirefox 45.0Windows 7

6

Zoidberg

Skiny62

2 de enero de 2017 a las 20:57 h.2-ene-2017 20:57 h.

Felicidades !!

Un gran guión completamente funcional para la copia de seguridad de la máquina virtual

¡muchas gracias

ResponderChrome 51.0.2704.79Windows

Deja tu comentario

Puedes utilizar el siguiente formulario para aportar tu opinión o contestar a otros usuarios. Por favor, sé educado y respetuoso con los demás y no olvides revisar la ortografía. Si tu comentario es muy extenso, separa el texto en varios párrafos.

  • Introduce tu nombre. No temas, Michu no tiene un Death Note.
  • Debes introducir tu dirección de correo electrónico.

Acepto el aviso legal y la política de privacidad de este sitio web.