
ZFS, la forma abreviada de Zettabyte Filesystem, es un sistema de archivos avanzado y altamente escalable. Originalmente fue desarrollado por Sun Microsystems y ahora es parte del proyecto OpenZFS. Con tantos sistemas de archivos disponibles en Linux, es bastante natural preguntarse 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
- Combinación de espacio de almacenamiento:las unidades de almacenamiento disponibles se pueden juntar en un solo grupo llamado zpool
- RAID de software: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 proporciona ZFS.
¡ZFS es un sistema de archivos de 128 bits y tiene la capacidad de almacenar 256 bytes zetta! En esta guía, aprenderemos cómo instalar, configurar y también usar algunos comandos ZFS importantes en un servidor CentOS 7.
NOTA:la parte de la 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 componente básico de ZFS y es desde aquí que se asigna espacio de almacenamiento para 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.
Volver a platear
Proceso de copia de datos de un disco a otro en caso de restauración de un dispositivo.
Frotar
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 los paquetes compatibles y luego el repositorio ZFS para instalar los paquetes ZFS necesarios.
Nota:prefije sudo a todos los comandos si no es 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 los paquetes de desarrollo del kernel y zfs. Se necesitan paquetes de desarrollo del kernel, ya que ZFS se crea 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
Verifiquemos 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 los conjuntos de datos.
utilidad zpool
Crear y destruir piscinas
Primero verifique los discos disponibles para 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 los grupos 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 3,7 GB y también lo ha montado en /zfspool.
Para destruir un grupo, 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 conjunto de espejos simple.
zpool create <option> <pool name> mirror <drive 1> <drive 2>... <drive n>
También podemos crear varios 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 espejo, cada uno con dos discos.
Del mismo modo, podemos crear un grupo 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
Administración de dispositivos en grupos de ZFS
Una vez que se crea un grupo, es posible agregar o eliminar repuestos dinámicos 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 esta sección.
Primero estoy creando un grupo llamado 'grupo de prueba' que consta de dos dispositivos, sdc y sdd. Luego se agregará otro dispositivo sde a este.
[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 porque 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 de conexión para adjuntar discos a un grupo reflejado o no reflejado y el comando de separación para desconectar 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 a la fuerza un dispositivo en una configuración duplicada.
[root@li1467-130 ~]# zpool create -f testpool mirror sdd sde
Esto crea un grupo de espejos que consta de discos sdd y sde. Ahora, permítanos corromper 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 pools
Podemos migrar grupos de almacenamiento entre diferentes hosts usando comandos de exportación e importación. Para ello, los discos utilizados en el pool deben estar disponibles en ambos sistemas.
[root@li1467-130 ~]# zpool export testpool
[root@li1467-130 ~]# zpool status
no pools available
El comando 'importación de zpool' 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 importe 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
iostato
Uno puede 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.
Creación y destrucción del 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
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 el cual podemos especificar opciones como punto de montaje, compresión, cuota, ejecución, 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 destrucción
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 la 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 comprobaré el tamaño una vez 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 M, mientras que el tamaño del archivo era de 15 M. 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 reservas
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 aseguran 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 necesaria 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 'AVAIL' en 'zfs list'. Inicialmente tenían un tamaño de 2,67 GB cada uno y, después de establecer la cuota, los valores cambiaron 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 zfs. Podemos retroceder 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 está de vuelta 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, aprendió a instalar ZFS en CentOS 7 y a usar 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 puedes explorarlas más desde su página oficial.