BTRFS

Btrfs es un sistema de archivos diseñado por Oracle, que se centra principalmente en.

  • tolerancia a fallos
  • reparación
  • administración sencilla

Implementa una tecnología llamada COW (Copia en Escritura), que permite que las operaciones de escritura a disco sean atómicas.

En un sistema de archivos que no emplea COW, si se produce una escritura a un archivo que no existía anteriormente, entonces los datos se scriben en un espacio libre del disco. Si posteriormente se vuelve a escribir sobre el mismo archivo, los nuevos datos son colocados directamente sobre él.

¿Cómo funciona COW? En un sistema de archivos que implementa COW, si se produce una escritura a un archivo que no existía anteriormente, entonces los datos se scriben en un espacio libre del disco. La diferencia está en el momento en que se vuelve a escribir sobre el mismo archivo. Los nuevos datos son escritos en una zona libre del disco, y sólo una vez que la escritura se ha completado, se modifican los metadatos del archivo, añadiendo los índices a los nuevos datos. Los datos antiguos que fueron reemplazados, dejan se ser indizados.

Btrfs realiza Copy-On-Write sobre cada archivo. Esto tiene ventajas e inconvenientes. Como ventaja, garantiza la consistencia de los archivos, de modo que las escrituras a disco se producen de forma atómica (transaccional). Como desventaja, está el hecho de que reduce el rendimiento, especialmente si se producen pequeñas escrituras sobre grandes archivos, ya que hay un alto nivel de fragmentación.

Actualmente hay empresas importantes que ya utilizan btrfs en producción, como Facebook, Tripadvisor, Netgear o Google.

Características

  • Tamaño máximo de archivo: 16 Exabyte
  • Asignación dinámica de inodos, que forma que no se define un máximo número de archivos.
  • Soporta snapshots
  • Define subvolúmenes, que son un tipo de subdirectorios que pueden ser montados de manera independiente como si se tratasen de volúmenes independientes.
  • Soporta de manera nativa RAID-0, RAID-1 y RAID-10.
  • Comprobación de datos y metadatos, para garantizar la integridad.
  • Compresión
  • Integración con device-mapper, es decir, se integra con LVM, MD raid, cifrado de disco y Snapshotting.
  • Chequeo del sistema de archivos sin necesidad de desmontar el volumen
  • Copia de seguridad integrada
  • Optimización para SSD
  • Defragmentación sin desmontaje

Formateo btrfs

mkfs.btrfs /dev/sdb1 /dev/sdc1 /dev/sdd1

Sin más opciones, los datos están distribuídos linealmente y los metadatos están en RAID-1. Si se pierden datos (por sectores de disco estropeados), se pueden usar los metadatos para tratar de recuperar los datos.

Durante el formateo se pueden usar las opciones -m (metadatos) y -d (datos). Con ambas opciones se pueden utilizar los siguientes valores:

  • single para no utilizar raid
  • raid0
  • raid1
  • raid5
  • raid6
  • raid10, para lo que se necesitan al menos 4 unidades

Por ejemplo

# Crear un sistema de archivos sobre 4 discos (metadatos en RAID-1, datos distribuídos linealmente) mkfs.btrfs /dev/sdb /dev/sdc /dev/sdd /dev/sde # Datos en RAID-0 y metadatos en RAID-1 mkfs.btrfs -d raid0 /dev/sdb /dev/sdc # RAID-10 para datos y metadatos mkfs.btrfs -m raid10 -d raid10 /dev/sdb /dev/sdc /dev/sdd /dev/sde # Metadatos en una única unidad mkfs.btrfs -m single /dev/sdb

Montaje de un sistema de archivos btrfs

Para montar un sistema de archivos btrfs, se puede utilizar cualquiera de las unidades que lo compone:

mkfs.btrfs /dev/sdb /dev/sdc /dev/sde mount /dev/sde /mnt

Comprobación de sistemas de archivos btrfs

