ZFS

¿Que es ZFS?

ZFS es un sistema de archivos que desarrolló en sus principios Sun Microsystems para su sistema operativo Solaris. El acrónimo viene de Zettabyte File System.

ZFS destaca por su gran capacidad fiabilidad y que integra un administrador de ficheros y de volúmenes en el mismo producto.

Storage Pools

En los sistemas de ficheros tradicionales que se apoyan sobre un solo dispositivo subyacente (disco duro) y por lo tanto requieren un gestor de volúmenes separado, ZFS se apoya en espacios de almacenamiento virtuales (virtual storage pools).

Estos Storage Pools se construyen a partir de uno o más dispositivos virtuales o vdev que es como se referencia a cualquier dispositivo de almacenamiento en ZFS.

El polos puede ser de los siguientes tipos

Adicionalmente se pueden añadir vdevs para operaciones como caché, registro ZFS Intent Log (ZIL) que normalmente se instalan sobre dispositivos SSD o NVE para mejorar el rendimiento.

Niveles de RaidZ

RaidZ o RAIDZ1 proporciona redundancia de paridad sencilla (fallo de 1 disco). Es el equivalente a un Raid5 y se pierde la capacidad de almacenamiento de 1 disco.

RaidZ2 proporciona redundancia de paridad doble (fallo de 2 disco2). Es el equivalente a un Raid6 y se pierde la capacidad de almacenamiento de 2 discos

RaidZ3 proporciona redundancia de paridad triple y se pierde la capacidad de almacenamiento de 3 discos

Reparación de daños en todo el grupo de almacenamiento de ZFS

Reparación de daños en todo el grupo de almacenamiento de ZFS

Si el daño está en los metadatos del grupo y ese daño evita que el grupo se abra o se importe, entonces están disponibles las siguientes opciones:

Recuperar el grupo

Intentar recuperar el grupo mediante el comando zpool clear -F o el comando zpool import -F. Estos comandos intentan revertir las últimas transacciones del grupo a un estado operativo. Puede utilizar el comando zpool status para revisar un grupo dañado y los pasos de recuperación recomendados. Por ejemplo:

# zpool status
  pool: MIPOOL
 state: FAULTED
status: The pool metadata is corrupted and the pool cannot be opened.
action: Recovery is possible, but will result in some data loss.
        Returning the pool to its state as of Wed Jul 14 11:44:10 2010
        should correct the problem.  Approximately 5 seconds of data
        must be discarded, irreversibly.  Recovery can be attempted
        by executing 'zpool clear -F tpool'.  A scrub of the pool
        is strongly recommended after recovery.
   see: http://www.sun.com/msg/ZFS-8000-72
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
         MIPOOL     FAULTED      0     0     1  corrupted data
          c1t1d0    ONLINE       0     0     2
          c1t3d0    ONLINE       0     0     4

El proceso de recuperación descrito anteriormente es utilizar el siguiente comando:

# zpool clear -F NOMBRE_DEL_POOL

Si intenta importar un grupo de almacenamiento dañado, verás mensajes similares a los siguientes:

# zpool import MIPOOL
cannot import 'MIPOOL': I/O error
        Recovery is possible, but will result in some data loss.
        Returning the pool to its state as of Wed Jul 14 11:44:10 2010
        should correct the problem.  Approximately 5 seconds of data
        must be discarded, irreversibly.  Recovery can be attempted
        by executing 'zpool import -F tpool'.  A scrub of the pool
        is strongly recommended after recovery.

El proceso de recuperación descrito anteriormente es utilizar el siguiente comando:

# zpool import -F MIPOOL
Pool tpool returned to its state as of Wed Jul 14 11:44:10 2010.
Discarded approximately 5 seconds of transactions

Si el grupo dañado está en el archivo zpool.cache, el problema se descubre cuando se inicia el sistema y el grupo dañado se informa en el comando zpool status. Si el grupo no está en el archivo zpool.cache, no se importará ni abrirá correctamente y verá los mensajes del grupo dañado cuando intente importar el grupo.

Si el grupo no se puede recuperar mediante el método de recuperación de grupo descrito anteriormente, debe restaurar el grupo y todos sus datos desde una copia de seguridad. El mecanismo que utiliza varía mucho según la configuración del grupo y la estrategia de copia de seguridad. Primero, guarde la configuración tal como se muestra en el comando zpool status para que pueda volver a crearla después de que se destruya el grupo. Luego, use el comando zpool destroy -f para destruir el grupo. Además, mantenga un archivo que describa el diseño de los conjuntos de datos y las diversas propiedades establecidas localmente en un lugar seguro, ya que esta información se volverá inaccesible si el grupo se vuelve inaccesible. Con la configuración del grupo y el diseño del conjunto de datos, puede reconstruir su configuración completa después de destruir el grupo. Luego, los datos se pueden completar utilizando cualquier estrategia de copia de seguridad o restauración que utilice.

