Sobre la (no) purga de snapshots automáticos en Ubuntu 20.04 con zsys

per Victor Carceler darrera modificació 2021-01-07T09:26:10+01:00

Una de las características estrella —si bien experimental— es la instalación del sistema sobre ZFS. Cuando se instala de esta manera el demonio zsys se encarga de realizar snapshots del sistema antes de instalar cualquier paquete y snapshots de los directorios home de los usuarios cada vez que inician sesión y cada hora.

Se pueden consultar los detalles en: Primeras impresiones de Ubuntu 20.04 Focal Fossa.

Para resumir:

  • /usr/libexec/zsys-system-autosnapshotpermite crear snapshots del sistema y también actualizar grub para permitir revertir el estado del sistema. El snapshot se toma antes de instalar un paquete y grub se actualiza cuando se ha completado la instalación del paquete. El script se invoca mediante los hooks definidos en /etc/apt/apt.conf.d/90_zsys_system_autosnapshot. Cuando se crea un snapshot de la raíz porque se isntala algo también se crea un snapshot de cada uno de los datasets de los usuarios con el mismo identificador.
  • /usr/lib/systemd/user/zsys-user-savestate.timeres un timer dependiente de cada usuario. Invoca a /sbin/zsysctl state save un minuto después de que el usuario inicie sesión y después una vez cada hora. En cada caso se crea un nuevo snapshot del directorio del usuario.
  • El comando zsysctl show muestra la lista de snapshots de la raíz y de los home de los usuarios.
  • Utilizando el nuevo menú del gestor de arranque es posible revertir el estado de la máquina a uno de los snapshots de la raíz restaurando solo la raíz o la raíz y los home de los usuarios.

Purga de los snapshots automáticos

Después de utilizar Ubuntu 20.04 durante cinco días la máquina de prueba tiene estos snapshots:

usuario@laika:/etc/apt/apt.conf.d$ zsysctl show
Name:           rpool/ROOT/ubuntu_hrsnga
ZSys:           true
Last Used:      current
History:        
  - Name:       rpool/ROOT/ubuntu_hrsnga@autozsys_ycarpr
    Created on: 2020-05-09 14:11:28
  - Name:       rpool/ROOT/ubuntu_hrsnga@autozsys_nsjvim
    Created on: 2020-05-09 10:08:06
  - Name:       rpool/ROOT/ubuntu_hrsnga@autozsys_dedlwp
    Created on: 2020-05-09 10:05:56
  - Name:       rpool/ROOT/ubuntu_hrsnga@autozsys_lic9a8
    Created on: 2020-05-09 10:01:17
  - Name:       rpool/ROOT/ubuntu_hrsnga@autozsys_jgduti
    Created on: 2020-05-07 13:11:36
  - Name:       rpool/ROOT/ubuntu_hrsnga@autozsys_vilhf5
    Created on: 2020-05-07 13:11:03
  - Name:       rpool/ROOT/ubuntu_hrsnga@autozsys_ty866o
    Created on: 2020-05-07 12:54:05
  - Name:       rpool/ROOT/ubuntu_hrsnga@autozsys_t0an3y
    Created on: 2020-05-07 12:54:05
