Actualización de características en un sistema de ficheros ZFS (20200528)

A medida que ZFS evoluciona, se van desplegando características opcionales. Para preservar la compatibilidad, estas características nuevas son opcionales, un ZPOOL ZFS que no las utilice será compatible con versiones previas de ZFS.

Activar características opcionales en un ZPOOL ZFS es una decisión que no debe tomarse a la ligera. Algunas sí, pero no todas las características opcionales pueden desactivarse una vez que se activan en un ZPOOL ZFS. Por tanto, la regla de oro es que solo hay que activar características cuando hayamos tomado la decisión irrevocable de no volver atrás en una versión determinada de ZFS.

En esta valoración hay que considerar también con atención los mecanismos de los que disponemos ante una fallo catastrófico del sistema operativo. Por ejemplo, ¿el entorno de recuperación que tenemos en el pendrive USB es capaz de importar un ZPOOL ZFS con esa característica activada?

El ciclo de vida de una característica opcional suele ser el siguiente:

  1. Deshabilitada: La implementación ZFS soporta una característica determinada, pero no está activada en un ZPOOL ZFS dado. Esto permite importar el ZPOOL ZFS en una versión anterior de ZFS, si fuera necesario.

  2. Habilitada: Hemos activado la característica opcional, pero aún no se está utilizando. Habitualmente el ZPOOL ZFS se podrá importar en una versión anterior de ZFS. Por lo general, se podrá desactivar la característica opcional y volver a dejarla como deshabilitada.

  3. Activa: La característica opcional está en uso. Como regla general, el ZPOOL ZFS no se podrá importar en versiones de ZFS que no conozcan esa característica opcional. A veces es posible importar el ZPOOL ZFS en modo solo lectura, dependiendo de los detalles de funcionamiento de esa característica.

    Algunas características opcionales pueden pasar de activas a habilitadas y, por tanto, se podrían deshabilitar o bien importar el ZPOOL ZFS en un versión de ZFS que no reconozca esa característica. Por ejemplo, una característica que afecte a la destrucción de un dataset puede pasar de habilitada a activa mientras se está destruyendo un dataset, pasando nuevamente a habilitada al terminar.

    No obstante, como regla general, una característica que pasa a estar activa permanecerá en ese estado permanentemente. Normalmente esto se documenta en cada característica.

Vayamos al grano.

Una de mis máquinas lleva muchos meses funcionando con la misma versión del sistema operativo y de ZFS, sin ningún problema. Considero entonces que no voy a volver a una versión anterior y, por tanto, activar características opcionales parece poco arriesgado y posiblemente ventajoso.

Veamos qué nos dice el sistema operativo:

root@csi:~# zfs upgrade
This system is currently running ZFS filesystem version 5.

All filesystems are formatted with the current version.
root@csi:~# zpool upgrade
This system supports ZFS pool feature flags.

All pools are formatted using feature flags.


Some supported features are not enabled on the following pools. Once a
feature is enabled the pool may become incompatible with software
that does not support the feature. See zpool-features(5) for details.

POOL  FEATURE
---------------
blue
      multi_vdev_crash_dump
      large_dnode
      sha512
      skein
      edonr
      userobj_accounting
datos
      multi_vdev_crash_dump
      large_dnode
      sha512
      skein
      edonr
      userobj_accounting

Lo que vemos aquí es que todos los datasets están al día, pero el ZPOOL ZFS en sí tiene unas cuantas características opcionales desactivadas.

Activémoslas. Recuerda que este paso, en general, no tiene marcha atrás:

root@csi:~# zpool upgrade -a
This system supports ZFS pool feature flags.

Enabled the following features on 'blue':
  multi_vdev_crash_dump
  large_dnode
  sha512
  skein
  edonr
  userobj_accounting

Enabled the following features on 'datos':
  multi_vdev_crash_dump
  large_dnode
  sha512
  skein
  edonr
  userobj_accounting

Hemos activado todas las características opcionales. Confirmémoslo:

root@csi:~# zpool upgrade
This system supports ZFS pool feature flags.

All pools are formatted using feature flags.

Every feature flags pool has all supported features enabled.

Veamos las características:

root@csi:~# zpool get all datos
NAME   PROPERTY                       VALUE                          SOURCE
[...]
datos  feature@async_destroy          enabled                        local
datos  feature@empty_bpobj            active                         local
datos  feature@lz4_compress           active                         local
datos  feature@multi_vdev_crash_dump  enabled                        local
datos  feature@spacemap_histogram     active                         local
datos  feature@enabled_txg            active                         local
datos  feature@hole_birth             active                         local
datos  feature@extensible_dataset     enabled                        local
datos  feature@embedded_data          active                         local
datos  feature@bookmarks              enabled                        local
datos  feature@filesystem_limits      enabled                        local
datos  feature@large_blocks           enabled                        local
datos  feature@large_dnode            enabled                        local
datos  feature@sha512                 enabled                        local
datos  feature@skein                  enabled                        local
datos  feature@edonr                  enabled                        local
datos  feature@userobj_accounting     enabled                        local

¿Qué hemos activado realmente?

ZFS está bastante bien documentado. Por ejemplo, podemos ver el manual de zpool-features. También podemos ver la web oficial de OpenZFS.

multi_vdev_crash_dump

En Linux esta opción se ignora. En otros sistemas operativos, como Solaris, se utiliza para indicar que un ZPOOL ZFS se puede usar o se está usando para almacenar un volcado de memoria en caso de fallo catastrófico del sistema operativo.

large_dnode

Permite utilizar dnodes más grandes que 512 bytes, lo que puede mejorar el rendimiento con ficheros pequeños. Para empezar a utilizarlos, hay que configurar la propiedad dnodesize de un dataset. Esta característica pasará de activa a habilitada cuando se destruyan los datasets que la emplearon.

sha512

Utiliza sha512 para las sumas de control que verifican la integridad del sistema de ficheros y para el algoritmo de deduplicación. Utilizar sha512 en vez de sha256 en procesadores de 64 bits duplica el rendimiento.

skein

Se trata de otro algoritmo de hash para verificar la integridad del sistema de ficheros y para el algoritmo de deduplicación. Se trata de un algoritmo muy eficiente y con ciertas propiedades de seguridad interesantes.

edonr

Se trata de otro algoritmo de hash para verificar la integridad del sistema de ficheros y para el algoritmo de deduplicación. Este algoritmo es muy rápido (350% más rápido que sha256) y con ciertas propiedades de seguridad interesantes.

userobj_accounting

Una vez activado, ZFS llevará la cuenta del volumen de datos (número de objetos y tamaño) utilizados por usuario y por grupo.

Se puede acceder a esa información con los comandos zfs userspace y zfs groupspace. También se puede ver con zfs get, si se listan los usuarios o grupos de interés de forma explícita.

Gracias a esta contabilidad, ZFS permite fijar fácilmente cuotas por dataset, por usuario y por grupo.