Btrfs y sus funcionalidades

Introducción

Btrfs es un sistema de ficheros para Linux con funciones que permiten escalar el almacenamiento a configuraciones de gran capacidad.

De la misma forma que lo hace ZFS, Btrfs hace un uso extensivo de copy-on-write, permite hacer snapshots de solo lectura o modificables, incluye soporte nativo para sistema de ficheros multidispositivo y soporta subvolumenes. Tiene un mecanismo de protección contra (datos y metadatos) mediante checksums, soporta comprensión, además esta optimizado para su uso en unidades de estado solido, tiene empaquetado eficiente de ficheros pequeños y otras más.

Para conseguir todo esto Btrfs lo que hace es fusionar lo que antes se tenia que hacer de forma separada, el sistema de ficheros, el controlador RAID y el gestor lógico de los volumenes. Consiguiendo así gestionar de manera integrada el almacenamiento.

Según Wikipedia.org/wiki/Btrfs:

Btrfs es un sistema de ficheros basado en el principio de copy-on-write, inicialmente diseñado por Oracle para su uso en Linux. El desarrollo de Btrfs comenzó en el año 2007 y desde Agosto de 2014 se ha marcado como estable.

Según Btrfs Wiki:

Btrfs es un sistemas de ficheros basado en COW para Linux, cuyo objetivo es implementar funcionalidades avanzadas a la vez que se centra en la tolerancia a fallos, la reparación y la fácil administración. Desarrollado conjuntamente en Oracle, Red Hat, Fujitsu, Intel, SUSE, STRATO, etc. Btrfs tiene licencia bajo GPL y está abierto a la contribución de cualquiera.

Preparación

El kernel oficial de Linux incluye soporte para Btrfs, las utilidades de espacio de usuario están disponibles al instalar el paquete brtfs-progs: 

Crear un sistema de ficheros y Soporte Multidispositivo

Sistema de ficheros en un solo dispositivo

Para formatear el dispositivo hacemos:

Ejecución:

Por defecto, el tamaño de bloque en Btrfs es de 16KB, si queremos un tamaño mayor usaremos el valor de nodesize utilizando el parámetro -n:

Sistema de ficheros en múltiples dispositivos

Con Btrfs también se puede crear un sistema de ficheros sobre varios dispositivos, cuando se hace esto se crea un pool de almacenamiento con funcionalidad agregada.

Ejecución:

Nota: Con que montemos uno de los dos dispositivos con el comando mount , tendríamos disponible el espacio de ambos.

Las configuraciones de almacenamiento multidispositivos como RAID, tradicionalmente se han utilizado para aportar tolerancia a fallos. Al utilizar Btrfs puede conseguirse lo equivalente al indicar que los datos/metadatos del sistema de ficheros deban guardarse con redundancia en diferentes dispositivos. Esto se indica a la hora de ejecutar la instrucción con las opciones -d, -m, para especificar el perfil de redundancia para los datos y metadatos. Los valores posibles son raid0, raid1, raid10, raid5, raid6 y simple.

Los diferentes niveles de raid pueden ser configurados de forma separada con la opción -d para los datos y -m para los metadados. Por defecto se utiliza raid0 para los datos y raid1 para duplicar los metadatos en los dos dispositivos. Se pueden agregar varios dispositivos para crear un RAID. 

Para crear el sistema de ficheros con tolerancia a fallos se podría hacer de la siguiente forma:

En esta configuración de raid1 en Btrfs nos estamos asegurando que cada bloque este duplicado en dos discos diferentes.

Nota: la opción -f es para forzar el sobrescribir en el dispositivo en el caso de que ya se encontrase formateado con un sistema de ficheros diferentes, por ejemplo ext4.

Gestión del pool de dispositivos

Si tenemos el sistema de ficheros montado es posible aumentar y disminuir el tamaño del pool, añadiendo o quitando dispositivos. Cabe destacar que solo se podrán eliminar dispositivos del pool, cuando la capacidad resultante sea suficiente para mantener los datos ya escritos, incluyendo las diferentes condiciones de los raids. En el caso de que necesitemos eliminar un dispositivo, puede que fuera necesario añadir otro para migrar primero la información del disco que se va a eliminar.

Por ejemplo vamos a partir de la siguiente situación:

Vamos agregar /dev/vdb al sistema de ficheros montado:

Si ahora vemos el uso de los dispositivos del raid, veremos como no se esta haciendo uso del dispositivo que acabamos de añadir (/dev/vdb):

Ahora eliminamos uno de los discos que estaban antes:

