Snapshots

El caso de los Checkpoints que no pueden ser eliminados en HyperV

Recientemente se nos presento un caso muy particular. Nos encontramos trabajando en la integración de HP Data Protector 9 para realizar los respaldos de Maquinas Virtuales ejecutadas sobre HyperV 2012 R2. El respaldo es ejecutado de manera exitosa, sin embargo HP DP no elimina los checkpoints generados por la tarea de respaldo (Sigue sin hacerlo, tenemos un caso abierto con HP para realizar la investigación), lo que produce el gran riesgo de que el volumen donde se encuentran las VMs se llene debido a estos Checkpoints no eliminados.

Como buen administrador, y buscando evitar un problema mayor, abro la consola de HyperV Manager dispuesto a eliminar esos molestos Checkpoints. Pero “Oh Sorpresa”, estos Checkpoints no pueden ser eliminados como se hace con uno estandard (incluso el icono que los representa es diferente).

Checkpoint

Aquí surge la pregunta ¿Cómo le hago entonces para deshacerme de estos Checkpoints?

Aqui es donde entra Powershell al rescate. Estos Checkpoints son de un tipo especial llamado “Recovery”, los cuales no puedes ser eliminados desde la consola de Administración de HyperV. Para localizarlos dentro de un Hypervisor, es necesario ejecutar el siguiente comando:

Get-VM | Get-VMSnapshot | where {$_.SnapshotType -eq "Recovery"

Este comando nos dara visibilidad de todos los Checkpoints del tipo “Recovery” que estan aun en las VMs del hypervisor.

Si desean deshacerse de esos molestos Checkpoints, tan solo habria que car uso del Pipe, y mandar la salida haca el comando “Remove-VMSnapshot”:

Get-VMSnapshot | where {$_.SnapshotType -eq "Recovery"} | Remove-VMSnapshot

Ahora bien, si son de los que cuentan con SCVMM y un cluster de Hypervisores y son perezosos como yo para entrar a cada uno de los Hosts y ejecutar el comando, pueden usar el siguiente script.

#Este script se encarga de Revisar todos los Snapshots remanentes de Backups y hace un "merge".
#El script no afecta a los Snapshots regulares.
import-module virtualmachinemanager
$HyperVHosts=Get-VMHost
foreach ($HyperVHost in $HyperVHosts) {
    Invoke-Command -ComputerName $HyperVHost -ScriptBlock {Get-VM | Get-VMSnapshot | where {$_.SnapshotType -eq "Recovery"} | Remove-VMSnapshot -verbose} 
}

Este se encargara de obtener el listado de los hosts de HyperV administrados por SCVMM, conectarse a cada uno, listar los Checkpoints del tipo “Recovery” (los Checkpoints Standard que hayan sido generados, no serán afectados), y eliminarlos. Importante recalcar que hay que ejecutarlo en un servidor que tenga la consola de SCVMM instalada y contar con los privilegios necesarios.

Espero les sea de utilidad.