ZFS : Aprendiendo ZFS en 12 pasos

Este post no pretende ser un manual de ZFS, solo una sencilla guía rápida que permita a los neófitos en la materia, disponer de un punto de inicio que les sirva de trampolín, para poder profundizar en ZFS. Por esta razón, el post solo cuenta con 12 sencillos pasos, los cuales describen a grandes rasgos las operaciones básica que alguien que empieza debe aprender.

ZFS dispone de 2 comandos zpool y zfs.

Paso 1:Crear un pool

La primera operación cuando se comienza con ZFS es la creación de un pool de discos.

root # zpool create -f pool_prueba c2t500A098286584110d1 c2t500A098286584110d2

Se crea un pool llamado pool_prueba utilizando los discos c2t500A098286584110d1 y c2t500A098286584110d2.

Con el zpool list podemos ver la lista de pooles que están configurados en nuestro sistema.

root # zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
pool_prueba            19.9G     90K   19.9G     0%  ONLINE     -
root #
root # df -h | grep pool
pool_prueba             20G    24K    20G     1%    /pool_prueba
root #

Paso 2:Crear FS ZFS

Una vez creado el pool de disco, podemos crear los sistemas de ficheros, para ello utilizaremos el comando zfs.

root # zfs create pool_prueba/fs1
root # zfs create pool_prueba/fs2

Se han creado los FS en el pool pool_prueba llamados fs1 y fs2.

root # df -k | grep pool
pool_prueba          20514816      27 20514668     1%    /pool_prueba
pool_prueba/fs1      20514816      24 20514668     1%    /pool_prueba/fs1
pool_prueba/fs2      20514816      24 20514668     1%    /pool_prueba/fs2
root #
root # zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
pool_prueba       148K  19.6G  27.5K  /pool_prueba
pool_prueba/fs1  24.5K  19.6G  24.5K  /pool_prueba/fs1
pool_prueba/fs2  24.5K  19.6G  24.5K  /pool_prueba/fs2
root #

Como podemos ver con el comando df y con zfs list, los nuevos FS se han creado y montado por defecto sobre el directorio /pool_prueba

Paso 3:Cambio del punto de montaje

Podemos cambiar los puntos de montaje de los nuevos sistemas de ficheros creados en el paso anterior, con el comando zfs set

root # zfs set mountpoint=/fs1 pool_prueba/fs1
root #
root # zfs set mountpoint=/fs2 pool_prueba/fs2
root #

Se cambia el punto de montaje del FS pool_prueba/fs1 para que sea el directorio /fs1, lo mismo hacemos con el FS pool_prueba/fs2

root # df -k | grep pool
pool_prueba          30772224      24 30771987     1%    /pool_prueba
pool_prueba/fs2      30772224      24 30771987     1%    /fs2
pool_prueba/fs1      30772224      28 30771987     1%    /fs1

Paso 4:Añadir discos al pool

Esta operación nos pemite añadir nuevos disco a nuestro pool. Utilizaremos el comando zpool add.

root # zpool add -f pool_prueba c2t500A098286584110d3
root # zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
pool_prueba      97.9M  29.3G  24.5K  /pool_prueba
pool_prueba/fs1  97.8M  29.3G  97.8M  /fs1
pool_prueba/fs2  24.5K  29.3G  24.5K  /fs2
root #

Paso 5:Atributos de un FS

Podemos ver los atributos definidos en un FS determinado, empleando el comando zfs get

root # zfs get all pool_prueba/fs1
NAME             PROPERTY       VALUE                  SOURCE
pool_prueba/fs1  type           filesystem             -
pool_prueba/fs1  creation       Wed Dec 10 18:38 2008  -
pool_prueba/fs1  used           51K                    -
pool_prueba/fs1  available      29.3G                  -
pool_prueba/fs1  referenced     28.5K                  -
pool_prueba/fs1  compressratio  1.00x                  -
pool_prueba/fs1  mounted        yes                    -
pool_prueba/fs1  quota          none                   default
pool_prueba/fs1  reservation    none                   default
pool_prueba/fs1  recordsize     128K                   default
pool_prueba/fs1  mountpoint     /fs1                   local
pool_prueba/fs1  sharenfs       off                    default
pool_prueba/fs1  checksum       on                     default
pool_prueba/fs1  compression    off                    default
pool_prueba/fs1  atime          on                     default
pool_prueba/fs1  devices        on                     default
pool_prueba/fs1  exec           on                     default
pool_prueba/fs1  setuid         on                     default
pool_prueba/fs1  readonly       off                    default
pool_prueba/fs1  zoned          off                    default
pool_prueba/fs1  snapdir        hidden                 default
pool_prueba/fs1  aclmode        groupmask              default
pool_prueba/fs1  aclinherit     secure                 default
pool_prueba/fs1  canmount       on                     default
pool_prueba/fs1  shareiscsi     off                    default
pool_prueba/fs1  xattr          on                     default
root #

