Comandos utiles de ZFS

¡Hola! Hoy traemos unos cuantos comandos utiles de ZFS.

ZFS es un sistema de ficheros originalmente creado por Jeff Bonwick en Sun Microsystems para su sistema operativo Solaris. Este sistema de ficheros fue lanzado el 16 de noviembre de 2005 en la compilación 27 de OpenSolaris.

Ventajas de ZFS

ZFS destaca por su las siguientes características:

  • Gran capacidad (256 Zettabytes como máximo, es decir 1000000PB o 1e+9TB)
  • Herramientas de gestión y administración de volúmenes integradas
  • Sistemas de archivos ligeros
  • Administración de espacios de almacenamiento sencilla.
  • Snapshots
  • Cifrado
  • RAID
  • Integridad de datos

Desventajas de ZFS

  • No hay forma de reducir la capacidad de un ZPool
  • El resilver de un ZPool (recuperación del raid) tarda mucho tiempo.

Comandos básicos de ZFS

Estos son los comandos para ZFS que necesitará para manejarte con tu sistema de ficheros.

Como crear un ZPool

La primera tarea es crear los ZPools que necesitemos. Un ZPool es un volumen formado por un grupo de discos, en otros sistemas de ficheros es conocido como volume group. En este caso el comportamiento que tiene es el de un RAID0 o Striping.

Para crear un ZPool:

Sintaxis:

zpool create ZPOOL_NAME DISPOSITIVO

Ejemplo:

[root@local ~]# losetup -f /tmp/test0101 
[root@local ~]# losetup -a
/dev/loop0: [16897]:2883593 (/tmp/test0101)
[root@local ~]# zpool create test0101 /dev/loop0
[root@local ~]# zpool list
NAME             SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test0101        1008M    65K  1008M         -     0%     0%  1.00x  ONLINE  -
[root@local ~]# zpool status test0101
  pool: test0101
 state: ONLINE
  scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	test0101    ONLINE       0     0     0
	  loop0     ONLINE       0     0     0

errors: No known data errors

Modificar punto de montaje

Crear un ZPOOL en un punto de montaje especifico

# zpool create -m /export/zfs home c1t0d0

 

Como crear un RAID1 o zpool mirror

Un zpool mirror o RAID1 es una forma de redundar datos haciendo que si un disco falla los datos sigan almacenados en el otro. A continuación vamos a ver como crear un zpool mirror.

Para crear un RAID1

Sintaxis:

zpool create NOMBRE_ZPOOL mirror DEV1 DEV2

Ejemplo:

[root@local ~]# zpool create mzpool mirror /dev/sdb /dev/sdc
[root@local ~]# zpool  list mzpool
NAME     SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
mzpool    89M    97K  88.9M     0%  ONLINE  -

Cómo crear un RAID10 en ZFS

El RAID10 es una combinación del RAID1 y RAID0. Aprovecha tanto la redundancia como la suma de capacidad, tendríamos por cada 2 discos la capacidad de 1.

Crear un RAID10 con ZFS

Sintaxis:

zpool create NOMBRE_ZPOOL mirror DEV1 DEV2 DEV3 DEV4

Ejemplo:

[root@local ~]# zpool create NOMBRE_ZPOOL mirror /dev/sdb /dev/sdc /dev/sdd /dev/sde
[root@local ~]#

Cómo crear un RAIDZ ZPOOL

Un RAIDZ es una tipo de RAID5, es también llamado distribuido con paridad. Como mínimo se requieren 3 discos.

Creando un RAIDZ

Sintaxis:

# zpool create rzpool raidz DEV1 DEV2 DEV3

Ejemplo

[root@local ~]# zpool create rzpool raidz /dev/sdb /dev/sdc /dev/sdd
[root@local ~]# zpool list rzpool
NAME     SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
rzpool   266M   176K   266M     0%  ONLINE  -

 

