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
Estos han sido 12 sencillos pasos con los que cualquiera se puede iniciar en ZFS, para profundizar más yo recomiendo: