====== ZFS ====== ==== Depósito de almacenamiento ==== ZFS introduce el concepto **depósito/pool de almacenamiento**. Históricamente los sistemas de archivo se han construido sobre un dispositivo físico, a partir del advenimiento del **Administrador de volúmenes lógicos** se pudieron construír sistemas de archivos sobre varios dispositivos físicos, los volúmenes lógicos consisten en la construcción de //volúmenes virtuales// a partir de la adición de discos físicos, en estos volúmenes virtuales se construyen sistemas de archivos. Los //volúmenes virtuales// no ofrecen redundancia en la escritura de datos, esto significa que la falla de un disco físico deja a todo el sistema de archivos inaccesible((Es posible tener redundancia en un volúmen lógico mediante algun sistema RAID por software o hardware)). El Zettabyte File System(ZFS) es una combinación de un sistema de archivos con un RAID((Redundant Array of Independent Disk trabaja escribiendo los datos en varios dispositivos físicos, apareciendo en el sistema operativo como una sola operación de I/O)) por software, ZFS introduce el concepto de dispositivo virtual (vdev) donde la superfice de almacenamiento de un conjunto de discos físicos se adiciona con alguna técnica RAID; estos dispositivos virtuales a su vez, se agrupan en un depósito de almacenamiento a partir del cual pueden construirse sistemas de archivos o áreas de almacenamiento arbitrario.\\ ===== Referencia ===== [[https://openzfs.github.io/openzfs-docs/Project%20and%20Community/FAQ.html#what-is-openzfs|¿Que es zfs?]] ==== Instalación de ZFS ==== La compatibilidad de los módulos del kernel en actualizaciones del kernel de linux, puede llevarse a cabo mediante 2 mecanismos DKMS(Dynamic Kernel Module Support) y KABI(Kernel Application Binary Interface), estos mecanismos son esenciales para el manejo de los módulos cuando ocurren actualizaciones del kernel. === DKMS === El propósito de este mecanismo es simplificar el mantenimiento de los módulos del kernel, cuando ocurren actualizaciones del kernel mediante la compilación e instalación automática de los módulos requeridos, este mecanismo requiere la instalación del ambiente de de desarrollo y el los fuentes del nuevo kernel. === KABI === Esta es una interfaz proporcionada por el kernel de linux que permite a los módulos mantener una compatibilidad binaria en las actualizaciones del kernel, esto implica que el módulo se construye considerando la interfaz KABI del kernel y esto evita la recompilación de los módulos. === Procedimiento === - Instalación de los repositorios requeridos - //dnf install epel-release -y// - Instalación del paquete - //dnf install -y [[https://zfsonlinux.org/epel/zfs-release-2-2.el9.noarch.rpm]]// - Instalación del paquete KABI - //dnf config-manager --disable zfs// - //dnf config-manager --enable zfs-kmod// - //dnf install zfs -y// - //modprobe zfs// - //echo "zfs" | sudo tee /etc/modules-load.d/zfs.conf// === Referencia === [[https://www.golinuxcloud.com/zfs-rocky-linux-9/#Understanding_DKMS_and_kABI_Module|Instalación ZFS]] ==== Terminología de ZFS ==== //Checksum// Hash de 256 bits contenido en un bloque del sistema de archivos. //Clone// Sistema de archivos cuyo contenido inicial es idéntico al contenido de una instantanea (snapshot). //Dataset// Nombre genérico para los siguientes componentes de ZFS: clones, sistemas de archivos, instantáneas y volúmenes. Cada dataset es identificado de manera única en el espacio de nombres de ZFS con el formato siguiente: pool/path[@snapshot] pool: Identifica el depósito de almacenamiento que contiene el dataset. path: Es elnombre que identifica al dataset. snapshot: Es un componente adicional que identifica la instantanea de un dataset. //file system// Un tipo de dataset que tiene las mismas propiedades que cualquier sistema de archivos. //mirror// Un dispositivo virtual que almacena copias idénticas en 2 o mas discos de la información. Si alguno de los discos falla la información se recupera se otro disco miembro del mirror. //pool// Agrupamiento lógico de dispositivos que describe el layout y las caracteristicas del almacenamiento, el espacio en disco para los datasets se obtiene de los pools. //RAID-Z// Un dispositivo que almacena datos y paridad en varios discos. //resilvering// En configuraciones donde el pool de almacenamiento cuenta con dispositivos virtuales con redundancia y alguno de los discos físicos falla y es reemplazado por otro disco, el proceso de traspaso de la información al nuevo disco recibe el nombre de resilvering. //snapshot// Una copia de solo lectura de un sistema de archivos o volúmen en un instante de tiempo. // virtual device// Un dispositivo lógico que forma parte de un depósito de almacenamiento (pool), puede ser un disco físico, un archivo o una colección de discos. //volumen// Un tipo de de dataset que representa un dispositivo de bloque, por ejemplo en un volúmen lógico es posible crear un área de swap. === Referencia === [[https://docs.oracle.com/cd/E19253-01/819-5461/ftyue/index.html|ZFS terminology]] ==== Creación de un depósito de almacenamiento (pool) ==== Durante la creación de un pool o en el agregado de nuevos discos lógicos a un pool existente es necesario [[https://forums.freebsd.org/threads/zfs-and-disk-labeling-question.33896/|utilizar controladores de disco físicos etiquetados]] para identificar de manera única los componentes físicos de un disco lógico. Ejemplo: //zpool create -o ashift=12 casuniVol mirror /dev/disk/by-id/scsi-SHP_EH000900JWCPH_WAG07RG6-part1 /dev/disk/by-id/scsi-SHP_EH000900JWCPH_WAG07ZRT-part1// //zpool add casuniVol mirror /dev/disk/by-id/scsi-SHPE_MM1000JFJTH_W473FN5T-part1 /dev/disk/by-id/scsi-SHPE_MM1000JFJTH_W473FNEN-part1 -f// El comando //zpool list// permite verificar el espacio utilizado de un depósito de almacenamiento: NAME\_\_\_\_SIZE\_\_\_ALLOC\_\_\_FREE\_\_\_CKPOINT\_\_\_EXPANDSZ\_\_\_FRAG\_\_\_CAP\_\_\_DEDUP\_\_\_HEALTH\_\_\_ALTROOT casuniVol\_\_1.72T\_\_587G\_\_\_1.15T\_\_\_\_\_\_\_\_-\_\_\_\_\_\_\_\_\_\_\_\_\_-\_\_\_\_\_\_\_1%\_\_\_\_\_\_33%\_\_\_\_1.00x\_\_\_\_\_ONLINE En los comandos zpool create y add la opción __ashift__ permite designar el tamaño de bloque que el dispositivo virtual va a utilizar en lecturas y escrituras, esta opción es un atributo del dispositivo virtual no del pool de de almacenamiento, es [[https://www.high-availability.com/docs/ZFS-Tuning-Guide/#:~:text=The%20ashift%20values%20range%20from,auto%2Ddetect%20the%20sector%20size.&text=Setting%20ashift%20is%20immutable.,the%20pool%20and%20start%20again| recomendable que el tamaño de bloque corresponda al tamaño de bloque de los discos físicos que lo componen]]. En el ejemplo anterior el nombre __casuniVol__ es utilizado para identificar el nuevo pool de almacenamiento, __mirror__((Designa el nivel de redundancia del disco virtual, ver en la sección de terminología mirror y raidz)) implica la escritura en al menos 2 dispositivos físicos. Se puede revisar el estatus de un pool recien creado mediante el comando: //zpool status//, asimismo si se chequean los sistemas de archivo accesibles mediante el comando //df -h// aparece el nombre del pool como un punto de montaje del sistema de archivos. ==== Traslado de un depósito de almacenamiento (pool) ==== Los pools de ZFS pueden moverse entre máquinas con versiones identicas o superiores del sistema operativo, para esta operación es necesario exportar los pools para dejen de estar disponibles en el servidor actual, para incluirlos en nuevo servidor se hace la operación de importación. Las metádatos de un pool de ZFS, los almacena en el arreglo de discos que lo constituye, esto asegura la recuperación del pool en circunstancias donde se degrada o esta inaccesible el sistema operativo, restaurando el sistema operativo, el módulo de ZFS y las herramientas de manipulación del pool, el arreglo se localiza y queda disponible mediante los comandos:\\ //Verificación de los pools en arreglos: zpool import//\\ //Obteniendo el nombre del pool: zpool import boalPool//\\ ==== Propiedades ZFS ==== Las objetos de ZFS contienen propiedades que regulan su comportamiento, hay 2 tipos de propiedades las nativas de ZFS y las definidades por el usuario, las propiedades nativas llevan un conjunto de estadísticas o controlan el comportamiento de ZFS, las estadísticas son de solo lectura, las propiedades modificables cambian el comportamiento de los objetos ZFS. La mayor parte de las propiedades nativas son //heredables//, una propiedad //heredable// es aquella que se fija en un objeto padre y automáticamente se propaga a su descendencia. El comando //zfs list// es utilizado para verificar el status de los sistemas de archivo y sus descendientes, por defecto muestra las propiedades //used//, //refer//, //mountpoint//: NAME\_\_\_\_\_\_\_\_\_\_\_**USED**\_\_\_\_AVAIL\_\_\_\_**REFER**\_\_\_\_**MOUNTPOINT** boalVol\_\_\_\_\_\_\_\_\_\_\_\_2.07T\_\_\_\_\_\_6.85T\_\_\_\_\_\_\_96K\_\_\_\_\_\_/boalVol\\ boalVol/prod\_\_\_\_1.92T\_\_\_\_\_\_6.85T\_\_\_\_\_\_1.92T\_\_\_\_\_\_/boalVol/prod\\ boalVol/test\_\_\_\_\_\_155G\_\_\_\_\_\_6.85T\_\_\_\_\_\_155G\_\_\_\_\_\_/boalVol/test\\ === Propiedades de zfs list === USED: Esta propiedad de lectura, contiene la cantidad de espacio consumido por el dataset y sus descendientes.\\ REFER: Esta propiedad de lectura, contiene la cantidad de datos disponible por el dataset puede ser compartido o no con otros datasets del pool.\\ MOUNTPOINT: Es una propiedad modificable que contiene el string donde el sistema de archivos va a ser montando, el string es heredado por los descendientes. ==== Sistemas de archivo ==== Los sistemas de archivo zfs pueden ser creados y destruidos dinámicamente, la creación no requiere que se asigne espacio o formateo de espacio disponible, los sistemas de archivo de zfs son sencillos y constituyen el punto central de administración, normalmente se crean muchos de ellos. Para crear un sistema de archivos: //zfs create casuniVol/prod // Para destruir un sistema de archivos: //zfs destroy casuniVol/prod //((Este comando no pregunta confirmación, es necesario usarlo con cuidado))((Un sistema de archivos no puede ser destruido si esta siendo usado o tiene descendientes)) Para renombrar un sistema de archivos: //zfs rename casuniVol/prod casuniVol/prod-antiguo // === Montaje de sistemas de archivo === Los sistemas de archivo //zfs// son montados por defecto cuando son creados, los puntos de montaje utilizados corresponden a la ruta de directorios que definen al sistema de archivos, el punto de montaje inicial tiene el nombre del depósito de almacenamiento (pool) utilizado en el comando de creación, sin embargo este punto de montaje puede modificarse en el momento de creación del depósito modificando la propiedad //mountpoint//. La propiedad //mountpoint//es heredable, eso significa que los sistemas de archivo que se encuentren en la jerarquia del sistema de archivos presentaran los cambios del punto de montaje que se hizo en el sistema de archivos ancestro. //zpool create -o mountpoint=tickets casuniVol mirror dev1 dev2// Sí se cambia el valor de la propiedad //mountpoint// a un valor diferente a **legacy** o **none** zfs automaticamente monta el sistema de archivo en la ruta indicada por //mountpoint//. //zfs set mountpoint=/mnt casuniVol/test// //zfs get mountpoint casuniVol/test// NAME\_\_\_\_\_PROPERTY\_\_\_\_\_VALUE\_\_\_\_\_SOURCE\\ casuniVol/test\_\_\_\_\_mountpoint\_\_\_\_\_/mnt\_\_\_\_\_local\\ === Compartir sistemas de archivo === Entre las propiedades de los sistemas de archivos se cuentan aquellas que permiten compartir estos sistemas de archivos a través de los protocolos de red mas comunes: //NFS. Protocolo utilizado en todos los sistemas operativos derivados de UNIX.// //SMB. Protocolo usado para compartir archivos en las redes de Windows. // == NFS == Para habilitar compartir archivos entre maquinas UNIX es necesario instalar el software de servidor de NFS y modificar la propiedad **sharenfs** del sistema de archivos ZFS, los valores que acepta esta propiedad son: //on|off|opciones// //zfs set sharenfs=on casuniVol/test//\\ //zfs set sharenfs=ro casuniVol/prod//\\ //zfs set sharenfs='rw=@192.168.0.222,no_root_squash,@192.168.0.214,root_squash' casuniVol/prod/pub//\\ El valor **on** en la propiedad //sharenfs// aplica a las opciones por defecto "permisos de lectura y escritura para todos", el valor **off** significa que la compartición no es manejada por ZFS y puede compartirse mediante el archivo /etc/exports, las otros valores soportados corresponden a los strings para redes o servidores autorizados. Referencia: [[https://docs.oracle.com/cd/E19253-01/819-5461/gamnd/index.html|sharenfs property]] == SMB == ZFS no implementa el protocolo CIFS, requiere SAMBA para compartir archivos con windows, esto significa que colocar el valor **on** en la propiedad sharesmb es equivalente agregar una carpeta a smb.conf, esto es de poca utilidad es mejor editar directamente el archivo /etc/smb.conf y agregar la carpeta compartida. Referencia: [[https://blog.ls-al.com/zfs-on-linux-smb-sharing/|sharesmb property]] ==== Snaphots ==== Un snapshot es una copia de solo lectura de un sistema de archivos o de un volúmen, los snapshots pueden generarse en cualquier momento y no consumen en su creación, espacio adicional del pool, por supuesto cuando el dataset es modificado el snapshot consume espacio ya que hac referencia al estado de la información antes de la modificación. Los snapshots: * Persisten cuando el server es reiniciado * El número teórico de snapshots es 264 * Los snapshots no consumen espacio fuera del pool * Varios snapshots son creados de manera recursiva, entre un filesystem y sus descendientes. La creación de un snapshot requiere una sintaxis particular: **dataset@stringCaracteres**\\ //zfs snapshot casuniVol/prod@25-01-2024//\\ Los snapshots vigentes para un dataset pueden listarse mediante:\\ //zfs list -t snapshot casuniVol/prod //\\ NAME\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_USED\_\_\_\_\_AVAIL\_\_\_\_\_REFER\_\_\_\_MOUNTPOINT\\ casuniVol/prod@20-12-2023\_\_\_928M\_\_\_\_-\_\_\_\_163G\_\_\_-\\ casuniVol/prod@25-01-2024\_\_\_\_109M\_\_\_\_-\_\_\_\_163G\_\_\_-\\ * Los snapshots no tienen propiedades modificables. * Los datasets que tienen snapshots no pueden ser destruidos. == Respaldos == Los respaldos pueden hacerse mediante tar a partir de snapshots((Estos datasets generan un directorio con elnombre del snapshot en un directorio oculto del filesystem)), a continución un ejemplo:\\ //zfs snapshot casuniVol/prod@25-03-2024//\\ //cd /casuniVol/prod/.zfs/snapshot//\\ //tar cvfz /opt/respaldos/respSnapshots/25-03-2024.tgz 25-03-24//\\ Referencia: [[https://forum.proxmox.com/threads/packing-zfs-snapshots-with-tar-on-running-container.66447/|Respaldo con tar de snapshots]]