Paso 6:Estado del pool

Para chequear el estado de un pool, debemos utilizar el comando zpool status.

root # zpool status
  pool: pool_prueba
 state: ONLINE
 scrub: none requested
config:

        NAME                     STATE     READ WRITE CKSUM
        pool_prueba              ONLINE       0     0     0
          c2t500A098286584110d1  ONLINE       0     0     0
          c2t500A098196584110d2  ONLINE       0     0     0
          c2t500A098286584110d3  ONLINE       0     0     0

errors: No known data errors
root #

Paso 7: Crear Snapshots

Un snapshot es una imagen de un FS en un momento determinado, esta imagen de solamente de lectura y nos permite disponer de los datos de un FS en un momento concreto.

rroot # zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
pool_prueba       200K  29.3G  24.5K  /pool_prueba
pool_prueba/fs1  28.5K  29.3G  28.5K  /fs1
pool_prueba/fs2  24.5K  29.3G  24.5K  /fs2
root #

Para crear un snapshot debemos emplear el comando zfs snapshot y facilitar el nombre del FS del que queremos hacer el snapshot seguido por una @ y el nombre del snapshot que queremos crear. Para nuestro ejemplo se ha creado el snapshot pool_prueba/fs1@snap1

root # zfs snapshot pool_prueba/fs1@snap1
root #
root # cd /fs1
root # ls -lisa
total 17
         3    3 drwxr-xr-x   2 root     sys            8 Dec 10 18:39 .
         3    2 drwxr-xr-x  31 root     root        1024 Dec 10 18:42 ..
         4    2 -rw-r--r--   1 root     root           8 Dec 10 18:37 prueba1
         5    2 -rw-r--r--   1 root     root          16 Dec 10 18:37 prueba2
         6    2 -rw-r--r--   1 root     root          24 Dec 10 18:37 prueba3
         7    2 -rw-r--r--   1 root     root          32 Dec 10 18:39 prueba4
         8    2 -rw-r--r--   1 root     root          40 Dec 10 18:39 prueba5
         9    2 -rw-r--r--   1 root     root          48 Dec 10 18:39 prueba6
root #

En el FS, se ha creado un directorio oculto .zfs, el cual contiene un subdirectorio por cada snapshot que se cree en el FS.

root # cd .zfs
root # ls
snapshot
root # ls snapshot/
snap1
root # ls
snapshot
root # cd snapshot/snap1/
root # ls
prueba1  prueba2  prueba3  prueba4  prueba5  prueba6
root # ls -lrt
total 12
-rw-r--r--   1 root     root           8 Dec 10 18:37 prueba1
-rw-r--r--   1 root     root          16 Dec 10 18:37 prueba2
-rw-r--r--   1 root     root          24 Dec 10 18:37 prueba3
-rw-r--r--   1 root     root          32 Dec 10 18:39 prueba4
-rw-r--r--   1 root     root          40 Dec 10 18:39 prueba5
-rw-r--r--   1 root     root          48 Dec 10 18:39 prueba6
root # ls > prueba10
bash: prueba10: Read-only file system

Podemos comprobar que el snapshot es un FS de solo lectura.

root # pwd
/fs1/.zfs/snapshot/snap1
root # cd /
root # ls -l /fs1/.zfs/snapshot/snap1
total 12
-rw-r--r--   1 root     root           8 Dec 10 18:37 prueba1
-rw-r--r--   1 root     root          16 Dec 10 18:37 prueba2
-rw-r--r--   1 root     root          24 Dec 10 18:37 prueba3
-rw-r--r--   1 root     root          32 Dec 10 18:39 prueba4
-rw-r--r--   1 root     root          40 Dec 10 18:39 prueba5
-rw-r--r--   1 root     root          48 Dec 10 18:39 prueba6
root # cd /fs1
root # ls
prueba1  prueba2  prueba3  prueba4  prueba5  prueba6
root # ls > prueba10
root # ls > prueba11
root # ls > prueba12

Hemos modifcado el FS pool_prueba/fs1 y vamos a crear un nuevo snapshot