Comprobación de la integridad del sistema de archivos ZFS

Comprobación de la integridad del sistema de archivos ZFS

No existe equivalente de utilidad fsck para ZFS. Esta utilidad ha servido tradicionalmente para dos propósitos, los de reparación del sistema de archivos y la validación del sistema de archivos

Reparación del sistema de archivos

Con los sistemas de archivos tradicionales, la forma en que se escriben los datos es intrínsecamente vulnerable a fallos inesperados que causan inconsistencias en el sistema de archivos. Debido a que un sistema de archivos tradicional no es transaccional, es posible que haya bloques sin referencia, recuentos de enlaces incorrectos u otras estructuras inconsistentes del sistema de archivos. La adición del registro en diario resuelve algunos de estos problemas, pero puede presentar problemas adicionales cuando el registro no se puede deshacer. La única forma de que existan datos inconsistentes en el disco en una configuración ZFS es a través de un fallo de hardware (en cuyo caso el grupo debería haber sido redundante) o cuando existe un error en el software ZFS.

La utilidad fsck repara problemas conocidos específicos de los sistemas de archivos UFS. La mayoría de los problemas del grupo de almacenamiento de ZFS generalmente están relacionados con fallas de hardware o fallas de energía. Se pueden evitar muchos problemas mediante el uso de agrupaciones redundantes. Si su grupo está dañado debido a un hardware defectuoso o un corte de energía, consulte Reparación de daños en todo el grupo de almacenamiento de ZFS.

Si su grupo no es redundante, el riesgo de que la corrupción del sistema de archivos pueda hacer que algunos o todos sus datos sean inaccesibles siempre está presente.

Validación del sistema de archivos

Además de realizar la reparación del sistema de archivos, la utilidad fsck valida que los datos en el disco no tengan problemas. Tradicionalmente, esta tarea requiere desmontar el sistema de archivos y ejecutar la utilidad fsck, posiblemente llevando el sistema al modo de usuario único en el proceso. Este escenario da como resultado un tiempo de inactividad que es proporcional al tamaño del sistema de archivos que se está verificando. En lugar de requerir una utilidad explícita para realizar las comprobaciones necesarias, ZFS proporciona un mecanismo para realizar comprobaciones rutinarias de todas las inconsistencias. Esta función, conocida como depuración, se usa comúnmente en la memoria y otros sistemas como un método para detectar y prevenir errores antes de que provoquen una falla de hardware o software.

Controlar la depuración de datos de ZFS ( ZFS Data Scrubbing )

Siempre que ZFS encuentra un error, ya sea mediante la limpieza o al acceder a un archivo bajo demanda, el error se registra internamente para que pueda obtener una descripción general rápida de todos los errores conocidos dentro del grupo.

Depuración explícita de datos de ZFS

La forma más sencilla de verificar la integridad de los datos es iniciar una depuración explícita de todos los datos dentro del grupo. Esta operación atraviesa todos los datos del grupo una vez y verifica que se puedan leer todos los bloques. La limpieza se realiza tan rápido como lo permiten los dispositivos, aunque la prioridad de cualquier E / S permanece por debajo de la de las operaciones normales. Esta operación podría afectar negativamente al rendimiento, aunque los datos del grupo deberían seguir siendo utilizables y casi tan receptivos mientras se realiza la depuración. Para iniciar una limpieza explícita, use el comando zpool scrub. Por ejemplo:

# zpool scrub NOMBRE_DEL_POOL

El estado de la operación de limpieza actual se puede mostrar mediante el comando de status zpool. Por ejemplo:

root@freenas001:/mnt/Data/backups/ashay/cbs # zpool status -v Data
  pool: Data
 state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
	still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
	the pool may no longer be accessible by software that does not support
	the features. See zpool-features(7) for details.
  scan: scrub repaired 0 in 0 days 06:17:08 with 0 errors on Sun Mar 28 07:17:10 2021
config:

	NAME                                            STATE     READ WRITE CKSUM
	Data                                            ONLINE       0     0     0
	  raidz2-0                                      ONLINE       0     0     0
	    gptid/c55616c1-b818-11e7-b781-002590839ad8  ONLINE       0     0     0
	    gptid/c5e3a0ce-b818-11e7-b781-002590839ad8  ONLINE       0     0     0
	    gptid/c6676677-b818-11e7-b781-002590839ad8  ONLINE       0     0     0
	    gptid/c6e79bb5-b818-11e7-b781-002590839ad8  ONLINE       0     0     0
	    gptid/c76955a5-b818-11e7-b781-002590839ad8  ONLINE       0     0     0
	    gptid/c7f2cc81-b818-11e7-b781-002590839ad8  ONLINE       0     0     0
	    gptid/c877cb95-b818-11e7-b781-002590839ad8  ONLINE       0     0     0
	    gptid/c8fde5d5-b818-11e7-b781-002590839ad8  ONLINE       0     0     0
	    gptid/c985e91c-b818-11e7-b781-002590839ad8  ONLINE       0     0     0
	    gptid/ca0cfa64-b818-11e7-b781-002590839ad8  ONLINE       0     0     0

