El siguiente documento esta pensado para administradores con sistemas FreeBSD virtualizados y que tengan la necesidad de incrementar el tamaña disponible en alguna de sus particiones. Las pruebas se realizaron sobre XenServer, sin embargo, los conceptos deben funcionar también en VMWare, VirtualBox e incluso Amazon Web Services.
Introducción
Con el crecimiento tan acelerado sobre la cantidad de información que se almacena en los servidores, el tener que incrementar el tamaño de las particiones de los sistemas se ha vuelto una tarea habitual que debe de poder realizarse de forma sencilla y en cuestión de minutos, es decir, sin reinstalar el sistema y/o las aplicaciones.
La mejor forma de conseguirlo es operando sobre plataformas virtualizadas, esto ya que ademas de las ventajas que proporcionan en el provisionamiento y gestión, permiten entornos con mayor dinamismo en la asignación de recursos para las maquinas virtuales.
Un ejemplo de ello es el incremento del espacio libre en el sistema de archivos UFS de un servidor FreeBSD, lo cual cual se logra en cuestión de minutos siempre y cuando se cumplan algunas condiciones y se realicen las operaciones adecuadas. Hago enfasis en UFS ya que ZFS requiere mas recursos y por lo tanto puede no ser viable para máquinas virtuales con recursos limitados.
Las condiciones que se tienen que seguir para realizar el incremento de un sistema de archivos UFS, son las siguientes:
1.- Contar con un esquema de partionado GPT
Las versiones de FreeBSD a partir de la 8.x lo utilizan por defecto, y es recomendable por encima de bsdlabel ya que la gestión de las particiones es mucho mas sencilla y flexible.
2.- Seguir un orden al momento de crear las particiones y generar una partición para los datos
Se requiere que la última partición (la de datos) sea la que se tiene pensado crecer, ya que si se encuentra entre 2 particiones, será imposible de redimensionar ya que a esta es a la que se le puede agregar el espacio libre puesto que el limite final de la partición se puede reasignar.
Las particiones intermedias cuentan con bloques de inicio y termino definidos que no se pueden modificar y hacen imposible el redimensionamiento, mientras que a la última particiones se le puede modificar el bloque de termino para agregarle el espacio libre que se genere.
3.- Operar en una plataforma que permita el redimensionamiento de discos de VM
Esto es fundamental ya que si no se puede incrementar el espacio, no será posible agregarlo como espacio libre en FreeBSD y después sumarlo a una partición.
Implementación
Para este documento vamos a hacer el redimensionamiento de un disco de 10G a uno de 15G, la tabla de particiones GPT y la salida del comando "df" se pueden ver a continuación:
[root@servidor ~ # gpart show => 34 20971453 ada0 GPT (10G) 34 1024 1 freebsd-boot (512K) 1058 4194304 2 freebsd-swap (2.0G) 4195362 16775168 3 freebsd-ufs (8.0G) [root@servidor ~ # df -h Filesystem Size Used Avail Capacity Mounted on /dev/ada0p3 7.7G 1.4G 5.7G 20% /
El primer paso es detener la máquina virtual y realizar el cambio en el tamaño del disco duro asignado a la VM. En XenServer esto se hace desde el apartado Storage de cada máquina virtual, seleccionando el disco duro adecuado y cambiando el tamaño para reflejar el espacio adicional.
Una vez realizado el cambio previo, se inicia la máquina virtual y la primer actividad que tenemos que realizar en FreeBSD es una operación de recuperación o "recover", utilizando el comando "gpart". Esto es obligatorio ya que por defecto el espacio adicional marca corrupto al volumen. A continuación se puede ver el resultado al agregar el espacio adicional en XenServer y después de realizar el "recover":
[root@servidor ~# gpart show => 34 20971453 ada0 GPT (15G) [CORRUPT] 34 1024 1 freebsd-boot (512K) 1058 4194304 2 freebsd-swap (2.0G) 4195362 16775168 3 freebsd-ufs (8.0G) [root@servidor ~# gpart recover ada0 [root@servidor ~# gpart show => 34 31457213 ada0 GPT (15G) 34 1024 1 freebsd-boot (512K) 1058 4194304 2 freebsd-swap (2.0G) 4195362 16775168 3 freebsd-ufs (8.0G) 20970530 10486717 - free - (5.0G)
Ya que tenemos el espacio libre y registrado en GPT, el siguiente paso es identificar el índice de la partición que deseamos redimensionar. Se puede apreciar en el ejemplo anterior que la partición que utilizamos para datos es la "freebsd-ufs" (número 3). Una vez identificado el índice de la partición, hacemos el redimensionamiento:
[root@servidor ~# gpart resize -i 3 ada0 ada0 recovered [root@servidor ~# gpart show => 34 31457213 ada0 GPT (15G) 34 1024 1 freebsd-boot (512K) 1058 4194304 2 freebsd-swap (2.0G) 4195362 27261885 3 freebsd-ufs (13G)
Y con eso se agrega el espacio libre a la partición indicada con el parámetro "-i", que debe corresponder a la última partición dentro de GPT, en este caso "freebsd-ufs".
El último paso es hacer que el sistema operativo reconozca el espacio adicional, esto lo hacemos usando el comando "growfs" de la siguiente forma:
[root@servidor ~# growfs /dev/ada0p3 Device is mounted read-write; resizing will result in temporary write suspension for /. It's strongly recommended to make a backup before growing the file system. OK to grow filesystem on /dev/ada0p3, mounted on /, from 8.0GB to 13GB? [Yes/No] Yes super-block backups (for fsck -b #) at: 17951552, 19233792, 20516032, 21798272, 23080512, 24362752, 25644992, 26927232
Confirmamos que deseamos realizar la acción y veremos como opera el comando; el resultado se puede ver en el ejemplo previo. Para finalizar validamos con el comando "df" que el incremento en la partición se esta reflejando correctamente:
[root@servidor ~ # df -h Filesystem Size Used Avail Capacity Mounted on /dev/ada0p3 13G 1.4G 10G 12% /
El comando growfs TIENE QUE EJECUTARSE CON EL SISTEMA DE ARCHIVOS EN MODO SOLO LECTURA (single user) para prevenir corrupción de datos.
Posibles errores
En caso de recibir un mensaje de que el sistema de archivos no se puede modificar, se necesita activar el modo "debug" para poder modificarlo y después ejecutar el "growfs", esto se hace con el siguiente comando:
[root@servidor ~ # sysctl kern.geom.debugflags=16
Todo esto solo funciona a partir de FreeBSD 8.2, ya que el comando "gpart resize" no esta disponible en 8.0.
Aproximación de Amazon Web Services
En AWS para incrementar el espacio en un volúmen EBS se tienen que ejecutar pasos similares pero con una aproximación diferente que consiste en sacar un snapshot del volúmen, después generar uno nuevo de mayor tamaño tomando como imagen base el snapshot previamente generado. Por último, ejecutar el comando "resize2fs" en el sistema operativo para asignar el espacio libre. Con esto el nuevo tamaño de volumen se debe ver reflejado en el sistema operativo al ejecutar "df".
Una nota importante es que esto funciona únicamente en sistemas FreeBSD y solo el algunas distribuciones de Linux como Amazon Linux o CentOS.