Igual que el RAIDZ tenemos los RAIDs, donde el numero de después de la Z indica el número de discos de paridad:

  • RAIDZ1: 1 disco de paridad, requiere al menos 3 discos
  • RAIDZ2: 2 discos de paridad, requiere al menos 4 discos
  • RAIDZ3: 3 discos de paridad, requiere al menos 5 discos

Un ejemplo de como añadiriamos un raidz2 sería:

# zpool create rzpool raidz2 DEV1 DEV2 DEV3 DEV4

Crear volúmenes

Después de crear un ZPOOL, para poder utilizar el espacio asignado al ZPOOL debemos crear volumenes. Para crear un volumen podemos ejecutar lo siguiente:

[root@local ~]# zfs create szpool/vol1
[root@local ~]# zfs list |grep szpool
szpool                              105K  56.9M    21K  /szpool
szpool/vol1                          21K  56.9M    21K  /szpool/vol1

Para asignar manualmente un punto de montaje puedes usar el siguiente comando:

[root@local ~]# zfs set mountpoint=/ora_vol1 szpool/vol1
[root@local ~]# zfs list |grep szpool
szpool                              115K  56.9M    22K  /szpool
szpool/vol1                          21K  56.9M    21K  /ora_vol1
[root@local ~]# df -h /ora_vol1
Filesystem             size   used  avail capacity  Mounted on
szpool/vol1             57M    21K    57M     1%    /ora_vol1

Para compartir el volumen por NFS se puede hacer como lo hariamos con cualquier punto de montaje en un linux creando un servidor NFS y usando el fichero /etc/exports o bien podemos compartir el dataset ZFS moficando el atributo ZFS:

[root@local ~]# zfs get sharenfs szpool/vol1
NAME         PROPERTY  VALUE     SOURCE
szpool/vol1  sharenfs  off       default
[root@local ~]# zfs set sharenfs=on szpool/vol1
[root@local ~]# zfs get sharenfs szpool/vol1
NAME         PROPERTY  VALUE     SOURCE
szpool/vol1  sharenfs  on        local

ZFS tiene opción de compresión por defecto, podemos ver si tiene activada la compresión un volumen determinado con zfs get compression y activar o desactivarla con zfs set compression:

[root@local ~]# zfs get compression szpool/vol1
NAME         PROPERTY     VALUE     SOURCE
szpool/vol1  compression  off       default
[root@local ~]# zfs set compression=on szpool/vol1
[root@local ~]# zfs get compression szpool/vol1
NAME         PROPERTY     VALUE     SOURCE
szpool/vol1  compression  on        local

También podemos añadir deduplicación con:

zfs set dedup=on tank/home

O desactivarla con:

zfs set dedup=off tank/home

Para crear un dataset bajo otro volumen podemos ejecutar lo siguiente:

[root@local ~]# zfs create szpool/vol1/oraarch
[root@local ~]# zfs list |grep ora
szpool/vol1                          42K  56.9M    21K  /ora_vol1
szpool/vol1/oraarch                  21K  56.9M    21K  /ora_vol1/oraarch

Crear volúmenes con cuotas y reservas

Establecer espacio de reserva en el volumen:

[root@local ~]# zfs set reservation=20M szpool/vol1/oraarch
[root@local ~]# zfs get reservation szpool/vol1/oraarch
NAME                 PROPERTY     VALUE   SOURCE
szpool/vol1/oraarch  reservation  20M     local
[root@local ~]# zfs list |grep ora
szpool/vol1                        20.0M  36.9M    23K  /ora_vol1
szpool/vol1/oraarch                  21K  56.9M    21K  /ora_vol1/oraarch

Establecer cuota máxima para un volumen

[root@local ~]# zfs get quota szpool/vol1/oraarch
NAME                 PROPERTY  VALUE  SOURCE
szpool/vol1/oraarch  quota     none   default
[root@local ~]# zfs set quota=20M szpool/vol1/oraarch
[root@local ~]# zfs get quota szpool/vol1/oraarch
NAME                 PROPERTY  VALUE  SOURCE
szpool/vol1/oraarch  quota     20M    local
[root@local ~]# zfs list |grep ora
szpool/vol1                        20.0M  36.9M    23K  /ora_vol1
szpool/vol1/oraarch                  21K  20.0M    21K  /ora_vol1/oraarch

