ZFS es un sistema de ficheros desarrollado originalmente por Sun Microsystem, ahora Oracle, para el sistema operativo Solaris. Este sistema se basa en pools de almacenamiento o storage pool. Sobre esos pools se crean los ZFS que son montados como carpetas del sistema. Son dos los comandos que utilizaremos para gestionarlos: El comando zpool para la gestión de los pools y el comando zfs para la gestión de los ZFS.
Gestión de zpools
Los zpool gestionan los discos para crear un espacio de almacenamiento para el sistema operativo. La arquitectura de estos pools se adapta a nuestros requerimientos. Los pools pueden ser de tres tipos:
- RAID 0 o Concatenación: El espacio de almacenamiento es la suma de la capacidad de los discos.
- RAID 1 o Mirror. Utiliza dos discos iguales y almacena el mismo contenido en los dos. Este sistema soporta la caída de un disco.
- RAID Z, similar a RAID-5: Utiliza discos de checksum para soportar la caída de uno, dos o tres discos. Es más eficiente que un RAID 1 en pools con muchos discos.
Creación de un zpool RAID 0
En este tipo de pools la capacidad resultante es la suma de las capacidades de los discos que lo componen. Es la manera de conseguir la mayor capacidad aunque tiene el riesgo de que se estropee un discos. En caso de caída de un disco se pierde todo el contenido. Para crearlo se ejecuta el siguiente comando:
# zpool create tank c1t0d0 c1t0d1
Creación de un zpool RAID 1
En este caso tenemos que utilizar discos del mismo tamaño para no desperdiciar el espacio. El resultado final es el de el disco más pequeño.
# zpool create tank mirror c1d0 c2d0 mirror c3d0 c4d0
El disco c1d0 debe ser igual al c3d0 y, el disco c2d0, debe ser igual al disco c4d0. La capacidad total es la mitad de la capacidad de los discos.
Esta arquitectura soporta la caída de todos los discos de un lado del mirror. Por ejemplo soportaría la caída de c3d0 y c4d0, pero no soportaría la caída de c1d0 y c4d0. La caída de un solo disco siempre estará soportada.
Creación de un zpool RAID-Z
Es un sistema más eficiente que el RAID 1. Utiliza uno, dos o tres discos de checksum. El disco de checksum no aporta capacidad al zpool por lo que, el número de discos de checksum, dependerá del número de discos del zpool. Una cosa a tener en cuenta es que todos los discos deben tener la misma capacidad.
Para crearlo con un solo disco de checksum utilizamos el siguiente comando:
# zpool create tank raidz c1t0d0 c2t0d0 c3t0d0 c4t0d0
Con dos discos de checksum:
# zpool create tank raidz2 c1t0d0 c2t0d0 c3t0d0 c4t0d0 c5t0d0
Con tres discos de checksum:
# zpool create tank raidz3 c0t0d0 c1t0d0 c2t0d0 c3t0d0 c4t0d0 c5t0d0 c6t0d0 c7t0d0
En este último caso tenemos más seguridad ya que soporta la caída de tres discos, pero también perdemos la capacidad de tres discos. Lo normal es utilizarlo en pools con muchos discos.
Añadir un disco en mirror
La creación de un mirror puede hacerse en un segundo paso añadiendo discos a un RAID 0. Imaginemos un pool con dos discos:
# zpool create tank c1t0d0 c1t1d0
A este RAID 0 podemos añadir dos discos iguales para crear un RAID 1
# zpool add tank mirror c2t0d0 c2t1d0
La sincronización no es inmediata. Debemos esperar a una sincronización entre la parte activa y la parte nueva. En caso de discos grandes, esta sincronización, puede tardar bastantes minutos. Lo podemos controlar con el comando zpool status tank. Cuando termina la sincronización se mostraría la siguiente salida:
# zpool status tank
pool: tank
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c1t0d0 ONLINE 0 0 0
c1t1d0 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
c2t0d0 ONLINE 0 0 0
c2t1d0 ONLINE 0 0 0
errors: No known data errors
#
Configuración de un pool de arranque
El pool principal que siempre está presente en un sistema Solaris se denomina rpool. El zpool rpool es el pool donde se instala el sistema operativo y desde donde se arranca el sistema. Lo normal es que tengamos un RAID 1 o mirror en este pool.
# zpool status rpool
pool: rpool
state: ONLINE
scrub: not requeted
config:
NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c1t0d0 ONLINE 0 0 0
c1t1d0 ONLINE 0 0 0
errors: No known data errors
Para que el sistema arranque desde estos discos se debe instalar el boot block. Esto se realiza con el siguiente comando:
# bootadm install-bootloader -P rpool
Esto carga el boot block en los dos discos del pool rpool. El sistema puede arrancar desde cualquiera de los dos discos.
En sistemas Solaris con versiones antiguas se ejecutaba el siguiente comando en los dos discos:
# installboot -F zfs /usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/c1t0d0s0
Este comando ya no se utiliza en versiones posteriores a solaris 11 del noviembre de 2011. Si lo ejecutamos en sistemas operativos posteriores podemos corromper el boot block. Se produce el siguiente error:
{0} ok boot
WARNING: /virtual-devices@100/channel-devices@200/disk@0: Communication error with Virtual Disk Server using Port 0. Retrying.
ERROR: Last Trap: Fast Data Access MMU Miss
Para solucionarlo utilizamos el comando format y seleccionamos los discos de rpool. En cada uno ejecutamos el subcomando backup.