LINUX

Una guía para instalar y usar ZFS en CentOS 7

ZFS CentOS 7

ZFS, la forma abreviada de Zettabyte Filesystem es un sistema de archivos avanzado y altamente escalable. Fue desarrollado originalmente por Sun Microsystems y ahora es parte del proyecto OpenZFS. Con tantos sistemas de archivos disponibles en Linux, es bastante natural preguntar qué tiene de especial ZFS. A diferencia de otros sistemas de archivos, no es solo un sistema de archivos, sino también un administrador de volumen lógico. Algunas de las características de ZFS que lo hacen popular son:

  • Integridad de los datos: la coherencia y la integridad de los datos se garantizan mediante técnicas de copia en escritura y suma de comprobación.
  • Agrupación de espacio de almacenamiento: las unidades de almacenamiento disponibles se pueden juntar en una única agrupación denominada zpool
  • Software RAID: configurar una matriz raidz es tan simple como emitir un solo comando.
  • Administrador de volumen incorporado: ZFS también actúa como administrador de volumen.
  • Instantáneas, clones, compresión: estas son algunas de las funciones avanzadas que ofrece ZFS.

¡ZFS es un sistema de archivos de 128 bits y tiene la capacidad de almacenar 256 bytes zetta! En esta guía, aprenderemos a instalar, configurar y también a usar algunos comandos ZFS importantes en un servidor CentOS 7.

NOTA: La parte de instalación es específica del servidor CentOS, mientras que los comandos son comunes en cualquier sistema Linux.

Terminología

Antes de continuar, comprendamos algunas de las terminologías que se usan comúnmente en ZFS.

Piscina

Agrupación lógica de unidades de almacenamiento. Es el bloque de construcción básico de ZFS y es a partir de aquí que se asigna el espacio de almacenamiento para los conjuntos de datos.

Conjuntos de datos

Los componentes del sistema de archivos ZFS, a saber, el sistema de archivos, los clones, las instantáneas y los volúmenes, se denominan conjuntos de datos.

Espejo

Un dispositivo virtual que almacena copias de datos idénticas en dos o más discos. En situaciones en las que falla un disco, los mismos datos están disponibles en otros discos de ese espejo.

Resilvering

Proceso de copia de datos de un disco a otro en caso de restaurar un dispositivo.

Maleza

Scrub se usa para verificar la coherencia en ZFS, como se usa fsck en otros sistemas de archivos

Instalación de ZFS

Para instalar ZFS en CentOS, primero debemos configurar el repositorio EPEL para admitir paquetes y luego el repositorio ZFS para instalar los paquetes ZFS necesarios.

Nota: prefijo sudo a todos los comandos si no es el usuario root.

yum localinstall --nogpgcheck http://epel.mirror.net.in/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

yum localinstall --nogpgcheck http://archive.zfsonlinux.org/epel/zfs-release.el7.noarch.rpm

Ahora instale el desarrollo del kernel y los paquetes zfs. Los paquetes de desarrollo del kernel son necesarios ya que ZFS se construye como un módulo y se inserta en el kernel.

yum install kernel-devel zfs

Verifique si el módulo zfs está insertado en el kernel usando el comando ‘lsmod’ y si no, insértelo manualmente usando el comando ‘modprobe’.

[root@li1467-130 ~]# lsmod |grep zfs

[root@li1467-130 ~]# modprobe zfs

[root@li1467-130 ~]# lsmod |grep zfs
zfs 2790271 0
zunicode 331170 1 zfs
zavl 15236 1 zfs
zcommon 55411 1 zfs
znvpair 89086 2 zfs,zcommon
spl 92029 3 zfs,zcommon,znvpair

Comprobemos si podemos usar los comandos zfs:

[root@li1467-130 ~]# zfs list
no datasets available

Administración

ZFS tiene dos utilidades principales, zpool y zfs. Mientras que zpool se ocupa de la creación y el mantenimiento de grupos utilizando discos, la utilidad zfs es responsable de la creación y el mantenimiento de conjuntos de datos.

utilidad zpool

Creando y destruyendo piscinas

Primero verifique los discos disponibles para que pueda crear un grupo de almacenamiento.