errors: No known data errors

Ejemplo de un pool degradado

root@backup001[~]# zpool status
  pool: freenas-boot
 state: ONLINE
  scan: scrub repaired 0 in 0 days 00:00:06 with 0 errors on Tue Mar 23 03:45:06 2021
config:

	NAME        STATE     READ WRITE CKSUM
	freenas-boot  ONLINE       0     0     0
	  da0p2     ONLINE       0     0     0

errors: No known data errors

  pool: storage
 state: DEGRADED
status: One or more devices has experienced an unrecoverable error.  An
	attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
	using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://illumos.org/msg/ZFS-8000-9P
  scan: scrub in progress since Mon Mar 29 17:59:23 2021
	11.2T scanned at 199M/s, 8.72T issued at 155M/s, 62.0T total
	0 repaired, 14.07% done, 4 days 04:22:00 to go
config:

	NAME                                            STATE     READ WRITE CKSUM
	storage                                         DEGRADED     0     0     0
	  raidz2-0                                      DEGRADED     0     0     0
	    gptid/a454f250-70fe-11e9-9d0d-1866dab518d7  ONLINE       0     0     0
	    gptid/a4d16045-70fe-11e9-9d0d-1866dab518d7  ONLINE       0     0     0
	    gptid/a555b47b-70fe-11e9-9d0d-1866dab518d7  ONLINE       0     0     0
	    gptid/a5d78293-70fe-11e9-9d0d-1866dab518d7  ONLINE       0     0     0
	    gptid/a65d3965-70fe-11e9-9d0d-1866dab518d7  ONLINE       0     0    29
	    gptid/a70507cd-70fe-11e9-9d0d-1866dab518d7  ONLINE       0     0    29
	    gptid/772f7a33-1c6c-11eb-ab49-1866dab518d7  ONLINE       0     0     0
	    gptid/a9211c24-70fe-11e9-9d0d-1866dab518d7  DEGRADED     0     0    53  too many errors
	    gptid/aa2e2dbb-70fe-11e9-9d0d-1866dab518d7  ONLINE       0     0     0
	    gptid/ab635660-70fe-11e9-9d0d-1866dab518d7  ONLINE       0     0     0
	    gptid/ac715b96-70fe-11e9-9d0d-1866dab518d7  ONLINE       0     0     0
	    gptid/ad81a911-70fe-11e9-9d0d-1866dab518d7  ONLINE       0     0     6

errors: No known data errors

Solo se puede realizar una operación de scrub activa por pool a la vez. Puede detener una operación de limpieza en curso mediante la opción -s. Por ejemplo:

# zpool scrub -s NOMBRE_DE_POOL

En la mayoría de los casos, una operación de depuración para garantizar la integridad de los datos debe continuar hasta completarse. Puedes detener la operación de scrub a su tu criterio si el rendimiento del sistema se ve afectado por la operación.

El rendimiento de la rutina de scrubbing garantiza operaciones de E/S continua a todos los discos del sistema. La limpieza de rutina tiene el efecto secundario de evitar que la administración de energía coloque los discos inactivos en modo de bajo consumo. Si el sistema generalmente realiza E/S todo el tiempo, o si el consumo de energía no es un problema, entonces este problema se puede ignorar con seguridad.

Reemplazo de discos en caso de degradación de RAID ZFS

En primer lugar vamos a ver el estado del pool

# zpool status
  pool: rpool
 state: DEGRADED
status: One or more devices could not be used because the label is missing or
	invalid.  Sufficient replicas exist for the pool to continue
	functioning in a degraded state.
action: Replace the device using 'zpool replace'.
   see: http://zfsonlinux.org/msg/ZFS-8000-4J
  scan: scrub repaired 384K in 1070h3m with 0 errors on Tue Feb 23 14:27:56 2021
config:

	NAME                              STATE     READ WRITE CKSUM
	rpool                             DEGRADED     0     0     0
	  mirror-0                        ONLINE       0     0     0
	    wwn-0x50014ee264214812-part1  ONLINE       0     0     2
	    wwn-0x50014ee20e5acbbe-part1  ONLINE       0     0     4
	  mirror-1                        DEGRADED     0     0     0
	    wwn-0x50014ee261dfc7ff-part1  ONLINE       0     0     0
	    wwn-0x50014ee2b7358a0a-part1  UNAVAIL      0     0     0