Para comprobar la lista de sistemas de archivos btrfs, utilizamos el siguiente comando:

btrfs filesystem show

También podemos obtener más información con el comando siguiente a partir del punto de montaje:

btrfs filesystem df /mnt/puntodemontaje

Agregar nuevos dispositivos

btrfs device add /dev/sdd /mnt/puntodemontaje

En este punto hemos agregado el nuevo dispositivo, pero los datos y los metadatos permanecen en los dispositivos originales. Para que se expanadan por el nuevo dispositivo, es preciso balancear el sistema de archivos:

btrfs filesystem banlance /mnt/puntodemontaje

Conversión de un sistema de archivos no-raid

mount /dev/sdb1 /mnt/puntodemontaje btrfs device add /dev/sdc1 /mnt/puntodemontaje btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/puntodemontaje

En el ejemplo anterior, se parte de un sistema de archivos que ocupa únicamente una partición de un disco (/dev/sdb1). Se le añade una nueva partición, y posteriormente se redefine el sistema de archivos como raid1 para datos y metadatos. Finalmente se balancean los datos.

Eliminación y reemplazo de dispositivos

Se puede eliminar un dispositivo con el sistema de archivos montado. Esta operación redistribuye los datos y metadatos en el dispositivo eliminado para que ocupe los dispositivos restantes:

mkfs.btrfs /dev/sdb /dev/sdc /dev/sdd /dev/sde mount /dev/sdb /mnt # Supongamos que se producen escrituras a disco... btrfs device delete /dev/sdc /mnt

En el ejemplo anterior, se da por hecho que el superbloque sigue siendo legible. Paro en caso de que el superbloque haya sido deteriorado, el sistema de archivos deberá ser montado en modo "degradado" para poder eliminar el disco:

mkfs.btrfs -m raid1 /dev/sdb /dev/sdc /dev/sdd /dev/sde # Supongamos que sdd ha sido dañado (o eliminado), y el superbloque # no es legible... mount -o degraded /dev/sdb /mnt btrfs device delete missing /mnt

btrfs device delete missing le dice a btrfs que borre el primer dispositivo que figura entre los metadatos, pero que no está presente cuando el sistema de archivos ha sido montado. Si estamos usando algún tipo de RAID, no podemos estar por debajo del mínimo número de dispositivos necesarios. Por ello, antes de eliminar la unidad, debemos añadir una nueva. Por ejemplo, si tenemos un esquema RAID-1 y un dispositivo falla, deberemos:

  1. Montar en modo degradado
  2. Añadir un nuevo dispositivo
  3. Eliminar el dispositivo perdido
  4. Balancear

Actividad 1. Añade a tu sistema tres discos /dev/sdb, /dev/sdc y /dev/sdd. Crea un sistema de archivos btrfs con esquema RAID-1 para datos y metadatos sobre los discos /dev/sdb y /dev/sdc.

Después monta el sistema de archivos en /mnt/btrfs/.

Ejecuta el comando btrfs filesystem df /mnt/btrfs y guárdalo con el nombre Act1.1-btrfs.png

Escribe 200MB de datos en archivos de 1MB en el sistema de archivos con el siguiente comando:

for ((i=0;i<200;i++)); do dd if=/dev/zero of=/mnt/btrfs/arch$i bs=1k count=1024; done

Hecho esto, apaga la máquina virtual, y desconecta uno de los discos en los que reside el sistema de archivos.

Vuelve a iniciar la máquina, y trata de montar el sistema de archivos. Hecho esto, emplea el procedimiento explicado anteriormente para el reemplazo de un disco seriamente dañado/perdido.

Toma una captura donde se pueda ver las acciones que has llevado a cabo, y guárdala con el nombre Act1.2-btrfs.png

Recuperación de un sistema btrfs dañado

mount -o recovery /dev/sdb /mnt/puntodemontaje

Donde /dev/sdb es una de las unidades que soporta el sistema de archivos.

