Gestión de snapshots en ZFS

ZFS (sistema de archivos desarrollado por Sun Microsystems para Solaris) permite realizar snapshots del sistema de ficheros de forma instantanea a través del comando zfs snapshot. Básicamente, un snapshot es una copia exacta del sistema de ficheros que posteriormente podemos utilizar para clonar, restaurar, guardar a modo de copia antes de la realización de cambios críticos en el sistema, etc. Lo que no podemos hacer es manipularlos, los snapshots son copias de sólo lectura.

Los snapshot se almacenan en el propio disco, por lo que su utilización supone la utilización de espacio extra y no sirven como backup en caso de desastre. Inicialmente no ocupan espacio extra, pero sí lo hacen conforme la información del sistema de ficheros cambia respecto al snapshot.

Crear, destruir y renombrar un snapshot

La sintaxis básica para la creación de un snapshot es la siguiente:

# zfs snapshot sistema_de_ficheros@nombre_snapshot

Por ejemplo, para crear un snapshot de «rpool/ROOT/solaris» con nombre la fecha de hoy:

# zfs snapshot rpool/ROOT/solaris@`date +%d%m%Y`

Para eliminar el snapshot usamos el comando zfs destroy:

# zfs destroy rpool/ROOT/solaris@04102011

Y para renombrarlo:

# zfs rename rpool/ROOT/solaris@04102011 rpool/ROOT/solaris@nuevo-snap

Listar snapshots disponibles

# zfs list -t snapshot
NAME                          USED  AVAIL  REFER  MOUNTPOINT
rpool/ROOT/solaris@install   22,5M      -  2,04G  -
rpool/ROOT/solaris@04102011    37K      -  2,44G  -

Con el comando zfs list -t snapshot podemos ver un listado de todos los snapshot disponibles, los snapshots se almacenan en el directorio oculto .zfs de la ruta base donde está montado el sistema de ficheros, en el caso de los anteriores /.zfs/snapshot. De esta forma podríamos restaurar ficheros concretos del snapshot en lugar de todo:

# ls -l /.zfs/snapshot
total 5
drwxr-xr-x 24 root root 25 2011-10-03 21:17 04102011
drwxr-xr-x 24 root root 25 2011-10-03 21:17 10042011
drwxr-xr-x 24 root root 26 2011-09-22 18:42 install

También conviene revisar el espacio en disco utilizado, el comando zfs list -o space nos mostrará con detalle el espacio utilizado a nivel general, por los snapshot, subsistemas de ficheros (child), etc:

# zfs list -o space
NAME                    AVAIL   USED  USEDSNAP  USEDDS  USEDREFRESERV  USEDCHILD
rpool                   3,19G  3,27G         0   92,5K              0      3,27G
rpool/ROOT              3,19G  2,46G         0     31K              0      2,46G
rpool/ROOT/solaris      3,19G  2,46G     22,5M   2,44G              0          0
rpool/dump              3,19G   256M         0    256M              0          0
rpool/export            3,19G  26,2M         0     32K              0      26,2M
rpool/export/home       3,19G  26,2M         0     32K              0      26,2M
rpool/export/home/alex  3,19G  26,2M       20K   26,2M              0          0
rpool/swap              3,54G   544M         0    181M           364M          0

Restaurar un snapshot

Hacer un rollback o restaurar un snapshot es tan sencillo como utilizar el comando zfs rollback seguido del snapshot a restaurar. Lo que hay que tener claro son las consecuencias de restaurar un snapshot antiguo, ya que restauremos el sistema de ficheros tal y como se encontraba en el momento del snapshot.

Algo a tener en cuenta, es que únicamente podemos restaurar el snapshot más reciente. Si tuvieramos varios y quisieramos hacer rollback de uno antiguo, antes habría que eliminar los más recientes. Recibiríamos este error:

# zfs rollback rpool/ROOT/solaris@10042011
cannot rollback to 'rpool/ROOT/solaris@10042011': more recent snapshots exist
use '-r' to force deletion of the following snapshots:
rpool/ROOT/solaris@04102011

Así que eliminaríamos el reciente y ya podríamos hacerlo, también podríamos forzar con el parámetro -r a que se eliminan automáticamente:

# zfs destroy rpool/ROOT/solaris@04102011
# zfs rollback rpool/ROOT/solaris@10042011
# zfs rollback -r rpool/ROOT/solaris@10042011