[root@li1467-130 ~]# ls -l /dev/sd*
brw-rw---- 1 root disk 8,  0  Mar 16 08:12 /dev/sda
brw-rw---- 1 root disk 8, 16 Mar 16 08:12 /dev/sdb
brw-rw---- 1 root disk 8, 32 Mar 16 08:12 /dev/sdc
brw-rw---- 1 root disk 8, 48 Mar 16 08:12 /dev/sdd
brw-rw---- 1 root disk 8, 64 Mar 16 08:12 /dev/sde
brw-rw---- 1 root disk 8, 80 Mar 16 08:12 /dev/sdf

Cree un grupo a partir de un conjunto de unidades.

zpool create <option> <pool name. <drive 1> <drive 2> .... <drive n>
[root@li1467-130 ~]# zpool create -f zfspool sdc sdd sde sdf

El comando ‘zpool status’ muestra el estado de las agrupaciones disponibles

[root@li1467-130 ~]# zpool status
pool: zfspool
state: ONLINE
scan: none requested
config:

NAME STATE READ WRITE CKSUM
zfspool ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0

errors: No known data errors

Verifique si la creación del grupo fue exitosa.

[root@li1467-130 ~]# df -h
Filesystem    Size   Used      Avail  Use%   Mounted on
/dev/sda      19G    1.4G        17G      8%      /
devtmpfs    488M        0      488M      0%     /dev
tmpfs          497M        0      497M      0%    /dev/shm
tmpfs          497M    50M     447M     11%   /run
tmpfs          497M         0     497M      0%   /sys/fs/cgroup
tmpfs          100M         0     100M      0%   /run/user/0
zfspool         3.7G         0       3.7G      0%  /zfspool

Como puede ver, zpool ha creado un grupo con el nombre ‘zfspool’ de un tamaño de 3,7 GB y también lo ha montado en / zfspool.

Para destruir una piscina, use el comando ‘zpool destroy’

zpool destroy <pool name>

[root@li1467-130 ~]# zpool destroy zfspool
[root@li1467-130 ~]# zpool status
no pools available

Intentemos ahora crear un grupo de espejos simple.

zpool create <option> <pool name> mirror <drive 1> <drive 2>... <drive n>

También podemos crear múltiples espejos al mismo tiempo repitiendo la palabra clave espejo seguida de las unidades.

[root@li1467-130 ~]# zpool create -f mpool mirror sdc sdd mirror sde sdf
[root@li1467-130 ~]# zpool status
pool: mpool
state: ONLINE
scan: none requested
config:

NAME STATE READ WRITE CKSUM
mpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0

errors: No known data errors

En el ejemplo anterior, hemos creado grupos de espejos, cada uno con dos discos.

Del mismo modo, podemos crear un grupo de raidz.

[root@li1467-130 ~]# zpool create -f rpool raidz sdc sdd sde sdf
[root@li1467-130 ~]# zpool status
pool: rpool
state: ONLINE
scan: none requested
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0

errors: No known data errors

Administrar dispositivos en grupos de ZFS

Una vez que se crea un grupo, es posible agregar o eliminar repuestos en caliente y dispositivos de caché del grupo, conectar o desconectar dispositivos de grupos duplicados y reemplazar dispositivos. Pero los dispositivos no redundantes y raidz no se pueden eliminar de un grupo. Veremos cómo realizar algunas de estas operaciones en este apartado.

Primero estoy creando un grupo llamado ‘testpool’ que consta de dos dispositivos, sdc y sdd. A continuación, se agregará otro sde de dispositivo.

[root@li1467-130 ~]# zpool create -f testpool sdc sdd

