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

Este artículo es una continuación de Actualización de características en un sistema de ficheros ZFS (20200528). Lee primero ese texto para saber de qué estoy hablando.

Con el paso del tiempo voy actualizando ZFS y es posible activar características opcionales adicionales. Desde la actualización de 2020 hay novedades:

encryption
project_quota
device_removal
obsolete_counts
zpool_checkpoint
spacemap_v2
allocation_classes
resilver_defer
bookmark_v2

¿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.

encryption

Cifrado ZFS nativo. Tengo más información sobre cómo funciona y sus limitaciones en Instalación manual de Kubuntu 20.04 con LUKS y ZFS.

project_quota

Además de las cuotas de usuario y de grupo, existen también cuotas de proyecto. Al activar esta configuracion ZFS revisará el ZPOOL completo para crear las tablas de datos. Este proceso puede ser largo, pesado y afectar notablemente al rendimiento. Puede llegar al caso de bloquear el sistema si usas OpenZFS 0.8.3, como era mi caso. Tuve que actualizar a OpenZFS 2.1.6 para completar la operación. Con esa versión de OpenZFS el proceso progresa a buen ritmo, cosa que con 0.8.3 era matador.

Naturalmente actualizar a OpenZFS 2.1.6 supone que puedo activar aún más características opcionales. Pero dado que ahora que los discos ya están actualizados y se han generado las tablas internas puedo volver a OpenZFS 0.8.3, quiero mantener abierta esa posibilidad durante un tiempo. Eso supone no activar, de momento, características opcionales no disponibles en OpenZFS 0.8.3.

En cualquier caso, tras ese rastreo completo para crear las tablas internas, el mantenimiento de los valores es una actividad ligera e integrada con la operación normal de ZFS.

Se puede acceder a esa información con el comandos zfs projectpace.

device_removal

Tradicionalmente ZFS permite añadir discos al ZPOOL, pero no permite retirarlos (aunque sí reemplazarlos por discos iguales o mayores). Con esta característica opcional, ZFS permite eliminar discos y reducir el espacio de almacenamiento disponible (siempre que haya sitio libre suficiente en los demás discos, claro).

El funcionamiento interno es bastante interesante. Básicamente, el disco se reemplaza por un disco virtual distribuido por el resto del ZPOOL, de forma transparente. Esto supone un pequeño impacto en el rendimiento. A medida que esos datos se sobreescriben, se van quitando de ese disco virtual (eliminando poco a poco la ya de por sí pequeña pérdida de rendimiento). Esta forma de funcionar permite mantener ciertas invariantes de ZFS, como que un bloque en un snapshot nunca se mueve ni se sobreescribe.

obsolete_counts

Esta característica opcional es una mejora de la anterior, reduciendo el consumo de memoria a medida que se van sobreescribiendo datos en el disco virtual que ha sido eliminado y, con ello, migrándose de forma transparente al resto de discos duros que forman el ZPOOL.

zpool_checkpoint

Esta característica opcional permite hacer un checkpoint del ZPOOL entero. Esto posibilita volver a una versión anterior del ZPOOL entero. Esta funcionalidad es útil para hacer pruebas y experimentos, sabiendo que se puede volver atrás aunque hagas cosas tan extremas como destruir un dataset entero.

spacemap_v2

Mejora de eficiencia y rendimiento a la hora de codificar el espacio libre y ocupado en el ZPOOL.

allocation_classes

Esta característica opcional permite marcar ciertos dispositivos del ZPOOL para que almacenen preferentemente ciertos tipos de datos. Por ejemplo, podemos configurar el ZPOOL para que los metadatos de los ficheros y/o los ficheros pequeños se almacenen en una NVMe rápida, mientras que los datos grandes en sí se almacenan en discos duros grandes y baratos (y más lentos).

resilver_defer

El resilver, en ZFS, es lo que ocurre cuando hay que resincronizar los datos cuando se añade un disco duro al ZPOOL, o un disco offline pasa a estar online, etc. En ciertas circunstancias se pueden activar varios resilver en rápida sucesión. Cuando eso ocurría antes, el resilver empezaba desde el principio. Con esta característica opcional activada, se permite que el resilver en curso se complete antes de empezar el siguiente, en vez de empezar desde el principio.

bookmark_v2

En ZFS un bookmark hace posible marcar un estado de un dataset para que sea utilizable para zfs send sin tener que mantener un snapshot explícito. Eso permite no tener que sacrificar espacio en disco, si lo único que deseamos es poder hacer zfs send incrementales.

Esta característica opcional, que mejora los bookmarks ZFS ya existentes, se necesita para ciertas funcionalidades ZFS nuevas, como el cifrado ZFS.

¿Cuál es el estado actual?

Con todo esto activado, la situación actual de mi ZPOOL es la siguiente:

root@csi:/datos# zpool get all datos
NAME   PROPERTY                       VALUE                          SOURCE
datos  size                           1.81T                          -
datos  capacity                       91%                            -
datos  altroot                        -                              default
datos  health                         DEGRADED                       -
datos  guid                           15343083286241728158           -
datos  version                        -                              default
datos  bootfs                         -                              default
datos  delegation                     on                             default
datos  autoreplace                    off                            default
datos  cachefile                      -                              default
datos  failmode                       wait                           default
datos  listsnapshots                  on                             local
datos  autoexpand                     off                            default
datos  dedupditto                     0                              default
datos  dedupratio                     1.00x                          -
datos  free                           151G                           -
datos  allocated                      1.67T                          -
datos  readonly                       off                            -
datos  ashift                         12                             local
datos  comment                        -                              default
datos  expandsize                     -                              -
datos  freeing                        0                              -
datos  fragmentation                  40%                            -
datos  leaked                         0                              -
datos  multihost                      off                            default
datos  checkpoint                     -                              -
datos  load_guid                      7970756096151051066            -
datos  autotrim                       off                            default
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     active                         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     active                         local
datos  feature@encryption             enabled                        local
datos  feature@project_quota          enabled                        local
datos  feature@device_removal         enabled                        local
datos  feature@obsolete_counts        enabled                        local
datos  feature@zpool_checkpoint       enabled                        local
datos  feature@spacemap_v2            active                         local
datos  feature@allocation_classes     enabled                        local
datos  feature@resilver_defer         enabled                        local
datos  feature@bookmark_v2            enabled                        local

Nota

El estado del ZPOOL es DEGRADED porque se trata de una configuración en espejo en la que uno de los discos está offline y almacenado de forma remota, como precaución ante errores, incendios, robos, etc. Explico los detalles en Backup doméstico seguro con Linux, cifrado y ZFS (III).