Ampliación de Capacidad en Discos de Expansión Dinámica de VirtualBox

Pasos para ampliar la capacidad máxima de un disco de expansión dinámica de VirtualBox.
Los discos duros de las máquinas virtuales de VirtualBox son archivos en el host con extensión .vdi. Estos archivos pueden ser creados como una imagen de tamaño fijo, o de modo que se expandan dinámicamente a medida que crezca el espacio utilizado en el disco de la máquina virtual.
La modalidad de expansión dinámica es muy conveniente para ahorrar utilización de espacio en disco en el host, y permite respaldar más rápidamente los discos de las máquinas virtuales.
Al momento de crear un disco de expansión dinámica de VirtualBox debe indicarse cuál es su capacidad máxima. Supongamos que una máquina virtual fue creada con un disco de expansión dinámica de capacidad máxima = 8 GB, y su utilización está ya por encima de los 7 GB. En esas condiciones convendría ampliar la capacidad máxima de dicho disco virtual, pero esto es algo que VirtualBox actualmente no soporta. Este manual detalla un procedimiento para lograr ampliar la capacidad máxima de un disco de expansión dinámica de VirtualBox.
Versiones de Software
El procedimiento descrito en este manual fue probado utilizando las siguientes versiones de software y combinaciones de Host / Guest:
VirtualBox 3.2.6, corriendo en un host Windows XP Profesional v2002 + SP3 + todos las actualizaciones de Microsoft Update hasta la fecha.
Huésped Ubuntu 10.04 Server i386 recién instalado + todas sus actualizaciones hasta la fecha.
VirtualBox 3.2.6, corriendo en un host Ubuntu 10.04 Desktop AMD64 (64 bits) + todas sus actualizaciones hasta la fecha.
Huésped Ubuntu 10.04 Server AMD64 (64 bits) recién instalado + todas sus actualizaciones hasta la fecha.
Huésped Debian 5.0.5 i386 recién instalado + todas sus actualizaciones hasta la fecha.
Gparted live 0.6.1-2 (Versiones anteriores no funcionaron para algunos casos)
Configuración del disco y máquina virtual de partida
El punto de partida es un disco de expansión dinámica con capacidad máxima (tamaño virtual) de 8 GB. Este disco se conectó a una máquina virtual y se instaló el sistema operativo huésped utilizando como Método de Particionado la opción “Guiado utilizando todo el disco”, y como Esquema de Particionado  la opción “Todos los ficheros en una partición” (Esto aplica para todos los sistemas operativos huésped probados). En el caso de Ubuntu server, y después de instaladas sus últimas actualizaciones, el tamaño en disco del archivo .vdi es de 1.28 GB.
La siguiente imagen muestra el estatus de la configuración de almacenamiento de esta máquina virtual luego de dicha instalación y actualización:
Supongamos que necesitamos ampliar la capacidad máxima de ese disco (actualmente de 8 GB) a unos 100 GB.
Clonación del disco original
El primer paso es crear un nuevo disco en VirtualBox, con 100 GB de capacidad. Para ello seleccionar “Archivo -> Administrador de medios Virtuales” en el menú de VirtualBox; en la ventana que aparece seleccionar “Nuevo”, y seguir las distintas ventanas para crear el nuevo disco, también en modalidad expansión dinámica, y con capacidad = 100 GB.
El próximo paso será clonar el disco original de 8 GB sobre este nuevo disco de mayor capacidad. Para ello cerramos VirtualBox y utilizamos el programa VboxManage (localizado donde mismo quedó instalado VirtualBox) con las opciones clonehd y existing. La sintaxis general de este comando es:
VboxManage clonehd -–existing  archivo-origen.vdi  archivo-destino.vdi
Este programa se puede invocar desde la línea de comandos en una ventana DOS en un host Windows, o desde un terminal en un host Linux.
En nuestro caso utilizamos el nombre ubuntu-server-newdisk-100gb.vdi para el disco destino de 100 GB. La siguiente imagen muestra la invocación y resultado de la ejecución del comando en una ventana de DOS:
En la siguiente imagen vemos la invocación del mismo comando en un terminal de un host Ubuntu. Los nombres de los archivos para esta prueba fueron ligeramente distintos:
server-test-resize.vdi (disco de 8 GB)
vserver-ubuntu64-100gb.vdi (disco de 100 GB)
Nota:  en Ubuntu no es necesario indicar el path absoluto para invocar el comando VboxManage.
Dentro de VirtualBox desconectar el disco original (de 8 GB) de nuestra máquina virtual, y agregar el nuevo disco de 100 GB. La siguiente imagen muestra cómo debe quedar la configuración de almacenamiento de la máquina virtual luego de este cambio de discos:
Con este nuevo disco, y así como está en estos momentos, verificar que la máquina virtual arranca sin problemas, de manera idéntica a la máquina con el disco duro original de 8 GB.
Pese a que el disco es ahora de 100 GB, la partición donde reside nuestro sistema sigue siendo del mismo tamaño que la original. Entonces debemos expandir esa partición dentro del nuevo disco.
Ajuste de las particiones en el nuevo disco
Utilizaremos Gparted para expandir la partición primaria dentro del disco de 100 gb.
Nota: versiones de Gparted anteriores a la 0.6.1-2 funcionaban bien con debian (sobre ext3, y teniendo instalado grub), pero generaron problemas para VirtualBox aparentemente cuando se trataba de instalaciones sobre ext4 y/o con grub2 (Ubuntu y Ubuntu 64 bits) en el host y/o en el guest. Se requerían otros procedimientos y herramientas adicionales a las aquí señaladas para que VirtualBox levantara las máquinas virtuales sin problemas a partir de discos clonados con particiones clonadas y desplazadas. Sin embargo, la última versión de Gparted (versión 0.6.1-2, liberada muy recientemente: 20/07/2010) fue probada para la versión final de este documento y funciona a la perfección en todos los casos, por lo que el procedimiento es ahora uno mismo en todos estos casos.
El archivo iso de la última versión de GParted puede obtenerse en la siguiente dirección: http://gparted.sourceforge.net/download.php
Colocar el ISO de Gparted en la unidad de CDROM, y verificar que el CDROM esté de primero en el orden de arranque de la máquina (en una máquina virtual apagada seleccionar Configuración y luego Sistema para ajustar el orden de los dispositivos de arranque). Iniciar luego la máquina virtual. La siguiente imagen muestra la pantalla luego de haber arrancado Gparted utilizando todos sus valores por defecto para su inicialización:
En la imagen podemos ver que el disco seleccionado es el de 100 GB; debajo de la barra de herramientas aparece una representación gráfica del espacio total del disco y lo ocupado por las particiones existentes. En la sección inferior de la ventana aparece un listado detallado con las particiones. La partición primaria (/dev/sda1) muestra el flag “boot” y tiene un tamaño de 7.61 GiB, seguida de una partición extendida (/dev/sda2) la cual contiene una partición lógica (/dev/sda5) de 398 MiB para el linux swap. Luego de todo lo anterior está el espacio todavía disponible en el disco, un total de 92.00 GiB.
Para poder agrandar una partición necesitamos tener espacio disponible justo a la derecha o justo a la izquierda de dicha partición. En nuestro caso, queremos agrandar la partición primaria, pero no tiene espacio a la izquierda pues la partición está en el inicio del disco duro, y tampoco tiene espacio a su derecha pues allí tenemos la partición extendida con la partición linux-swap en su interior. Necesitamos entonces mover esa partición extendida (y la linux-swap que contiene) hacia el extremo derecho del disco. Sin embargo, no podremos mover la partición extendida con una sola operación, debido a que tiene una partición lógica en su interior. Debemos entonces primero agrandar la extendida, desplazar luego la partición lógica en su interior, y después reestablecer (reducir) el tamaño de la extendida.
Primero se debe hacer click sobre la línea donde aparece la partición extendida (aquí /dev/sda2); luego presionar el botón de la barra de herramientas que tiene una fecha verde y el texto “Resize/Move”. En la ventana que aparece podemos seleccionar los bordes de la partición y deslizarlos horizontalmente para expandir o comprimir el tamaño de las particiones según se requiera. (La opción “Align To” debe tener la opción “Cylinder” seleccionada; de lo contrario, seleccionarla). Deslizar el lado derecho de la partición extendida por completo hacia la derecha, hasta el final del espacio disponible en el disco duro; luego presionar el botón “Resize/Move” de la ventana, y  se regresa a la ventana principal de Gparted.
Hacer click sobre la línea de la partición linux-swap (/dev/sda5); en la barra de herramientas presionar el botón Resize/Move; en la ventana que aparece, mover la partición entera todo lo posible hacia la derecha. Para ello seleccionar no los bordes verticales del cuadrado de la partición, sino los bordes horizontales, de modo que movamos la partición de una vez sin cambiar su tamaño. Una vez esté colocada en el extremo derecho de todo el espacio disponible, presionar el botón Resize/Move, y volvemos a la ventana principal de Gparted.
Hacer click otra vez sobre la línea correspondiente a la partición extendida (/dev/sda2), luego presionar el botón Resize/Move, y mover ahora el borde izquierdo de la partición extendida lo más a la derecha posible; seleccionar luego el botón Resize/Move, con lo cual volvemos a la ventana principal de Gparted.
Presionar el botón “Apply” de la barra de herramientas, confirmar y Gparted realizará las operaciones.
Debido a la alineación por cilindros, pueden quedar algunos pequeños espacios a la izquierda de la partición linux-swap, y después de la partición extendida. Esto es normal. La siguiente imagen muestra cómo queda exactamente el disco después de haber movido las particiones según las indicaciones anteriores.
En la representación gráfica del disco (barra horizontal debajo de la barra de herramientas) vemos ahora que la partición extendida junto con la linux-swap están en el extremo derecho del disco, y los 91.99 GiB de espacio disponible del disco están ahora justo a la derecha de la partición primaria (/dev/sda1), que era lo que necesitábamos.
En este punto verificar de nuevo que la máquina virtual puede iniciarse perfectamente con el disco duro en ese estado. (Apagar la máquina desde Gparted haciendo doble click en el botón rojo “Exit” arriba a la izquierda de la pantalla, y seleccionando shutdown. Remover entonces, en VirtualBox, el ISO de Gparted del CDROM de la máquina virtual, y reiniciar la máquina. Después de validar que inicia sin problemas, apagarla de nuevo; colocar el ISO de Gparted nuevamente en el CDROM, y reiniciar para volver a correr Gparted).
Nuestra partición primaria todavía tiene un tamaño de apenas 7.61 GiB; necesitamos expandirla. Para ello hacer click sobre la línea correspondiente a /dev/sda1; presionar el botón Resize/Move en la barra de herramientas; en la ventana que aparece movemos el lado derecho de la partición hasta el final del espacio disponible; luego presionar el botón “Resize/Remove” y volvemos a la ventana principal de Gparted. Allí hacemos click sobre el botón “Apply” de la barra de herramientas. Confirmamos y Gparted realizará la operación, luego de lo cual la pantalla debe aparecer como muestra la siguiente imagen:
Vemos ahora que la partición primaria tiene un tamaño de 99.60 GiB. Hacemos doble click en el botón rojo “Exit” y seleccionamos shutdown. Sacar el ISO de Gparted de la unidad de CDROM de la máquina virtual, y reiniciar la máquina.
Esta máquina virtual correrá ahora de manera idéntica a la original, pero en vez de tener un disco  de expansión dinámica de sólo 8 GB, ahora es de 100 GB.