viernes, 4 de mayo de 2012

Compactando imágenes de disco en VirtualBox


Cuando se afronta la configuración de una máquina virtual, una de las dudas que se suelen plantear gira en torno a la definición de los discos virtuales. Hoy en día, todos los software de máquinas virtuales (VirtualBox, VMWare, ...)  ofrecen la posibilidad de elegir si los ficheros de imagen de los discos virtuales van a ser estáticos o dinámicos.

Los discos virtuales estáticos reservan el espacio completo de la capacidad de la máquina virtual en el momento de su creación. Por el contrario, las  imágenes dinámicas se inicializan con un tamaño pequeño y, según va siendo necesario más espacio, la imagen del disco dinámico va creciendo. Este crecimiento es siempre 'a más' , ya que por mucho que se libere espacio en el sistema guest la imagen no va a ver reducido su tamaño salvo que se realice un procedimiento de compactación .

En entornos virtualizados de producción la decisión más adecuada suele ser la definición de discos con tamaño estático.El rendimiento de este tipo de imágenes es más rápido y no se pierde rendimiento en reservas de nuevo espacio en el host .

Sin embargo, en entornos de desarrollo, en los que el espacio de los discos del host suele ser un factor limitante, suele ser más interesante reservarlos de manera dinámica.

Situación

En un entorno de trabajo con una máquina virtual con imágenes dinámicas es probable que en un cierto momento el disco crezca de tamaño - por ejemplo, en una instalación de un software - para después volver a ver reducido su tamaño. Cuando esto ocurre, la imagen no ve reducido su tamaño de nuevo. 

Por ejemplo:
sobre una máquina Linux vacía, con un disco dinámico de tamaño máximo 20GB y  tamaño real de 1GB, vamos a instalar un WAS. Para ello, es necesario copiar los binarios a la máquina (1,5 GB ) , descomprimirlos (4 GB) , e instalarlos ( 2 GB) . Además, durante el proceso de instalación se crean un conjunto de ficheros temporales que pueden ocupar algún giga más. Al terminar el proceso de instalación, es probable que el disco ocupe unos 10 GB, cuando realmente sólo harían falta unos 3 GB.

¿Para qué necesitamos un disco ocupando 10 GB en este caso? Podríamos borrar los ficheros que no usamos. Escribimos los comandos rm que procedan y dejaríamos la máquina con esos 3GB ocupados - por ejemplo, se podría comprobar con el comando df  de Linux - .Pero el fichero de imagen sigue ocupando 10GB.  ¿Cómo solucionarlo? Utilizando las herramientas de compactación del software de máquina virtual.

Compactando... (I)

Las herramientas de compactación que ofrecen tanto VMWare como VirtualBox localizan bloques en disco con ceros escritos, y liberan ese espacio del fichero de imagen dinámica.
Por ejemplo, la herramienta de VirtualBox tiene la sintaxis

C:\Program Files\Oracle\VirtualBox\VBoxManage.exe modifyhd <ficheroImagen.vdi> -compact
Si pasamos esta herramienta por nuestra imagen de disco gigante debería devolverla a los 3GB esperados. Sin embargo, al ejecutarla sobre la imagen de disco y después de un rato, vemos con gran pena que el tamaño permanece inmutable.

¿Por qué?
Por la forma en la que los sistemas operativos borran ficheros. Cuando un sistema operativo borra un fichero lo que suele hacer es eliminarlo de las tablas de asignación de ficheros, de manera que sus sectores vuelven a estar disponibles para nuevos ficheros. Sin embargo, el espacio de disco no se escribe con ceros.

¿Y entonces?
Pues habrá que escribir con ceros el espacio de disco no usado antes de compactar.

Zero-filling

Aunque en Windows la solución es análoga, nos vamos a centrar en la solución para Linux. Hay dos maneras principales de hacer la operación de escritura a cero de la información de los bloques de disco vacíos. O haciendo un wiping -borrado seguro- en cada operación de borrado de ficheros - que degrada mucho el rendimiento de la máquina virtual- , o haciendo una operación de mantenimiento de zerofilling de los bloques borrados antes de hacer la compactación. Esta será nuestra opción.

Los pasos siguientes son para CentOS / RHEL , aunque en otras distribuciones va a ser muy similar.

Como precondición, habrá que instalar la utilidad zerofree en el sistema guest , disponible en los repositorios 3rd party de casi todas las distribuciones. 
  1. Reiniciar la máquina virtual
  2. Pulsar <ESC> en el menú de grub.
  3. Seleccionar la opción en grub que arranque el sistema en modo rescue , o si no existe, localizar la opción que arranque el sistema de modo normal y pulsar la tecla <a> . Esto entrará el modo append  de grub .
  4. Añadir, al final de la linea, la palabra single . Esto hará que Linux arranque en modo single user, sin red, pero con la posibilidad de desmontar el sistema de ficheros raíz. 
  5. Una vez que el sistema haya arrancado y esté en el prompt  - un signo de que todo ha ido correctamente es que llega al prompt sin pasar por una pantalla de login - , habrá que desmontar el sistema de ficheros y volver a montarlo en modo readonly. Para comprobar en qué sistema de ficheros está montado / habrá que lanzar un comando mount y comprobar la linea que contiene 'on /  type'.

    [root@virtual01 /]# mount/dev/mapper/vg_virtual01-lv_root on / type ext4 (rw)
    proc on /proc type proc (rw)
    sysfs on /sys type sysfs (rw)
    (...)


    En el caso del ejemplo, el sistema de ficheros a compactar es /dev/mapper/vg_virtual01-lv_root , que es un volumen LVM, aunque sería exactamente igual con volúmenes IDE , /dev/hdxY , SCSI o SATA, /dev/sdxY , etc. 
  6. A continuación, habría que montar ese volumen en modo sólo lectura y lanzar el comando zerofill sobre el sistema de ficheros.

    [root@virtual01 /]# mount -n -o remount,ro -t ext4 /dev/mapper/vg_virtual01-lv_root /
    [
    root@virtual01 /]# zerofree /dev/mapper/vg_virtual01-lv_root

  7. Sólo faltaría apagar la máquina

    [root@virtual01 /]# shutdown -h -P 0
Una vez hecho esto, el sistema está listo para volver a intentar la operación de compactación.

Compactando... (y II)

Ahora si, podemos volver a intentar hacer la operación de compactación

C:\Program Files\Oracle\VirtualBox\VBoxManage.exe modifyhd <ficheroImagen.vdi> -compact
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%...


Si todo ha ido bien el fichero de imagen de disco tendrá ahora un tamaño muy similar al tamaño usado dentro del sistema de ficheros, y que se puede consultar desde el sistema guest con, por ejemplo para Linux, un df .

No hay comentarios:

Publicar un comentario