Ampliando el disco de nuestras máquinas virtuales

"Voy a instalarme el 'Augury BlauBlauveloper 14p' en esta máquina virtual Linux que tengo por ahí (muerta del asco), aunque creo que me quedé un poco corto al dimensionarla ..."
  Fatal error: not enough disk space. Aborting installation 

A tomar por saco bicicleta. ¿Os suena?

Por suerte estamos trabajando con máquinas virtuales y no hace falta perder tres horas liberando espacio ni encargar un disco duro por envío urgente.

A continuación recopilo los pasos a dar para aumentar fácilmente el espacio disponible, en este caso en un CentOS 7 1611 mini (sin entorno gráfico) sobre VirtualBox, que inicialmente tiene un disco virtual de 8 GB. No es muy diferente a lo que habría que hacer en una máquina física o en un sistema Windows.



Paso 1) Aprovisionar un disco

En lugar de comprar un disco duro y conectarlo al puerto correspondiente (SATA o IDE... qué tiempos aquellos del master/slave 😢) hay que crear un nuevo disco virtual en VirtualBox desde la configuración de almacenamiento de la VM (apagada):


El nuevo disco virtual del tipo y tamaño elegidos (en mi caso .vdi de 64 GB reservados dinámicamente) se corresponderá con un nuevo archivo en disco físico, que podríamos ubicar por ejemplo en una unidad SSD si tenemos algún requerimiento especial de rendimiento.


En cuanto a Windows nada más que señalar por ahora, pero en el caso de Linux hay que tener en cuenta que el puerto al que queda vinculado el disco virtual condicionará el nombre del dispositivo en /dev:


Al arrancar de nuevo la máquina podemos verificar los discos y particiones existentes. El nuevo disco sin particiones /dev/sdb se distingue fácilmente:


Hasta aquí la única parte que difiere de lo que haríamos en una máquina física. ¡Pero sin cables ni destornillador!

Lo que viene ahora da igual si lo hacemos en una máquina física o virtual.


Paso 2) Particionar el disco

Antes de poder usar el disco es necesario crear al menos una partición y formatearla con un determinado sistema de archivos, para lo que necesitaremos los privilegios adecuados (root).

Utilizaremos el comando fdisk sobre el nuevo dispositivo /dev/sdb

Marco en rojo las opciones más interesantes del menú, y en azul los pasos que he dado:
  • [o] nueva tabla de particiones vacía de tipo DOS
  • [n] nueva partición primaria [p] respetando los valores numéricos por defecto (nº de partición, primer y último sector) para ocupar la totalidad del espacio disponible
  • [w] confirmación de los cambios en disco

Ahora podemos ver la nueva partición /dev/sdb1.
 
Más info sobre tipos de particiones y sus restricciones aquí.


Paso 3) Formatear la partición

Ahora que hemos creado una partición la podemos formatear con el sistema de archivos que más nos interese. En mi caso he optado por ext4, para lo que utilizaré el comando mkfs.ext4 con las opciones por defecto sobre la nueva partición /dev/sdb1:



Paso 4) Montar la partición

Por último será necesario montar la nueva partición ya formateada en un directorio vacío del filesystem:


Nota: el flag -f / --fake en combinación con -v / --verbose permite simular la operación para depurar posibles problemas, sin causar efecto alguno.

Más info sobre el comando mount y las diferentes opciones de montaje aquí.

Ahora disponemos de 60 GB libres en el punto de montaje /mnt/expand de forma temporal (hasta el siguiente reinicio).

El fichero /etc/mtab muestra la configuración actual de los puntos de montaje del sistema, incluyendo /dev/sdb1 en /mnt/expand:


Una vez comprobado que el montaje se ha realizado correctamente haremos permanente la configuración editando en consecuencia el fichero /etc/fstab. En mi caso, añado al final lo siguiente:

/dev/sdb1 /mnt/expand ext4 defaults,noatime 0 0


Reiniciamos la MV para comprobar que el montaje se realiza automáticamente al iniciar el sistema:



Hemos montado la partición de forma permanente.

A la hora de utilizar el nuevo espacio disponible es posible acceder a directorios del nuevo disco desde diferentes ubicaciones utilizando enlaces simbólicos, lo que aporta bastante flexibilidad. 

Por ejemplo, creamos en /opt el enlace simbólico datos apuntando al directorio correspondiente a /mnt/expand. Todos los archivos y directorios ubicados en /opt/datos estarán realmente en /mnt/expand, directorio raíz de la nueva partición /dev/sdb1:



Algunas conclusiones

Con este método no sólo es posible ampliar fácilmente el espacio disponible en nuestras MV, sino que es una forma muy flexible de planificar y gestionar el uso de discos de un sistema, además de permitir alojar los discos virtuales en diferentes discos físicos por motivos de rendimiento, seguridad, costes, etc.

Por ejemplo, podemos disponer de una MV con un sistema recién instalado o con una configuración determinada de base, habiendo reservado solo el espacio necesario, y expandir su capacidad en cualquier momento con discos adicionales destinados a albergar diferentes conjuntos de datos.

Podemos añadir temporalmente un disco virtual, nuevo o existente, a una MV, volcar datos en él, y posteriormente 'enchufar' ese disco a otra MV diferente. Podemos hacer backups comprimidos de los ficheros .vdi a modo de backup, etc. Las posibilidades son numerosas.


¿Y en Windows?

En el caso de Windows se puede utilizar el comando diskpart, o más sencillo, el Administrador de discos del Panel de control:


Además de asignar una letra de unidad a la nueva partición (o particiones) existe también la posibilidad de montarla en un directorio vacío de una unidad NTFS ya existente (en la captura la opción está deshabilitada por tener ya asignada una letra de unidad):



 
Snapshots en MVs

Por si algo falla o queremos volver atrás (como es mi caso ahora mismo) hay que recordar que con máquinas virtuales podemos crear snapshots, de forma que podemos guardar el estado actual de la máquina y restaurarlo más adelante en caso de problemas:




Ha llegado la hora de darle una nueva vida a esa MV.

Hasta otra 👋

Comentarios

Entradas populares de este blog

Librerías comunes en Tomcat 8. Caso real: SoapUI mocks

Desacoplamiento mediante colas de mensajes

Arquitectura híbrida cloud / on-premise