ZFS
- ¿Que es ZFS?
- Reparación de daños en todo el grupo de almacenamiento de ZFS
- Comprobación de la integridad del sistema de archivos ZFS
- Reemplazo de discos en caso de degradación de RAID 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
- Simple: uno más vdevs sin redundancia
- Mirror: dos o más vdevs por pares en modo espejo (equivalente a un RAID1)
- RaidZ: tres o más vdevs con paridad.
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
- Identificar un disco a la vez por número de serie
- zpool offline <zpool_name> <disk ID>
- zpool offline <zpool_name> <disk ID>
- Retirar la unidad y reemplázala con la unidad más grande
- zpool replace <zpool_name> <old disk ID> <new disk ID>
- Espera a que resilver se complete
- Repite desde el punto 1. hasta que se reemplacen todos los discos
- zpool online -e <zpool_name> <new disk ID> para cada disco
El grupo se expande automáticamente