Si volvemos a mirar el uso de espacio de los dispositivos, ha tenido que haber un cambio en las cifras:

Cuando se agregan nuevos dispositivos a un sistema de ficheros Btrfs, se puede querer distribuir los datos que ya estaban escritos entre los dispositivos antiguos y el/los nuevos discos disponibles. A esto se le denomina balanceo y se puede realizar con la siguiente instrucción btrfs filesystem balance. 

Vamos agregar el dispositivo /dev/vdc que borramos del sistema de ficheros montado anteriormente, y balancear la información entre los dispositivos disponibles en ese momento:

Info: podemos ver que se ha modificado el uso de los dispositivos antiguos, pero no del nuevo, seguramente tiene mucho que ver que el nuevo dispositivo sea de tan solo 1GiB, en comparación a los otros dos. En el caso que fueran del mismo tamaño los dispositivos, haría una distribución casi equitativa.

Montar el sistema de archivos en modo degradado y reparar el raid

Si tenemos un raid con tolerancia a fallos y se ha producido un problema con uno de los discos , se marcará en modo degradado.

Cuando por ejemplo se utiliza en Btrfs un RAID 1, y falla uno de los discos, solo se podrá montar el sistema de ficheros con la opción -o degraded. 

Ejemplo:

Lo montamos y metemos algunos datos de ejemplo:

Ahora vamos a comprobar como Btrfs sigue manteniendo la integridad del fichero, a pesar de provocar un fallo en uno de los dispositivos de bloque del raid:

El sistema de ficheros sigue guardando el fichero, a pesar de que el dispositivo /dev/vdb se ha “perdido”.

Ante esta situación, tendremos que agregar un nuevo dispositivo de bloque, eliminar del pool el disco en estado

En un sistema de archivos Btrfs con tolerancia en el que falla un disco, se debe: agregar un nuevo disco, eliminar del pool el disco ‘missing‘ (nombre especial que representa al disco fallido) y después rebalancear el sistema de archivos para volver a replicar la información. Mientras el sistema de archivos esté degradado únicamente se podrá montar mediante la opción -o degraded.

Checksums y scrub

La redundancia permite mantener la información ante la avería de un dispositivo y también algunos errores que se pudieran producir en un bloque determinado. En cada lectura se comprueba la integridad del bloque y si hubiera un error, automáticamente se busca una copia alternativa.

La operación scrub, comprueba la integridad de todos los bloques de un sistema de archivos. Esta operación se realiza en segundo plano mientras el sistema de archivos está montado, aunque lógicamente conviene planificarla en los momentos de mínima carga. Si de un bloque tenemos la copia A y B, siempre se leerá la copia A y si no se detecta corrupción se ignorará la copia B. Esto nos lleva a que durante el funcionamiento normal, si la primera copia de un bloque conserva su integridad nunca se accederá (y por tanto comprobará) la integridad de la segunda copia. Cuando se realiza un scrub se detectan y corrige cualquier bloque corrupto (siempre que no se hayan perdido todas las copias del mismo, en cualquier caso se advertirá del error).

Para ejecutar la operación de scrub, indicamos lo siguiente:

Si queremos ver con más detalle lo que ha pasado en la operación anterior:

Compresión transparente

Otra de las características que soporta Btrfs es la compresión transparente, cuando se monta un sistema de ficheros con la opción -o compress se activa de forma automática la compresión. Con la compresión activa los bloques se comprimen antes de escribirse y se descomprimen de manera automática en las lecturas, de este modo las aplicaciones simplemente se dedican a escribir/leer en el sistema de archivos pero se ahorra espacio en disco.

Sintaxis:

Aunque la información en disco esté comprimida, cuando se realiza un listado del tamaño de los ficheros las cifras no varían. Para cada fichero se muestra el número de bytes que contiene, independientemente de que en disco estén comprimidos o no, pero al mostrar la cantidad de espacio consumida en el pool, vemos como usa apenas 215MB. A pesar de que hemos creado un fichero de 5GiB dentro  del sistema de ficheros.

En un mismo sistema de ficheros, o subvolumen, pueden coexistir datos comprimidos y sin comprimir (o bien comprimidos por diferentes algoritmos).

Copy-on-Write (CoW) 

Es una técnica de gestión de recursos utilizada en la programación de computadoras para implementar de manera eficiente una operación de “duplicación” o “copia” en recursos modificables. Lo que viene a ser que si un recurso es duplicado pero no modificado, no es necesario crear un nuevo recurso, el recurso será compartido entre la copia y el recurso original.

Por defecto Btrfs usa esta técnica para todos los ficheros en cada momento, así como tiene sus ventajas también tiene desventajas.

