Ampliar un volumen ZFS

Publicado en: Tecnología

Por azares del destino he tenido que pelearme con un volumen de datos con formato ZFS. El volumen lo controlaba un software comercial de catastróficas consecuencias. Tomamos la decisión de tomar el volumen de datos y compartirlo con un simple protocolo NFS, bajo nuestro propio riesgo. Está funcionando decentemente, todo sea dicho.

Una vez instaladas las librerías ZFS en CentOS 7, un 7.5 en concreto, montado el volumen y dando servicio tuvimos que ampliar el volumen. En mi caso se trata de un volumen EBS de AWS, que solo es crítico para conocer como el sistema operativo ha de refrescar la caché de disco, pero es independiente de qué servicio o granja de virtualización proporciona el volumen de datos.

Ampliar el volumen no es complicado, pero siguiendo todo tipo de documentación y consejos no conseguimos que el sistema operativo tomara los nuevos datos de tamaño de disco hasta que actualizamos la quota de disco del Pool ZFS, y no los datasets (o directorios de primer nivel) creados para los export, donde toda documentación hace referencia y donde no hay quota aplicada.

El Pool tiene quotas.

La clave ha sido comprender que el propio Pool tiene una quota de disco máxima, reservando un espacio para snapshots. Aunque las tengas deshabilitadas para los datasets.

El Pool ZFS puede tener o no programados snapshots, ZFS para esto implementa unos comandos la mar de bien preparados. Si no los usas, la quota puede ir hasta casi el 100% del tamaño del volumen. EN mi caso lanzamos snapshots a nivel AMI de AWS, no necesitamos el snapshot a nivel ZFS, espacio que ganamos.

Instalar librerías ZFS en CentOS 7.5

La versión de sistema operativo es crítica para que las librerías puedan ser instaladas, o compiladas si es que no puedes instalarlo de otra manera. Con este paquete RPM vía yum es muy sencillo y funciona todo a la primera.

$ yum install -y http://download.zfsonlinux.org/epel/zfs-release.el7_5.noarch.rpm
$ gpg --quiet --with-fingerprint /etc/pki/rpm-gpg/RPM-GPG-KEY-zfsonlinux
$ yum install -y zfs zfs-dracut

Montar el Pool ZFS

El sistema de ficheros ZFS debe ser visible por el host, la VM. Pero no monta con un mount como ocurre con otros sistemas de ficheros. ZFS ofrece unos comandos para poder hacerlo, una vez importado en el sistema, volverá a estar disponible después de cada reinicio. El servicio se encarga de todo.

Obtenemos el nombre del Pool, necesario para importarlo, si no lo conocemos previamente

$ zpool list

Y con nombre del Pool que devuelve, me invento que se llama PoolVol, lo importamos

$ zpool import PoolVol

Y ya lo tenemos accesible en /PoolVol, podemos movernos por el sistema de ficheros normalmente.

Como es un volumen heredado de otro sistema sonde estaba inicializado y con snapshots lanzados, no tengo nada que hacer, toda la info permanece y se mantienen las estructuras de datos.

Ampliar volumen ZFS

Y llegamos al punto interesante, ampliar el volumen de datos. A la inversa no es posible, como suele ser común en todos los sistemas de ficheros, necesitaríamos migrar datos a un volumen nuevo.

Modificar las propiedades de autoexpand del volumen ZFS

$ zpool get autoexpand PoolVol
$ zpool set autoexpand=on PoolVol

Comprobar que lo hemos activado correctamente

$ zpool status -v

Ampliamos el volumen en la AWS Console de EBS, o si lo tuviéramos en una granja, ampliamos disco independientemente de ser ZFS. En AWS el performance puede verse afectado hasta que el 100% del disco está refrescado, pero podemos seguir con la tarea de ampliar mientras esto sucede.

Comprobar que el sistema reconoce el nuevo tamaño de disco con fdisk

$ fdisk -l

Deberíamos ver el disco a nivel físico con el nuevo tamaño.

En el caso de un EBS de AWS, es necesario hacer este paso concreto, borrar la caché de partición del volumen ZFS del sistema para refrescar el nuevo tamaño de partición. Os pongo los datos concretos de mi volumen, para identificar el ID de partición:

$ parted -l
Model: NVMe Device (nvme)
Disk /dev/nvme1n1: 6597GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
 1 1049kB 6597GB 6597GB zfs-0b72def7e67b79aa
 9 6597GB 6597GB 8389kB

Borrar la partición del ZFS: 9

$ parted /dev/nvme1n1 rm 9

Ajustar el tamaño de partición al 100%

$ parted /dev/nvme1n1 resizepart 1 100%

Poner online el volumen ZFS

$ zpool online -e PoolVol /dev/nvme1n1

Verificar que también ZFS reconoce el cambio de tamaño

$ zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
PoolVol 5.97T 3.72T 2.24T - 25% 62% 1.00x ONLINE -

Si comprobáis en este momento la info que el sistema operativo tiene del tamaño de volumen, con ‘df‘ podréis ver que el sistema no se ha enterado del incremento del tamaño.

Debemos actualizar la quota de datos a nivel Pool, y solo de los datasets si los tuviéramos aplicados, que ya os digo no es mi caso. Comprobar quota actual, relacionada con el espacio libre de disco antes de ampliar, y el espacio asignado para snapshots, que si están deshabilitados, podemos aprovechar como espacio de uso de disco.

$ zfs get quota PoolVol
NAME PROPERTY VALUE SOURCE
PoolVol quota 4.50T local

Ajustar nueva quota al espacio de disco

$ zfs set quota=5.6T PoolVol

Revisar que ha cambiado

$ zfs get quota PoolVol
NAME PROPERTY VALUE SOURCE
PoolVol quota 5.60T local

Verificar que a nivel de sistema operativo el cambio está hecho y refrescado, comparando el valor anterior:

$ df -h

Y listo, ya tenemos nuestro volumen ZFS ampliado y la monitorización de nuestro sistema sin quejas de espacio!

SaludoX