
Defragmentar y hacer shrink a los vmdk’s
11/04/08Actualizado 15/04/2008: Ahora el script también hace shrink a los vmdk’s.
Sé que me estoy poniendo un tanto pesado con el VMware pero es que llevo tres semanas nada mas que currando con ello y tuneando un poco las máquinas.
Lo que os pongo hoy es un pequeño shell script para automatizar la defragmentación de los ficheros *.vmdk. En principio tenía también que hacerles shrink pero la versión actual estable del VMware Server para Linux, la 1.0.5, no incluye esa opción. Creo que la beta 2.0 si que lo trae así que puede que lo incluya más adelante.
Para que el script también haga shrink hay que bajarse la versión beta 2 del Vmware Server, y copiar los binarios (la carpeta bin que hay dentro del tar) a una carpeta que definiremos en el script. No hace falta instalar esta versión del Vmware Server.
Hay que ejecutarlo en el host. Yo, por ejemplo, lo he metido en el crontab para que se ejecute cada viernes a las 22:00.
#!/bin/bash
#
# defvmdk.sh
# Fecha de creacion: 09-04-2008
#
# Script para defragmentar y hacer shrink a los
# ficheros vmdk de las vm's.
#
# Necesita el fichero defvmdk.cfg desde el que lee
# sobre que vm's debe actuar.
#
# Para poder hacer el shrink necesita tambien los
# binarios de la vesion 2 del Vmware Server (no
# importa que este otra version instalada).
#
###################################################
VMS=/root/bin/defvmdk.cfg
LOG=/root/bin/defvmdk-$(date '+%y-%m-%d').log
FTMP=/root/bin/defvmdk.tmp
VLOG=/tmp/vmware-root/vdiskmanager.log
#Binarios del Vmware Server:
VDIR=/root/bin/vmware/
export PATH=$VDIR:$PATH
echo >> $LOG
echo "##################################" >> $LOG
echo "####### INICIO DEL PROCESO #######" >> $LOG
echo "##################################" >> $LOG
# Comprobamos que maquinas estan corriendo:
vmrun list > $FTMP
for VDIR in $(grep -v "#" $VMS)
do
echo >> $LOG
echo "#######" >> $LOG
echo "####### Maquina: $VDIR" >> $LOG
echo "####### Fecha: $(date)" >> $LOG
cd $VDIR
if [ $(ls *.vmx | wc -l) -ne 1 ]; then
echo >> $LOG
echo "####### ERROR: No se encuentra el fichero vmx o hay mas de uno." >> $LOG
continue
fi
VM=$(ls *vmx)
# Paramos la VM si esta corriendo
if [ $(grep "$VDIR" $FTMP) ]; then
vmrun stop ./$VM nogui
fi
# Defragmentamos y hacemos shrink a los vmdk
for VMDK in $(ls *.vmdk)
do
# Reiniciamos el log de vmware
cp -p $VLOG "$VLOG.bk"
> $VLOG
# Defragmentamos el vmdk
vmware-vdiskmanager -d $VMDK
# Hacemos shrink
vmware-vdiskmanager -k $VMDK
# copiamos el VLOG
echo "#######" >> $LOG
echo "####### VMDK: $VMDK" >> $LOG
echo "#######" >> $LOG
echo >> $LOG
cat $VLOG >> $LOG
done
# Dejamos la VM como estaba
if [ $(grep "$VDIR" $FTMP) ]; then
vmrun start ./$VM nogui
fi
done
rm -f $FTMP
echo >> $LOG
echo "###############################" >> $LOG
echo "####### FIN DEL PROCESO #######" >> $LOG
echo "###############################" >> $LOG
### FIN ###
Como habréis visto en los comentarios necesita un fichero de configuración muy simple en el que pondremos los directorios donde están ubicadas las máquinas virtuales sobre las que queremos actuar. El mío queda más o menos así:
# defvmdk.cfg # Fecha de creacion: 09-04-2008 # # Fichero de configuracion del script defvmdk.sh # El proceso defragmentara los vmdk de las vm's # no comentadas. # ################################################# /VMLocal/lab/1 /VMLocal/lab/2 #/maquina/que/no/se/defragmentara
Para los picas: no os riáis de mi código. Cada uno hace lo que puede XD