root # pwd
/fs1
root # cd ..
root # zfs snapshot pool_prueba/fs1@snap2
root # zfs list
NAME                    USED  AVAIL  REFER  MOUNTPOINT
pool_prueba             240K  29.3G  24.5K  /pool_prueba
pool_prueba/fs1        54.5K  29.3G    31K  /fs1
pool_prueba/fs1@snap1  23.5K      -  28.5K  -
pool_prueba/fs1@snap2      0      -    31K  -
pool_prueba/fs2        24.5K  29.3G  24.5K  /fs2
root #
root # ls -l /fs1/.zfs/snapshot/snap*
/fs1/.zfs/snapshot/snap1:
total 12
-rw-r--r--   1 root     root           8 Dec 10 18:37 prueba1
-rw-r--r--   1 root     root          16 Dec 10 18:37 prueba2
-rw-r--r--   1 root     root          24 Dec 10 18:37 prueba3
-rw-r--r--   1 root     root          32 Dec 10 18:39 prueba4
-rw-r--r--   1 root     root          40 Dec 10 18:39 prueba5
-rw-r--r--   1 root     root          48 Dec 10 18:39 prueba6

/fs1/.zfs/snapshot/snap2:
total 18
-rw-r--r--   1 root     root           8 Dec 10 18:37 prueba1
-rw-r--r--   1 root     root          57 Dec 10 18:48 prueba10
-rw-r--r--   1 root     root          66 Dec 10 18:48 prueba11
-rw-r--r--   1 root     root          75 Dec 10 18:48 prueba12
-rw-r--r--   1 root     root          16 Dec 10 18:37 prueba2
-rw-r--r--   1 root     root          24 Dec 10 18:37 prueba3
-rw-r--r--   1 root     root          32 Dec 10 18:39 prueba4
-rw-r--r--   1 root     root          40 Dec 10 18:39 prueba5
-rw-r--r--   1 root     root          48 Dec 10 18:39 prueba6
root #

Podemos ver como se ha creado un nuevo subdirectorio /fs1/.zfs/snapshot/snap2 con la imagen actual del FS pool_prueba/fs1.

Paso 8:Restaurar un Snapshot.

Hemos visto como podemos acceder al contenido de los distintos snapshot de un FS determinado. Existe una operación para restauran un snapshot determinado sobre su FS original.

root # ls
prueba1   prueba10  prueba11  prueba12  prueba2   prueba3   prueba4   prueba5   prueba6
root # rm prueba*

Borramos todos los ficheros del FS pool_prueba/fs1

root #
root # zfs list
NAME                    USED  AVAIL  REFER  MOUNTPOINT
pool_prueba             273K  29.3G  24.5K  /pool_prueba
pool_prueba/fs1          77K  29.3G  24.5K  /fs1
pool_prueba/fs1@snap1  23.5K      -  28.5K  -
pool_prueba/fs1@snap2    26K      -    31K  -
pool_prueba/fs2        24.5K  29.3G  24.5K  /fs2
root #

Con el comando zfs rollback vamos a restaurar el snapshot pool_prueba/fs1@snap1 sobre el FS pool_prueba/fs1

root # zfs rollback pool_prueba/fs1@snap1
cannot rollback to 'pool_prueba/fs1@snap1': more recent snapshots exist
use '-r' to force deletion of the following snapshots:
pool_prueba/fs1@snap2
root #
root # zfs rollback -r pool_prueba/fs1@snap1
root # ls /fs1
prueba1  prueba2  prueba3  prueba4  prueba5  prueba6
root #
root # zfs list
NAME                    USED  AVAIL  REFER  MOUNTPOINT
pool_prueba             237K  29.3G  24.5K  /pool_prueba
pool_prueba/fs1          51K  29.3G  28.5K  /fs1
pool_prueba/fs1@snap1  22.5K      -  28.5K  -
pool_prueba/fs2        24.5K  29.3G  24.5K  /fs2
root #

De la salida del comando zfs list podemos ver que ha desaparecido el snapshot pool_prueba/fs1@snap2, esto se debe a que hemos restaurado la imagen de pool_prueba/fs1@snap1, en esta imagen no existía el snapshot snap2, por lo tanto la restauración lo ha eliminado. Debemos tener cuidado con las restauraciones de los snapshots, sobre todo cuando existen varios snapshots.

Paso 9:Crear un clone

Un clone es una imagen de un FS en un momento determinado, pero que puede ser modificada, al contrario de lo que ocurre con los snapshots que son únicamente de lectura.

root # zfs clone pool_prueba/fs1@snap1 pool_prueba/fs3

Se crea un clone llamado pool_prueba/fs3 a partir del snapshot pool_prueba/fs1@snap1