errors: No known data errors

Como podemos ver en este caso la partición wwn-0x50014ee2b7358a0a-part1 está dando problemas. Si hacemos un ls -lah /dev/disk/by-id podemos ver que identificador wwn se corresponde con el disco.

Preparar el disco para sacarlo

Una vez identificado el disco, nos tenemos que asegurar de que las particiones no están actualmente montadas o forman parte de un RAID.

Para ver si montadas puedes usar df o mount.

Para ver si forma parte de un raid por software podemos usar "fdisk -l /dev/(id del disco)" para ver las particiones. En caso de que nos encontremos un tipo de partición "Linux RAID" o "Solaris /usr & Apple ZFS" tendremos que tenerlo en cuenta a la hora de reemplazar el disco ya que tendremos que marcar esta partición como fallida o "offline".

En el caso de zfs, podría darse el caso de tener 2 o mas pools como en este caso:

# zpool status
  pool: bpool
 state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
	still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
	the pool may no longer be accessible by software that does not support
	the features. See zpool-features(5) for details.
  scan: scrub repaired 0B in 0 days 00:00:01 with 0 errors on Sun Mar 14 00:24:03 2021
config:

	NAME                              STATE     READ WRITE CKSUM
	bpool                             ONLINE       0     0     0
	  mirror-0                        ONLINE       0     0     0
	    wwn-0x50014ee20cac5e8c-part2  ONLINE       0     0     0
	    wwn-0x50014ee20cac9ddc-part2  ONLINE       0     0     0
	  mirror-1                        ONLINE       0     0     0 
	    wwn-0x50014ee2b9051b25-part2  ONLINE       0     0     0
	    wwn-0x50014ee262017b82-part2  ONLINE       0     0     0

errors: No known data errors

  pool: rpool
 state: ONLINE
  scan: scrub repaired 0B in 0 days 11:07:22 with 0 errors on Sun Mar 14 11:31:25 2021
config:

	NAME                              STATE     READ WRITE CKSUM
	rpool                             ONLINE       0     0     0
	  mirror-0                        ONLINE       0     0     0
	    wwn-0x50014ee20cac5e8c-part3  ONLINE       0     0     0
	    wwn-0x50014ee20cac9ddc-part3  ONLINE       0     0     0
	  mirror-1                        ONLINE       0     0     0
	    wwn-0x50014ee2b9051b25-part3  ONLINE       0     0     0
	    wwn-0x50014ee262017b82-part3  ONLINE       0     0     0

errors: No known data errors

En este caso si por ejemplo tuviéramos un problema con wwn-0x50014ee262017b82-part3 tendríamos que reemplazar también wwn-0x50014ee262017b82-part2 ya que son particiones del mismo disco. Para marcar como offline esa partición ejecutamos lo siguiente:

zpool offline bpool wwn-0x50014ee262017b82-part2

Una vez hemos verificado que no tenemos nada montado y que no hay ninguna partición que esté activa y formando parte de un RAID, ya podemos sacar el disco.

Identificar físicamente el Disco

Una vez sepamos qué disco está fallando, lo podemos hacer iluminar para identificarlo ejecutando el siguiente comando:

dd if=/dev/disk/by-id/(id del disco) of=/dev/null

Reemplazar el disco

Una vez sabemos que disco es y cuando la luz del disco esté apagada, podemos sacarlo y reemplazarlo por otro. Esto conviene coordinarlo con alguien que esté atento del syslog.

Copiar tabla de particiones

Teniendo en cuenta que /dev/sdd en el disco "mirror" del que está fallando y que el reemplazo es /dev/sdc, ejecutamos el siguiente comando para copiar la tabla de particiones:

sgdisk /dev/sdd -R /dev/sdc

Después tenemos que volver a generar los GUIDs del las particiones del disco nuevo

sgdisk -G /dev/sdc

Reemplazar particiones en ZFS

En este caso para reemplazar la partición "wwn-0x50014ee26201e74e-part3" por "wwn-0x50014ee2b9051b25-part3" en "rpool" ejecutamos el siguiente comando:

zpool replace rpool wwn-0x50014ee26201e74e-part3 wwn-0x50014ee2b9051b25-part3

Instalar grub en el nuevo disco

Para instalar grub (legacy) en el nuevo disco (/dev/sdc)

grub-install /dev/sdc

Reemplazar con discos mas grandes

  1. Identificar un disco a la vez por número de serie

    • zpool offline <zpool_name> <disk ID>

  2. Retirar la unidad y reemplázala con la unidad más grande
    • zpool replace <zpool_name> <old disk ID> <new disk ID>
  3. Espera a que resilver se complete
  4. Repite desde el punto 1. hasta que se reemplacen todos los discos

El grupo se expande automáticamente