Una guía para instalar y usar ZFS en 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.