Ver el estado de los ZPOOLs

Para visualizar el estado de los ZPOOLs podemos ejecutar el comando zfs statuszfs status ZPOOL_NOMBRE:

[root@local ~]# zpool status
  pool: szpool
 state: ONLINE
 scrub: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        szpool      ONLINE       0     0     0
          c1t3d0    ONLINE       0     0     0
errors: No known data errors

  pool: rzpool
 state: ONLINE
 scrub: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        rzpool      ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
            c1t8d0  ONLINE       0     0     0
errors: No known data errors

  pool: mzpool
 state: ONLINE
 scrub: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        mzpool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c1t5d0  ONLINE       0     0     0
            c1t6d0  ONLINE       0     0     0
errors: No known data errors

Añadir y quitar dispositivos al ZPool

En la primera linea podemos ver como añadimos dispositivos al ZPool, en la segunda quitamos uno de los dispositivos añadidos:

# zpool attach zeepool DEV1 DEV2
# zpool detach zeepool DEV2

Para reemplazar dispositivos ejecutando el resilver de forma automatica:

# zpool set autoreplace=on ZPOOL_NOMBRE

Para comprobar si la propiedad anterior está activa ejecutamos:

# zpool get autoreplace ZPOOL_NOMBRE
NAME   PROPERTY   VALUE SOURCE
ZPOOL_NOMBRE autoreplace  on    default

Crear volúmenes emulados

Crear volumenes emulados con espacio asignado

# zfs create -V 5gb datapool/vol

Activamos el volumen creado como volumen de swap

# swap -a /dev/zvol/dsk/datapool/vol

Creando un zpool en una ruta alternativa

Para crear el zpool en una ruta alternativa podemos hacerlo con la siguiente sintaxis:

# zpool create -R /mnt ALT_ZPOOL DEV1

Así podemos ver como se ha creado:

# zfs list alt_pool
NAME           USED AVAIL REFER MOUNTPOINT
morpheus 32.5K 33.5G 8K    /mnt/ALT_ZPOOL

Podemos importar un zpool en una ruta elternativa así:

# zpool import -R /mnt alt_pool
# zpool list alt_pool
NAME          SIZE  USED  AVAIL CAP  HEALTH ALTROOT
morpheus 33.8G 68.0K 33.7G 0%   ONLINE /mnt
# zfs list alt_pool
NAME          USED  AVAIL REFER    MOUNTPOINT
morpheus 32.5K 33.5G 8K       /mnt/alt_pool

Comprobar la integridad de Zpool

Comprobando el zpool con la utilidad integrada (similar a fsck):

# zpool scrub datapool
i.e pool name is datapool

# zpool status -x
all pools are healthy

To check the pool with detailed errors
# zpool status -v datapool

Poner un dispositivo del ZPool offline/online

Para reemplazar un dispositivo del zpool primero debemos poner offline el dispositivo:

# zpool offline datapool DEV1
bringing device ’DEV1’ offline

# zpool online datapool DEV1
bringing device ’DEV1’ online

Para reemplazar un dispositivo:

# zpool replace datapool DEV1 DEV2

Reemplazamos el dispositivo DEV1, por el dispositivo DEV2

IOSTAT

# zpool iostat
             capacity   operations  bandwidth
   pool     used avail read  write  read write
———- —– —– —– —– —– —–
datapool        100G 20.0G 1.2M  102K  1.2M 3.45K
dozer      12.3G 67.7G 132K 15.2K 32.1K 1.20K

Exportando un ZPool

Para exportar un zpool y que sea accesible:

# zpool export datapool
cannot unmount ’/export/home/eschrock’: Device busy
# zpool export -f datapool

Importando ZPools

Comprobando si hay zpools disponibles para importar

# zpool import
  pool: datapool
    id: 3824973938571987430916523081746329

