Buscar entradas

Migrar máquinas virtuales a otro almacenamiento

Proxmox-10-years-logo

Puede darse el caso de que necesitemos mover en nuestro proxmox las máquinas virtuales de un almacenamiento a otro.

La forma tradicional de hacer ésto era:

  1. Realizar una copia de seguridad de la máquina virtual (mejor en modo ‘Stop’ para evitar inconsistencias en los datos, que son raras pero existen).
  2. Eliminar la máquina virtual del proxmox
  3. Restaurar la máquina virtual en el almacenamiento deseado a partir de la copia de seguridad

Sin embargo, buscando por ahí encontré un artículo donde se publica un script que resuelve el problema mediante línea de comandos. El artículo es el siguiente:

Move Proxmox Container to Different Storage

Por si acaso alguien decide eliminar el artículo, copio el script:

#!/bin/bash
#
# Filename : migrate
# Description : Migrate Proxmox OpenVZ container from one storage to another
# Author : James Coyle
#
# Version:
# -Date       -Author      -Description
# 20-11-2013  James Coyle  Initial
#
#
 
# Variables
TMP=/home/HDD1_50GB/tmpdir      #Location to use to create the backup for transferring to new storage. This needs to be big enough to store the backup archive for the container.
DELETE=false  #by default it deletes the backup file
 
# Do not edit
usage() {
    echo "Usage: $0"
    echo "          [-c Required: Container ID to migrate <int>] "
    echo "          [-s Required: Target storage ID <string>]"
    echo "          [-d Optional: Delete the backup file after CT restoration <boolean>]"
    echo ""
    echo "Example: $0 -c 100 -s nasarray"
    echo ""
    exit 1;
}
 
while getopts "c:s:d" o; do
  case "${o}" in
    c)
      CT=${OPTARG}
      ;;
    s)
      TARGET_STORAGE=${OPTARG}
      ;;
    d)
      DELETE=true
      ;;
    *)
      usage
      ;;
    esac
done
shift $((OPTIND-1))
 
# Check mandatory fields
if [ -z "${CT}" ] || [ -z "${TARGET_STORAGE}" ]; then
  usage
fi
 
RUNNING=false
 
set -e
set -o pipefail
 
echo "Moving $CT to $TARGET_STORAGE..."
if vzlist | fgrep -w -q " $CT "
then
    RUNNING=true
fi
 
if $RUNNING
then
    vzctl stop $CT
fi
 
vzdump --dumpdir $TMP $CT
 
ARCHIVE=$(ls -t $TMP/vzdump-openvz-$CT-*.tar | head -n 1)
 
vzrestore $ARCHIVE $CT -force -storage $TARGET_STORAGE
 
if $RUNNING
then
    vzctl start $CT
fi
 
if $DELETE
then
    LOG=$(ls -t $TMP/vzdump-openvz-$CT-*.log | head -n 1)
    echo "Deleting $LOG and $ARCHIVE"
    rm -rf $ARCHIVE $TMP/$LOG
fi

Solamente he hecho dos cambios en el script para que me funcione correctamente:

  • Modificar el directorio temporal porque el que viene por defecto (/tmp) no tenía sufiente espacio libre para albergar las copias de seguridad y daba error.
  • Poner DELETE por defecto a false, ya que de no hacerlo el script borraba como si le hubiésemos pasado la opción -d

Lo he instalado en el directorio /root del proxmox y agregado permisos de ejecución con chmod +x