Deshabilitar CoW

Para deshabilitar el copy-on-write sobre directorios o ficheros hacemos:

Esto funcionará cuando se haga una operación que referencia a dicho fichero solamente, Si por ejemplo estamos haciendo un cp del directorio donde se encuentra el fichero, el copy-on-write ocurrirá igualmente.

La etiqueta +C hace referencia a nuevos ficheros o ficheros vacíos, y no a los bloques de datos ya existentes, Si la etiqueta se le asigna a un directorio, no afectará al directorio en si, pero los nuevos ficheros que se creen dentro del directorio tendrán el atributo No_COW.

Crear copias livianas

Por defecto, cuando se copian archivos en el sistema de ficheros Btrfs con cp, se crean copias reales. Pero si queremos hacer una copia liviana en este sistema de ficheros, debemos utilizar la opción –reflink de cp , lo que hace básicamente es referenciar la copia a los datos originales.

Ejemplo:

Subvolúmenes e instantáneas

Un subvolumen es equivalente a un sistema de ficheros contenido en el anfitrión. Un sistema de ficheros Btrfs tiene como mínimo un subvolumen pero pueden crearse otros. Cuando se monta un sistema de ficheros se monta el subvolumen por defecto que inicialmente es el único que existe. Pero es posible montar un subvolumen concreto al especificar las opciones de montado subvolid= o subvol=.

También es posible cambiar el subvolumen por defecto de un sistema de ficheros, si después se pretende montar el subvolumen raíz se deberá utilizar la opción de montado subvolid=0. Los subvolumenes comparten configuración del raid con el sistema de ficheros en el que existen.

Veamos algunos ejemplos:

Primero creamos un sistema de ficheros con los 3 dispositivos disponibles:

Lo montamos y creamos algunos subvolumenes:

Si listamos el contenido del punto de montaje, veremos como se muestran como si fueran directorios, si ejecutamos la instrucción btrfs subvolume list, también podremos ver los subvolumenes existente, aún así este último no muestra el subvolumen por defecto que se crea automáticamente al crear el sistema de ficheros.

Si por ejemplo, creamos un fichero dentro del subvolumen y lo montáramos en otro punto de montaje, se podría visualizar dicho fichero:

Por último podemos ver como el tamaño del subvolumen es equivalente al tamaño del pool al que pertenecen:

En este caso el fichero examplefile, sería accesible desde dos puntos de montaje:

Y si se realizará cualquier modificando sería visible desde el otro punto de montaje.

Las instantáneas son clones COW de un subvolumen completo, por lo tanto se ven como un nuevo subvolumen que inicialmente contiene los datos del subvolumen clonado pero a partir de ahora los cambios en uno no afectan al otro. Por supuesto el espacio consumido irá aumentando en la medida en la que el subvolumen ‘original’ y la ‘instantánea’ se distancien.

Para crear una instantánea, por ejemplo del subvolumen1:

En este caso si se monta subvolumen1_snapshot (id 261) en algún lugar se verá que contiene el fichero examplefile que contenía el subvolumen 258, y gracias al COW cada subvolumen podrá modificarse de manera independiente sin que los cambios de uno afecten al otro.

Espacio consumido o disponible

Después de todo lo anterior visto, podemos ver que Btrfs es un sistema de ficheros muy diferente a lo que estamos acostumbrados tradicionalmente. Esto hace, que calcular cuanto espacio ha consumido el sistema de ficheros o cuanto espacio me queda disponible, o cuanto espacio gano si borro este fichero sea complicado a primera vista.

Así que se hace imposible calcular lo comentado anteriormente con instrucciones como ls, du df. 

Es así que btrfs nos proporciona un par de instrucciones para poder consultar esto.

Para ver el uso de espacio en el sistema de ficheros:

Y esta otra para ver el consumo en crudo de los diferentes dispositivos que forman el pool de almacenamiento:

 

Conclusion

Btrfs sustituye al manejo de dispositivos de manera que tengamos que redimensioanr el sistema de ficheros por un lado, administrar los dispositivos por otro y la creación de volúmenes lógicos. Dejándonos la posibilidad de hacer todo esto desde una sola herramienta. Esto es muy potente y después de ver algunas de las funcionalidades creo que hay que reconocer lo inevitable, aún así remarcar, que todo esto consigue optimización y rendimiento sobre los dispositivos y sistema de ficheros en comparación con los sistemas de ficheros tradicionales debido a que hace un consumo mas elevado de recursos de la máquina.

 

 

Autor entrada: CharlieJ