Importando pools

# zpool import datapool

Borrando volumenes / datasets

# zfs destroy datapool/home

Renombrando datasets

# zfs rename datapool/home/kustarz datapool/home/user2

Listando pools

Listando volumenes bajo datapool/home/users

zfs list -r datapool/home/users
NAME USED AVAIL REFER MOUNTPOINT
datapool/home/users 26.0K 4.81G 10.0K /datapool/home/users
datapool/home/users/user1 16K 4.81G 9.0K /datapool/home/users/user1
datapool/home/users/user2 8K 4.81G 8K /datapool/home/users/user2
datapool/home/users/user3 8K 4.81G 8K /datapool/home/users/user3

Montando volúmenes

Montando volúmenes como puntos de montaje tradicional

# zfs set mountpoint=legacy datapool/home/user1

Montandolo manualmente:

# mount -F zfs datapool/home/user1 /mnt

Montar todos los puntos de montaje contigurados, es como mount -a para ZFS

# zfs mount -a

Compartir o no los volúmenes en el sistema:

# zfs share -a
# zfs unshare datapool/home/user1
# zfs unshare -a

Haciendo backup y restaurandolo

Ejemplo de backup y restauración:

# zfs backup datapool/web1@111505 > /dev/rmt/0
# zfs restore datapool/test2@today < /dev/rmt/0
# zfs rename datapool/test datapool/test.old
# zfs rename datapool/test2 datapool/test
# zfs rollback datapool/web1@111505
cannot rollback to ’datapool/web1@111505’: more recent snapshots exist
use ’-r’ to force deletion of the following snapshots:
datapool/web1@now
# zfs rollback -r datapool/web1@111505
# zfs restore datapool/web1 < /dev/rmt/0

Durante el restore de una copia incremental, el filesistem estará desmontado y no será accesible.

Replicación remota de un ZFS

# zfs backup datapool/sphere1@today | ssh newsys zfs restore sandbox/restfs@today
restoring backup of datapool/sphere1@today
into sandbox/restfs@today …
restored 17.8Kb backup in 1 seconds (17.8Kb/sec)
# zfs send -I pool/fs@snap1 pool/clone@snapA > /snaps/fsclonesnap-I
ZFS Snapshots and Clones
The following example creates a snapshot of datapool/home/ahrens that is named
friday.
# zfs snapshot datapool/home/ahrens@friday
# zfs destroy datapool/home/ahrens@friday
# zfs rename datapool/home/sphere1s@111205 datapool/home/sphere1s@today

Snapshots

Mostrando y accediendo a los snapshots

# ls /home/ahrens/.zfs/snapshot
tuesday wednesday thursday friday

También se pueden listar así:

# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
pool/home/ahrens@tuesday 13.3M – 2.13G –
zfs send -Rv wrkpool@0311 > /net/remote-system/rpool/snaps/wrkpool.0311
sending from @ to wrkpool@0311
sending from @ to wrkpool/swap@0311
sending from @ to wrkpool/dump@0311
sending from @ to wrkpool/ROOT@0311
sending from @ to wrkpool/ROOT/zfsnv109BE@zfsnv1092BE
sending from @zfsnv1092BE to wrkpool/ROOT/zfsnv109BE@0311
sending from @ to wrkpool/ROOT/zfsnv1092BE@0311

Clonando un ZFS

# zfs clone pool/ws/gate@yesterday pool/home/ahrens/bug123
The following example creates a cloned work space from the
projects/newproject@today snapshot for a temporary user as
projects/teamA/tempuser and then sets properties on the cloned work space.
# zfs snapshot projects/newproject@today
# zfs clone projects/newproject@today projects/teamA/tempuser
# zfs set sharenfs=on projects/teamA/tempuser
# zfs set quota=5G projects/teamA/tempuser

Destruyendo un clon ZFS

# zfs destroy pool/home/ahrens/bug123

Los clones se destruiran antes que los snapshots del padre se destruyan.

 

Deja una respuesta