Users:
  - Name:    root
    History: 
     - rpool/USERDATA/root_i0pjda@autozsys_ycarpr (2020-05-09 14:11:28)
     - rpool/USERDATA/root_i0pjda@autozsys_nsjvim (2020-05-09 10:08:06)
     - rpool/USERDATA/root_i0pjda@autozsys_dedlwp (2020-05-09 10:05:57)
     - rpool/USERDATA/root_i0pjda@autozsys_lic9a8 (2020-05-09 10:01:17)
     - rpool/USERDATA/root_i0pjda@autozsys_jgduti (2020-05-07 13:11:36)
     - rpool/USERDATA/root_i0pjda@autozsys_vilhf5 (2020-05-07 13:11:04)
     - rpool/USERDATA/root_i0pjda@autozsys_ty866o (2020-05-07 12:54:05)
     - rpool/USERDATA/root_i0pjda@autozsys_t0an3y (2020-05-07 12:54:05)
  - Name:    usuario
    History: 
     - rpool/USERDATA/usuario_i0pjda@autozsys_8cwk9a (2020-05-11 11:37:55)
     - rpool/USERDATA/usuario_i0pjda@autozsys_p0b75e (2020-05-11 10:36:55)
     - rpool/USERDATA/usuario_i0pjda@autozsys_62txpx (2020-05-11 09:35:54)
     - rpool/USERDATA/usuario_i0pjda@autozsys_0ev2ng (2020-05-10 20:38:34)
     - rpool/USERDATA/usuario_i0pjda@autozsys_16fy5a (2020-05-10 16:45:47)
     - rpool/USERDATA/usuario_i0pjda@autozsys_21vmrl (2020-05-10 15:44:47)
     - rpool/USERDATA/usuario_i0pjda@autozsys_trdiuj (2020-05-10 14:43:46)
     - rpool/USERDATA/usuario_i0pjda@autozsys_rghosj (2020-05-10 13:38:07)
     - rpool/USERDATA/usuario_i0pjda@autozsys_l3nu1g (2020-05-10 12:37:28)
     - rpool/USERDATA/usuario_i0pjda@autozsys_vh01pk (2020-05-10 11:37:16)
     - rpool/USERDATA/usuario_i0pjda@autozsys_bxa87w (2020-05-10 10:26:32)
     - rpool/USERDATA/usuario_i0pjda@autozsys_w61kut (2020-05-09 19:45:32)
     - rpool/USERDATA/usuario_i0pjda@autozsys_407m46 (2020-05-09 18:05:06)
     - rpool/USERDATA/usuario_i0pjda@autozsys_79x70r (2020-05-09 16:51:51)
     - rpool/USERDATA/usuario_i0pjda@autozsys_ycarpr (2020-05-09 14:11:28)
     - rpool/USERDATA/usuario_i0pjda@autozsys_n5c9f5 (2020-05-09 13:42:55)
     - rpool/USERDATA/usuario_i0pjda@autozsys_42t3x2 (2020-05-09 12:20:40)
     - rpool/USERDATA/usuario_i0pjda@autozsys_z8hxq2 (2020-05-09 11:19:40)
     - rpool/USERDATA/usuario_i0pjda@autozsys_moe05w (2020-05-09 10:19:00)
     - rpool/USERDATA/usuario_i0pjda@autozsys_nsjvim (2020-05-09 10:08:06)
     - rpool/USERDATA/usuario_i0pjda@autozsys_dedlwp (2020-05-09 10:05:57)
     - rpool/USERDATA/usuario_i0pjda@autozsys_lic9a8 (2020-05-09 10:01:17)
     - rpool/USERDATA/usuario_i0pjda@autozsys_d4ouls (2020-05-08 15:19:30)
     - rpool/USERDATA/usuario_i0pjda@autozsys_jgduti (2020-05-07 13:11:36)
     - rpool/USERDATA/usuario_i0pjda@autozsys_vilhf5 (2020-05-07 13:11:04)
     - rpool/USERDATA/usuario_i0pjda@autozsys_ty866o (2020-05-07 12:54:05)
     - rpool/USERDATA/usuario_i0pjda@autozsys_t0an3y (2020-05-07 12:54:05)
usuario@laika:/etc/apt/apt.conf.d$

Aunque los snapshots de ZFS son muy ligeros es evidente que si se crean de manera automática convendrá tener algún sistema para eliminarlos de manera automática y liberar espacio.

El sistema automático para purgar snapshots de zsys parece estar compuesto por el timer /lib/systemd/system/zsys-gc.timer:

[Unit]
Description=Clean up old snapshots to free space

[Timer]
OnStartupSec=10min
OnUnitActiveSec=24h

[Install]
WantedBy=timers.target

Y la unidad /lib/systemd/system/zsys-gc.service:

[Unit]
Description=Clean up old snapshots to free space

# We can't run it in a container
ConditionVirtualization=!container

[Service]
Type=oneshot
ExecStart=/sbin/zsysctl service gc

Que parece haberse ejecutado con normalidad pero no ha eliminado nada:

usuario@laika:/etc/apt/apt.conf.d$ systemctl status zsys-gc
● zsys-gc.service - Clean up old snapshots to free space
     Loaded: loaded (/lib/systemd/system/zsys-gc.service; static; vendor preset: enabled)
     Active: inactive (dead) since Mon 2020-05-11 09:44:51 CEST; 2h 47min ago
TriggeredBy: ● zsys-gc.timer
    Process: 9792 ExecStart=/sbin/zsysctl service gc (code=exited, status=0/SUCCESS)
   Main PID: 9792 (code=exited, status=0/SUCCESS)

may 11 09:44:49 laika systemd[1]: Starting Clean up old snapshots to free space...
may 11 09:44:51 laika systemd[1]: zsys-gc.service: Succeeded.
may 11 09:44:51 laika systemd[1]: Finished Clean up old snapshots to free space.
usuario@laika:/etc/apt/apt.conf.d$

Porque si se invoca manualmente zsysctl service gc sencillamente no hace nada.

Configuración para la purga automática

Desgraciadamente no existe un fichero de configuración para indicar algunos parámetros básicos como el número de snapshots a guardar o durante qué periodo de tiempo se deben preservar. Estos valores están definidos en el código fuente de la aplicación y no están al alcance del administrador (a no ser que compile su propia versión de zsys).

Fichero: https://github.com/ubuntu/zsys/blob/master/internal/config/zsys.conf

Sin embargo tratándose de una característica experimental que puede hacer perder datos al usuario la versión de zsys instalada por defecto no elimina ningún snapshot. Tal y como confirma este hilo de twitter.

Así que si el próximo curso planeamos utilizar Ubuntu 20.04 instalado sobre ZFS en las aulas será necesario implementar algún script que borre periódicamente snapshots antiguos para no consumir todo el espacio de disco.