lunedì 26 maggio 2014

Patch GhettoVCB

GhettoVCB è uno script sviluppato da William Lam, che permette di eseguire il backup delle virtual machine virtualizzate dal VMM di vmware.
In questo contesto per backup si intende il clone della virtual machine salvata in un qualche storage eventualmente definito come parametro di backup.

Nella versione 2 lo script, prima di effettuare il backup, si preoccupa di eliminare tutte le snapshot associate alla virtual machine.

Questo comportamento può portare a spiacevoli situazioni, nel caso la snapshot in oggetto sia un backup applicativo da mantenere per un eventuale restore.

Per ovviare a questo comportamento, propongo la seguente patch.
L'intento è di eliminare le snapshot che lo script ghettoVCB.sh esegue prima del backup e che possono rimanere associate alla virtual machine per un qualche motivo imprevedibile; ad esempio se lo script viene terminato a metà della sua esecuzione. Mantenendo invece le snapshot dell'utente.

A questo punto è doverosa una precisazione in merito.
Quando si associa una snapshot alla virtual machine, le nuove modifiche saranno registrate su questa snapshot e non al disco virtuale della macchina (che subisce il backup), ne consegue che un backup in presenza di snapshot non può che essere un backup della virtual machine precedente alla prima snapshot.
In questo caso il comportamento è come nella versione precedente: il backup fallisce.

La patch altro non fa che controllare il nome della snapshot, e nel caso inizi con la stringa "ghetto" la elimina:
--- ghettoVCB.sh    2014-05-22 17:13:35.194285000 +0200
+++ ghettoVCBpatching.sh    2014-05-26 17:46:43.723052158 +0200
@@ -910,8 +910,9 @@
                     logger "info" "Snapshot found for ${VM_NAME}, backup will not take place\n"
                     VM_FAILED=1
                 elif [ ${ALLOW_VMS_WITH_SNAPSHOTS_TO_BE_BACKEDUP} -eq 1 ]; then
-                    logger "info" "Snapshot found for ${VM_NAME}, consolidating ALL snapshots now (this can take awhile) ...\n"
-                    $VMWARE_CMD vmsvc/snapshot.removeall ${VM_ID} > /dev/null 2>&1
+                    logger "info" "Snapshot found for ${VM_NAME}, remove snapshot now (this can take awhile) ...\n"
+                    SNAP_GHETTO=`$VMWARE_CMD vmsvc/snapshot.get ${VM_ID} | awk -F: '/^ghetto*/ && $0 != "" { getline; print $2}'`
+                    for snap_n in $SNAP_GHETTO;do $VMWARE_CMD vmsvc/snapshot.remove ${VM_ID} $snap_n;done
                 fi
             fi
             #nfs case and backup to root path of your NFS mount
Ovviamente l'eventuale snapshot che si vuole mantenere non dovrebbe iniziare con la parola chiave "ghetto". Nel caso, si dovrà modificare il "nome snapshot" dato dallo script:

if [[ ! ${POWER_VM_DOWN_BEFORE_BACKUP} -eq 1 ]] && [[ "${ORGINAL_VM_POWER_STATE}" != "Powered off" ]]; then
                    SNAPSHOT_NAME="ghettoVCB-snapshot-$(date +%F)"
                    logger "info" "Creating Snapshot \"${SNAPSHOT_NAME}\" for ${VM_NAME}"
                    ${VMWARE_CMD} vmsvc/snapshot.create ${VM_ID} "${SNAPSHOT_NAME}" "${SNAPSHOT_NAME}" "${VM_SNAPSHOT_MEMORY}" "${VM_SNAPSHOT_QUIESCE}" > /dev/null 2>&1


Preferendo a vmware tecnologie quali L4, LDOM ed exokernel vari, le quali architetture sono incomparabilmente più eleganti, ... concludo il post con una celebre frase ironica del venerabile Knuth.

"Beware of bugs in the above code; I have only proved it correct, not tried it."