Redimensionar un sistema de archivos btrfs

Para decrementar (2GB en este caso):

btrfs filesystem resize -2g /mnt/puntodemontaje

Para incrementar (2GB en este caso):

btrfs filesystem resize +1g /mnt/puntodemontaje

Para incrementar el sistema de archivos para que ocupe todo el espacio disponible:

btrfs filesystem resize max /mnt/puntodemontaje

Recuerda que, según vimos en el tema de sistemas de archivos (ext4 y xfs), para redimensionar un un sistema de archivos, la partición o disco que lo contiene debe tener espacio libre sin usar. Por lo tanto, si dicho espacio sin asignar no existe, antes de redimensionar el sistema de archivos es preciso primero eliminar la partición y volver a crearla con el nuevo tamaño.

Subvolúmenes

Un subvolumen es un directorio montable de manera independiente al sistema de archivos que lo contiene. Para crear un subvolumen en un sistema de archivos btrfs montado en /mnt/puntodemontaje:

btrfs subvolume create /mnt/puntodemontaje/nombresubvolumen

A efectos prácticos es un directorio como cualquier otro. Podemos, de hecho, crear subvolúmenes dentro de subvolúmenes, del mismo modo explicado anteriormente.

Para comprobar los subvolúmenes existentes en un sistema de archivos btrfs montado en /mnt/puntodemontaje:

btrfs subvolume list /mnt/puntodemontaje

Para montar un subvolumen, debemos conocer su ID (obtenido con el comando anterior). Supongamos que el sistema de archivos raíz está alojado en /dev/sdb y montado en /mnt/puntodemontaje, y que el subvolumen tiene ID 257:

umount /mnt/puntodemontaje mount -o subvolid=257 /dev/sdb /mnt/puntodemontaje

Si queremos comprobar qué subvolumen está actualmente montado en /mnt/puntodemontaje:

btrfs subvolume show /mnt/puntodemontaje

Para borrar un subvolumen, es preciso que este esté vacío. Si queremos borrar un volumen llamado subvolumen1:

btrfs subvolume delete /mnt/puntodemontaje/subvolumen1

Actividad 2. Crea un subvolumen en el sistema de archivos btrfs que redimensionaste en el ejercicio anterior. El subvolumen debe llamarse "misubvolumen".

Comprueba el listado de subvolúmenes en el sistema de archivos, y toma una captura llamada Actx-btrfs.png

Escribe dentro del subvolumen 100MB en archivos de 1MB. Después monta el subvolumen.

Comprueba el subvolumen que está montado y toma una captura llamada Act2-btrfs.png

Snapshots

Se pueden crear snapshots de subvolúmenes, con el sistema de archivos montado. Supongamos que queremos crear un snapshot de un subvolumen llamado subvol1 alojado en el punto de montaje /mnt/puntodemontaje:

btrfs subvolume snapshot /mnt/puntodemontaje/subvol1 /mnt/puntodemontaje/subvol1_snapshot

Posteriormente podemos restaurar el snapshot del siguiente modo:

mv /mnt/puntodemontaje/subvol1_snapshot /mnt/puntodemontaje/subvol1

Para borrar los restos que quedan del snapshot (basta hacer btrfs subvolume list /mnt/puntodemontaje para verlo), podemos utilizar la herramienta ssm. Ejecutamos el comando ssm list, donde aparecerá una unidad snapshot. Bastará con hacer ssm remove nombre-del-volumen-snapshot

Actividad 3. Realiza cambios en el subvolumen anteriormente creado. Después toma un snapshot del volumen. Ejecuta el comando ssm list y toma una captura con el nombre Act3-btrfs.png.

Finalmente restaura el snapshot y elimina el rastro del subvolumen de la base de datos btrfs y ssm.

Defragmentación

Uno de los inconvenientes de btrfs es la fragmentación. Para defragmentar:

btrfs filesystem defrag /mnt/puntodemontaje