root # zfs list
NAME                    USED  AVAIL  REFER  MOUNTPOINT
pool_prueba             204K  29.3G  26.5K  /pool_prueba
pool_prueba/fs1          27K  29.3G    27K  /fs1
pool_prueba/fs1@snap1      0      -    27K  -
pool_prueba/fs2        24.5K  29.3G  24.5K  /fs2
pool_prueba/fs3            0  29.3G    27K  /pool_prueba/fs3

Cambiamos el punto de montaje del nuevo clone.

root # zfs set mountpoint=/fs3 pool_prueba/fs3
root # zfs list
NAME                    USED  AVAIL  REFER  MOUNTPOINT
pool_prueba             208K  29.3G  24.5K  /pool_prueba
pool_prueba/fs1          27K  29.3G    27K  /fs1
pool_prueba/fs1@snap1      0      -    27K  -
pool_prueba/fs2        24.5K  29.3G  24.5K  /fs2
pool_prueba/fs3            0  29.3G    27K  /fs3
root # ls /fs3
prueba1  prueba2  prueba3
root #

Con el comando zfs destroy podemos eliminar los clones, los snapshots y los FS.

root # zfs destroy pool_prueba/fs1@snap1
cannot destroy 'pool_prueba/fs1@snap1': snapshot has dependent clones
use '-R' to destroy the following datasets:
pool_prueba/fs3
root #

Al intentar elminar el snapshot pool_prueba/fs1@snap1 obtenemos un error comunicando que existe un clone que depende del snapshot que queremos destruir.

Paso 10: Promote un clone

Podemos crea un FS a partir de un clone con el comando zfs promote.

root # zfs promote pool_prueba/fs3
root #
root # zfs list
NAME                    USED  AVAIL  REFER  MOUNTPOINT
pool_prueba             242K  29.3G  24.5K  /pool_prueba
pool_prueba/fs1            0  29.3G    27K  /fs1
pool_prueba/fs2        24.5K  29.3G  24.5K  /fs2
pool_prueba/fs3          52K  29.3G  28.5K  /fs3
pool_prueba/fs3@snap1  23.5K      -    27K  -
root # df -k | grep pool
pool_prueba          30772224      24 30771982     1%    /pool_prueba
pool_prueba/fs1      30772224      27 30771982     1%    /fs1
pool_prueba/fs2      30772224      24 30771982     1%    /fs2
pool_prueba/fs3      30772224      28 30771982     1%    /fs3
root # ls /fs3
prueba1  prueba2  prueba3  prueba4  prueba5  prueba6
root #
root # zfs list
NAME                    USED  AVAIL  REFER  MOUNTPOINT
pool_prueba             242K  29.3G  24.5K  /pool_prueba
pool_prueba/fs1            0  29.3G    27K  /fs1
pool_prueba/fs2        24.5K  29.3G  24.5K  /fs2
pool_prueba/fs3          52K  29.3G  28.5K  /fs3
pool_prueba/fs3@snap1  23.5K      -    27K  -
root #

Paso 11: Eliminar un FS

Ya hemos visto un ejemplo de como podemos destruir un snapshot utilizando el comando zfs destroy.

root # zfs destroy pool_prueba/fs3@snap1
cannot destroy 'pool_prueba/fs3@snap1': snapshot has dependent clones
use '-R' to destroy the following datasets:
pool_prueba/fs1
root #
root # zfs destroy pool_prueba/fs1
root # zfs destroy pool_prueba/fs3@snap1
root # zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
pool_prueba       198K  29.3G  24.5K  /pool_prueba
pool_prueba/fs2  24.5K  29.3G  24.5K  /fs2
pool_prueba/fs3  28.5K  29.3G  28.5K  /fs3

Paso 12: Renombrar un FS

Otra operación útil, sobre todo cuando estamos restaurando snapshots y clones, es el poder renombrar los FS.

root #
root # zfs rename pool_prueba/fs3 pool_prueba/fs1
root #
root # zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
pool_prueba       198K  29.3G  24.5K  /pool_prueba
pool_prueba/fs1  28.5K  29.3G  28.5K  /fs3
pool_prueba/fs2  24.5K  29.3G  24.5K  /fs2
root #
root # zfs set mountpoint=/fs1 pool_prueba/fs1
root # ls /fs3
root # ls /fs1
prueba1  prueba2  prueba3  prueba4  prueba5  prueba6

Conclusión

Estos han sido 12 sencillos pasos con los que cualquiera se puede iniciar en ZFS, para profundizar más yo recomiendo:

1 Response

  1. markos September 24, 2009 / 4:22 pm

    Simplificado pero muy efectivo, muchas gracias por el aporte

Comments are closed.