[root@li1467-130 ~]# zpool add testpool sde
[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
scan: none requested
config:

NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0

errors: No known data errors

Como se mencionó anteriormente, no puedo eliminar este dispositivo recién agregado ya que no es un grupo redundante o raidz.

[root@li1467-130 ~]# zpool remove testpool sde
cannot remove sde: only inactive hot spares, cache, top-level, or log devices can be removed

Pero puedo agregar un disco de repuesto a este grupo y eliminarlo.

[root@li1467-130 ~]# zpool add testpool spare sdf
[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
scan: none requested
config:

NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
spares
sdf AVAIL

errors: No known data errors
[root@li1467-130 ~]# zpool remove testpool sdf
[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
scan: none requested
config:

NAME        STATE       READ  WRITE   CKSUM
testpool    ONLINE       0          0               0
sdc            ONLINE       0           0               0
sdd            ONLINE      0            0               0
sde            ONLINE      0            0               0

errors: No known data errors

De manera similar, podemos usar el comando adjuntar para adjuntar discos a un grupo reflejado o no reflejado y el comando desconectar para separar discos de un grupo reflejado.

zpool attach <options> <pool name> <device> <new device>

zpool detach <pool name> <device>

Cuando un dispositivo falla o se corrompe, podemos reemplazarlo usando el comando ‘reemplazar’.

zpool replace <options> <pool name> <device> <new device>

Probaremos esto corrompiendo forzosamente un dispositivo en una configuración reflejada.

[root@li1467-130 ~]# zpool create -f testpool mirror sdd sde

Esto crea un grupo de réplicas que consta de discos sdd y sde. Ahora, corrompamos deliberadamente la unidad sdd escribiendo ceros en ella.

[root@li1467-130 ~]# dd if=/dev/zero of=/dev/sdd
dd: writing to ‘/dev/sdd’: No space left on device
2048001+0 records in
2048000+0 records out
1048576000 bytes (1.0 GB) copied, 22.4804 s, 46.6 MB/s

Usaremos el comando ‘scrub’ para detectar esta corrupción.

[root@li1467-130 ~]# zpool scrub testpool
[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
status: One or more devices could not be used because the label is missing or
invalid. Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: http://zfsonlinux.org/msg/ZFS-8000-4J
scan: scrub repaired 0 in 0h0m with 0 errors on Fri Mar 18 09:59:40 2016
config:

NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdd UNAVAIL 0 0 0 corrupted data
sde ONLINE 0 0 0

errors: No known data errors

Ahora reemplazaremos sdd con sdc.

[root@li1467-130 ~]# zpool replace testpool sdd sdc; zpool status
pool: testpool
state: ONLINE
scan: resilvered 83.5K in 0h0m with 0 errors on Fri Mar 18 10:05:17 2016
config:

NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
replacing-0 UNAVAIL 0 0 0
sdd UNAVAIL 0 0 0 corrupted data
sdc ONLINE 0 0 0
sde ONLINE 0 0 0

errors: No known data errors

[root@li1467-130 ~]# zpool status
pool: testpool
state: ONLINE
scan: resilvered 74.5K in 0h0m with 0 errors on Fri Mar 18 10:00:36 2016
config:

NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdc ONLINE 0 0 0
sde ONLINE 0 0 0

errors: No known data errors

Migración de piscinas

Podemos migrar grupos de almacenamiento entre diferentes hosts utilizando comandos de exportación e importación. Para ello, los discos utilizados en el grupo deben estar disponibles en ambos sistemas.

[root@li1467-130 ~]# zpool export testpool
[root@li1467-130 ~]# zpool status
no pools available

El comando ‘zpool import’ enumera todos los grupos que están disponibles para importar. Ejecute este comando desde el sistema donde desea importar el grupo.

[root@li1467-131 ~]# zpool import
pool: testpool
id: 3823664125009563520
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:

testpool ONLINE
sdc ONLINE
sdd ONLINE
sde ONLINE

Ahora importa el grupo requerido

[root@li1467-131 ~]# zpool import testpool
[root@li1467-131 ~]# zpool status
pool: testpool
state: ONLINE
scan: none requested
config:

NAME STATE READ WRITE CKSUM
testpool ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0

errors: No known data errors

iostat

Se pueden verificar las estadísticas io de los dispositivos de la piscina usando el comando iostat.

[root@li1467-130 ~]# zpool iostat -v testpool
capacity          operations                        bandwidth
pool          alloc      free            read     write             read   write
----------    -----     -----            -----     -----                -----   -----
testpool    1.80M  2.86G        22            27               470K  417K
sdc             598K   975M           8              9               200K  139K
sdd             636K  975M            7              9                135K  139K
sde             610K   975M           6              9                 135K 139K
----------   -----     -----           -----          -----               -----  -----

utilidad zfs

Ahora pasaremos a la utilidad zfs. Aquí veremos cómo crear, destruir conjuntos de datos, compresión del sistema de archivos, cuotas e instantáneas.

Creando y destruyendo el sistema de archivos

El sistema de archivos ZFS se puede crear usando el comando zfs create

zfs create <filesystem>

[root@li1467-130 ~]# zfs create testpool/students
[root@li1467-130 ~]# zfs create testpool/professors
[root@li1467-130 ~]# df -h
Filesystem                    Size             Used          Avail          Use%          Mounted on
/dev/sda                       19G              1.4G          17G             8%                     /
devtmpfs                   488M                  0      488M             0%                    /dev
tmpfs                          497M                  0       497M            0%                   /dev/shm
tmpfs                          497M            50M       447M           11%                  /run
tmpfs                          497M                 0        497M            0%                /sys/fs/cgroup
testpool                       2.8G                  0         2.8G            0%               /testpool
tmpfs                          100M                  0        100M            0%             /run/user/0
testpool/students     2.8G                   0         2.8G             0%            /testpool/students
testpool/professors  2.8G                   0         2.8G             0%           /testpool/professors

A partir de la salida anterior, observe que aunque no se proporciona un punto de montaje en el momento de la creación del sistema de archivos, el punto de montaje se crea utilizando la misma relación de ruta que la del grupo.

zfs create permite usar -o con él, usando el cual podemos especificar opciones como punto de montaje, compresión, cuota, exec, etc.

Uno puede listar el sistema de archivos disponible usando la lista zfs:

[root@li1467-130 ~]# zfs list
NAME                           USED     AVAIL     REFER    MOUNTPOINT
testpool                         100M       2.67G       19K         /testpool
testpool/professors        31K     1024M   20.5K        /testpool/professors
testpool/students        1.57M     98.4M   1.57M      /testpool/students

Podemos destruir un sistema de archivos usando la opción de destruir

zfs destroy <filesystem>

Compresión

Ahora entenderemos cómo funciona la compresión en ZFS. Antes de comenzar a usar la compresión, debemos habilitarla usando ‘establecer compresión’

zfs set <compression=value> <filesystem|volume|snapshot>

Una vez hecho esto, la compresión y descompresión ocurren en el sistema de archivos sobre la marcha de forma transparente.

En nuestro ejemplo, habilitaré la compresión en el directorio de estudiantes usando el algoritmo de compresión lz4.

[root@li1467-130 ~]# zfs set compression=lz4 testpool/students

Ahora copiaré un archivo de tamaño 15M en este sistema de archivos y verificaré el tamaño una vez que se haya copiado.

[root@li1467-130 /]# cd /var/log
[root@li1467-130 log]# du -h secure
15M secure

[root@li1467-130 ~]# cp /var/log/secure /testpool/students/

[root@li1467-130 students]# df -h .
Filesystem               Size     Used   Avail    Use%      Mounted on
testpool/students   100M   1.7M   99M        2%      /testpool/students

Tenga en cuenta que el tamaño utilizado en el sistema de archivos es de solo 1,7 millones, mientras que el tamaño del archivo era de 15 millones. También podemos comprobar la relación de compresión.

[root@li1467-130 ~]# zfs get compressratio testpool
NAME      PROPERTY         VALUE            SOURCE
testpool    compressratio     9.03x                     -

Cuotas y reserva

Permítanme explicar las cuotas con un ejemplo de la vida real. Supongamos que tenemos un requisito en una universidad para limitar el espacio en disco utilizado por el sistema de archivos para profesores y estudiantes. Supongamos que necesitamos asignar 100 MB para estudiantes y 1 GB para profesores. Podemos hacer uso de ‘cuotas’ en ZFS para cumplir con este requisito. Las cuotas garantizan que la cantidad de espacio en disco utilizado por un sistema de archivos no exceda los límites establecidos. La reserva ayuda a asignar y garantizar que la cantidad requerida de espacio en disco esté disponible para el sistema de archivos.

zfs set quota=<value> <filesystem|volume|snapshot>

zfs set reservation=<value> <filesystem|volume|snapshot>
[root@li1467-130 ~]# zfs set quota=100M testpool/students
[root@li1467-130 ~]# zfs set reservation=100M testpool/students
[root@li1467-130 ~]# zfs list
NAME                          USED      AVAIL    REFER    MOUNTPOINT
testpool                        100M       2.67G       19K        /testpool
testpool/professors      19K       2.67G        19K       /testpool/professors
testpool/students      1.57M       98.4M    1.57M    /testpool/students

[root@li1467-130 ~]# zfs set quota=1G testpool/professors
[root@li1467-130 ~]# zfs list
NAME                           USED     AVAIL    REFER    MOUNTPOINT
testpool                         100M     2.67G       19K          /testpool
testpool/professors       19K    1024M       19K         /testpool/professors
testpool/students       1.57M    98.4M    1.57M       /testpool/students

En el ejemplo anterior, hemos asignado 100 MB para estudiantes y 1 GB para profesores. Observe la columna ‘DISPONIBLE’ en la ‘lista zfs’. Inicialmente tenían el tamaño de 2.67GB cada uno y después de establecer la cuota, los valores han cambiado en consecuencia.

Instantáneas

Las instantáneas son copias de solo lectura del sistema de archivos ZFS en un momento determinado. No consumen espacio adicional en el grupo de zfs. Podemos volver al mismo estado en una etapa posterior o extraer solo uno o un conjunto de archivos según los requisitos del usuario.

Ahora crearé algunos directorios y un archivo en ‘/ testpool / professors’ de nuestro ejemplo anterior y luego tomaré una instantánea de este sistema de archivos.

[root@li1467-130 ~]# cd /testpool/professors/

[root@li1467-130 professors]# mkdir maths physics chemistry

[root@li1467-130 professors]# cat > qpaper.txt
Question paper for the year 2016-17
[root@li1467-130 professors]# ls -la
total 4
drwxr-xr-x  5  root root    6   Mar 19 10:34 .
drwxr-xr-x  4  root root    4   Mar 19 09:59 ..
drwxr-xr-x  2  root root    2   Mar 19 10:33 chemistry
drwxr-xr-x  2  root root    2   Mar 19 10:32 maths
drwxr-xr-x  2  root root    2   Mar 19 10:32 physics
-rw-r--r--     1  root root  36   Mar 19 10:35 qpaper.txt

Para tomar una instantánea, use la siguiente sintaxis:

zfs snapshot <filesystem|volume@<snap>>
[root@li1467-130 professors]# zfs snapshot testpool/professors@03-2016
[root@li1467-130 professors]# zfs list -t snapshot
NAME                                             USED         AVAIL     REFER     MOUNTPOINT
testpool/professors@03-2016       0                -                20.5K          -

Ahora eliminaré el archivo que se creó y lo extraeré de las instantáneas.

[root@li1467-130 professors]# rm -rf qpaper.txt
[root@li1467-130 professors]# ls
chemistry maths physics
[root@li1467-130 professors]# cd .zfs
[root@li1467-130 .zfs]# cd snapshot/03-2016/
[root@li1467-130 03-2016]# ls
chemistry maths physics qpaper.txt

[root@li1467-130 03-2016]# cp -a qpaper.txt /testpool/professors/
[root@li1467-130 03-2016]# cd /testpool/professors/
[root@li1467-130 professors]# ls
chemistry maths physics qpaper.txt

El archivo eliminado vuelve a estar en su lugar.

Podemos enumerar todas las instantáneas disponibles usando la lista zfs:

[root@li1467-130 ~]# zfs list -t snapshot
NAME                                             USED     AVAIL    REFER    MOUNTPOINT
testpool/professors@03-2016    10.5K       -              20.5K       -

Finalmente, destruyamos la instantánea usando el comando zfs destroy:

zfs destroy <filesystem|volume@<snap>>
[root@li1467-130 ~]# zfs destroy testpool/professors@03-2016

[root@li1467-130 ~]# zfs list -t snapshot
no datasets available

Conclusión

En este artículo, ha aprendido a instalar ZFS en CentOS 7 y a utilizar algunos comandos básicos e importantes de las utilidades zpool y zfs. Esta no es una lista comprensible. ZFS tiene muchas más capacidades y puede explorarlas más a partir de su Página Oficial.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar