zfs
DESCRIPTION
Descripcion ZFS LinuxTRANSCRIPT
ZFS
ZFS significa “Zettabyte File System”. Ha sido diseñado para reemplazar sistemas de gestión de almacenamiento, caracterizados por tener ciertas limitaciones (como UFS, el estándar en Solaris) y una gestión de discos redundante (RAID)
ZFS
En el diseño de ZFS se analizaron qué prestaciones demandaban los administradores de sistemas en lo referente a sistemas de ficheros y gestión de discos, obteniéndose así un sistema:
Con gran capacidad (el tamaño máximo de un sistema de ficheros es de 256 cuatrillones de zettabytes, lo que en la práctica lo hace “ilimitado”).
Con gran fiabilidad (la consistencia se garantiza mediante “copy-on-write”, que escribe los bloques de datos como transacciones, de forma que no es necesario un fsck).
Que es capaz de funciones nuevas como los snapshots (una “instantánea” del sistema que representa el sistema en un instante dado, de rápida realización).
Que es capaz de gestionar fácilmente los volúmenes (con funciones similares al RAID por software).
ZFS
Que simplifica mucho la gestión (tareas obligatorias en la creación de un sistema de ficheros, como es el formato, la creación de la entrada en /etc/vfstab, el punto de montaje y la acción de montado quedan ahora reducidas a un comando de más alto nivel).
Con facilidades adicionales para gestionar límites (cuotas o espacio mínimo garantizado), compresión de datos (pudiendo elegir el algoritmo), etc.
En ZFS los discos se gestionan agrupándolos en “pools”. Una vez creado un “pool” se pueden crear sistemas de ficheros (“datasets”) sobre él. De este modo, las funciones relacionadas con la gestión de volúmenes se realizan sobre los “pools” mientras que las relacionadas con el sistema de ficheros se realizan sobre el “dataset”.
ZFS
Gestión de "pools"
Un “pool” es un conjunto formado por uno o más discos (también pueden ser particiones o ficheros) puesto a disposición de ZFS para su uso en “datasets”.
A la hora de unir varios discos en un “pool” podemos hacerlo mediante concatenación de los mismos, o bien podemos elegir redundancia (mirror o incluso RAID-Z, similar a RAID5).
ZFS
Creación de pools
Con un disco zpool create -f mipool c0t0d0
Con dos discos concatenados (equivale a RAID-0) zpool create -f mipool c0t0d0 c0t1d0
Con dos discos espejados (equivale a RAID-1) zpool create -f mipool mirror c0t0d0 c0t1d0
Con tres discos en RAID-Z (equivale a RAID-5) zpool create -f mipool raidz c0t0d0 c0t1d0 c0t2d0
Con tres discos en RAID-Z2 (equivale a RAID-5 con paridad doble) zpool create -f mipool raidz2 c0t0d0 c0t1d0 c0t2d0
RAID-1+0 zpool create -f mipool mirror c0t0d0 c0t1d0 mirror c1t0d0 c1t1d0
Dos discos espejados y un tercero como “hot spare” zpool create -f mipool mirror c0t0d0 c0t1d0 spare c1t0d0
ZFS
Adición y remoción de discos a pools
Adición de un disco a un pool existente (sin espejar) zpool add mipool c0t1d0
Adición de un disco para configuración de espejo zpool attach mipool c0t0d0 c0t1d0
Este comando incorpora c0t1d0 como mirror de c0t0d0. zpool attach mipool c0t0d0 c0t2d0
Este comando incorpora c0t2d0 como mirror adicional de c0t0d0 (es decir, c0t0d0 tendrá dos discos espejo).
Remoción de disco espejado zpool detach mipool c0t1d0
ZFS
Remoción de disco sin usar (en espera “hot-spare”)
zpool remove mipool c1t0d0
Reemplazo de un disco en un mirror por otro
zpool replace mipool c0t1d0 c0t2d0
ZFS
Comandos de estado
Ver resúmenes de pools existentes
zpool list
Ejemplo: # zpool listNAME SIZE USED AVAIL CAP HEALTH ALTROOTmipool 59,5M 80,5K 59,4M 0% DEGRADED -rpool 5,97G 3,16G 2,80G 53% ONLINE -
ZFS
Ver estado del pool.
zpool status
Ejemplo:
# zpool status pool: mipool state: DEGRADEDstatus: One or more devices has been taken offline by the administrator. Sufficient replicas exist for the pool to continue functioning in a degraded state.action: Online the device using 'zpool online' or replace the device with 'zpool replace'. scrub: resilver completed after 0h0m with 0 errors on Tue Jul 28 17:21:06 2009config: NAME STATE READ WRITE CKSUM mipool DEGRADED 0 0 0 mirror DEGRADED 0 0 0 /dev/lofi/1 ONLINE 0 0 0 /dev/lofi/2 OFFLINE 0 0 0 27,6M resilvered spares /dev/lofi/3 AVAILerrors: No known data errors pool: rpool state: ONLINE scrub: none requestedconfig: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 c7d0s0 ONLINE 0 0 0errors: No known data errors
ZFS
Estadísticas I/O
zpool iostat Por ejemplo: # zpool iostat capacity operations bandwidthpool used avail read write read write---------- ----- ----- ----- ----- ----- -----mipool 77,5K 59,4M 2 51 2,67K 49,3Krpool 3,16G 2,80G 0 0 37,1K 12,0K---------- ----- ----- ----- ----- ----- -----
ZFS
Gestión de "datasets"
Cuando creamos un pool, automáticamente pasa a estar disponible como “dataset”, es decir, sistema de ficheros, teniendo por defecto el punto de montaje con el nombre del pool. Por ejemplo, cuando hacemos:
Zpool create -f mipool c0t0d0
Veremos que está disponible el espacio si hacemos un df: # df -h...mipool 28M 19K 28M 1% /mipool
Sin embargo, se pueden crear más datasets. La idea es definir nuevos datasets dentro del dataset principal, pudiendo construir toda una jerarquía. Por defecto, todo el espacio del pool estará igualmente disponible para todos los datasets. Esto lo vemos con el comando df si tenemos dos datasets creados sobre el pool principal:
# df -h...mipool 87M 19K 87M 1% /mipoolmipool/dataset2 87M 19K 87M 1% /mipool/dataset2
Sin embargo, para cada dataset es posible definir operaciones propias de sistemas de ficheros como establecer una cuota, reservarle una cantidad de espacio o almacenar comprimidos los datos.
ZFS
Creación y borrado de datasets
Creación: zfs create mipool/dataset2
Borrado: zfs destroy mipool/dataset2
Creación con punto de montaje alterno: zfs create -o mountpoint=/mnt mipool/dataset2
Creación con cuota. zfs create -o quota=15M mipool/dataset2
Vemos que las operaciones con datasets simplifican mucho la gestión de sistemas de ficheros, ya que con un solo comando, hemos creado el sistema, lo hemos “formateado” y lo hemos dejado montado. Además, este montaje es persistente (si reiniciamos la máquina volverá a aparecer en su sitio).
ZFS
Cambios en datasets
Cambio de punto de montaje. zfs set mountpoint=/mnt2 mipool/dataset2
Desmontar un dataset sin eliminarlo. zfs umount /mnt2
Volver a montar zfs set quota=15M mipool/dataset2
Cambiar la cuota. zfs set quota=15M mipool/dataset2
Quitar la cuota. zfs set quota=none mipool/dataset2
Reservar espacio del pool para el dataset. zfs set reservation=15M mipool/dataset2
Comprimir los datos de un dataset. zfs set compression=on mipool/dataset2
ZFS
Estado de datasets
El comando general es zfs list. Por ejemplo:
# zfs listNAME USED AVAIL REFER MOUNTPOINTmipool 15,1M 14,9M 19K /mipoolmipool/dataset2 19K 29,9M 19K /mnt
En caso de que estemos usando quotas, reservation u otras propiedades específicas, el comando zfs list puede invocarse para que muestre esas propiedades. Por ejemplo:
# zfs list -o name,reservation,quota,mountpoint,compression,compressratioNAME RESERV QUOTA MOUNTPOINT COMPRESS RATIOmipool none 30M /mipool none 2.70xmipool/dataset2 15M none /mnt gzip-9 2.72x
ZFS
Snapshots y clones
Un snapshot es una instantánea del sistema de ficheros, solo lectura. Cuando hacemos un snapshot, este queda almacenado, de forma que las transacciones posteriores que hagamos sobre el sistema de ficheros se harán sobre el principal y no sobre el snapshot. De este modo será posible retroceder al estado anterior mediante una acción específica (rollback).
Un clon es equivalente a una copia de un snapshot del sistema sobre la que podemos escribir.
Clones y snapshots no consumen espacio cuando son creados, ya que son copias de estado, no de datos. Cuando se empieza a modificar el sistema clonado o el origen de una instantánea, se empiezan a almacenar las diferencias, que sí consumen espacio. Si se hace un rollback, se deshacen esas diferencias y se recupera el espacio correspondiente.
Como nota adicional, los clones solo pueden ser creados a partir de snapshots existentes. Es decir, primero hacemos la instantánea y luego el clon, que sí podremos modificar.
La utilidad de los snapshots es evidente: por ejemplo, para testear una aplicación que modifica ficheros sin temor a perder datos. Pero hay otra muy interesante: cuando Opensolaris se actualiza, guarda la configuración anterior del disco en una instantánea, de forma que si la actualización no nos agrada, es posible volver atrás de forma muy simple.
ZFS
Si queremos hacer rollback a la primera instantánea, primero hay que hacer rollback a la instantánea más reciente, destruir aquella instantánea y por último rollback a la primera:
zfs rollback mipool/dataset@instantanea2zfs destroy mipool/dataset@instantanea2zfs rollback mipool/dataset@instantanea1
Visibilidad de los snapshpots
Existe un comando específico de “zfs list” para consultar los snapshots del sistema:
# zfs list -t snapshotNAME USED AVAIL REFER MOUNTPOINTrpool/ROOT/opensolaris-1@install 149M - 2,82G -mipool/dataset@instantanea1 15K - 19K -mipool/dataset@instantanea2 25K - 19K - También es posible acceder al contenido de las instantáneas, como si estuviera “montada”. Para ello, consultamos el directorio oculto ”.zfs”. Por ejemplo: # zfs list...mipool/ds2 19K 29,9M 19K /mnt# cd /mnt/.zfs/snapshot# ls -ltotal 3drwxr-xr-x 2 root root 2 2009-07-28 18:24 instantanea1drwxr-xr-x 2 root root 2 2009-07-28 18:24 instantanea2
Cada uno de los subdirectorios de snapshot contiene la estructura de ficheros que se “capturó” al hacer el snapshot. Nota.- El directorio oculto .zfs siempre existe, pero no es visible para el comando ls. Sin embargo, es posible forzar su visibilidad mediante una opción específica aplicable al dataset.
ZFS
Creación y rollback de snapshot
Comando para crear la instantánea: zfs snapshot mipool/dataset2@instantea1
Si una vez modificado el sistema mipool/dataset2 queremos hacer rollback al estado reflejado en instantánea1: zfs rollback mipool/dataset2@instantanea1
Si queremos prescindir de la instantánea, usaremos el comando destroy: zfs destroy mipool/dataset2@instantanea1 Se pueden hacer varias instantáneas, por ejemplo:
...
zfs snapshot mipool/dataset2@instantanea1
...
zfs snapshot mipool/dataset2@instantanea2
En estos casos, el rollback se podrá hacer a la instantánea más reciente, es decir:
zfs rollback mipool/dataset2@instantanea2
ZFS
Clones de un snapshot
Para crear un clon de una instantánea, haremos lo siguiente:
zfs clone mipool/ds2@instantanea1 mipool/ds21
A partir de este momento la instantánea instantanea1 es copiada y modificable en el clon mipool/ds21. En el fondo, el clon se comporta como una copia escribible de la instantánea (es decir, la instantánea original no es tocada), pero solo ocupan espacio los cambios que vayamos haciendo. Para destruir un clon, lo haremos como si de un dataset normal se tratase: zfs destroy mipool/ds21 Nótese que si una instantánea tiene clones, no se podrá borrar ésta hasta que se borren todos los clones. Por último, es posible “promover” un clon para que reemplace al dataset original. Es decir, con la orden promote, hacemos que el clon deje de depender de la instantánea que sirvió para crearlo. Después, podemos borrar instantáneas y sistema de fichero original, y usar el clon como sistema que lo reemplace. Ejemplo: # zfs promote mipool/ds21# zfs destroy mipool/ds2@instantanea1# zfs destroy mipool/ds2# zfs rename mipool/ds21 mipool/ds2
En este ejemplo, hemos promovido el clon mipool/ds21, que dependía de la instantánea mipool/ds2@instantanea1. Al no depender de él, podemos destruir el dataset original mipool/ds2. Por último, el antiguo clon ds21 (que ahora es dataset independiente) puede pasarse a llamarse ds2.