Filesystems BTRFS en Linux

La comunidad de Linux Fedora ha anunciado que a partir de Fedora 33, BTRFS (B-Tree Filesystem) será el sistema de archivos por defecto. Esto es importante porque Fedora es la distribución experimental en la cual está basado RedHat, lo que significa que en un futuro, BTRFS, podría llegar también a RedHat.

Para testear BTRFS, me he instalado Fedora 32 en un servidor virtual de pruebas, ya que Fedora 33 todavía no ha salido en el momento en que escribo este artículo.

¡Vamos a ello!

Creación de un filesystem BTRFS

Las opciones de creación de un FS BTRFS por defecto son con mirror (RAID1) y striping,

[root@localhost ~]# mkfs.btrfs /dev/sdb /dev/sdc
btrfs-progs v5.7 
See http://btrfs.wiki.kernel.org for more information.

Label:              (null)
UUID:               551a9ae6-1495-4fd6-86a6-75890bb4d43b
Node size:          16384
Sector size:        4096
Filesystem size:    2.00GiB
Block group profiles:
  Data:             single            8.00MiB
  Metadata:         RAID1           102.38MiB
  System:           RAID1             8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Runtime features:   
Checksum:           crc32c
Number of devices:  2
Devices:
   ID        SIZE  PATH
    1     1.00GiB  /dev/sdb
    2     1.00GiB  /dev/sdc

[root@localhost ~]#

Como podemos observar, tenemos un espacio reservado para datos y otro para metadatos (información sobre la estructura del filesystem).

Otros tipos de RAID que se pueden crear con BTRFS

  • RAID10. Al menos, requiere cuatro discos:
mkfs.btrfs /dev/sdb /dev/sdc /dev/sdd /dev/sde
  • Striping de los metadatos sin mirror de datos:
mkfs.btrfs -m raid0 /dev/sdb /dev/sdc
  • RAID10 para datos y metadatos:
mkfs.btrfs -m raid10 -d raid10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
  • Evitar duplicar metadatos en un único disco:
mkfs.btrfs -m single /dev/sdb

Montaje de un filesystem BTRFS

Al ser un filesystem multidispositivo, podemos montarlo con cualquiera de ellos. Eso sí, si lo eliminas, acuérdate de sustituirlo en el fichero /etc/fstab.

[root@localhost ~]# tail -1 /etc/fstab
/dev/sdb	/testbtrfs	btrfs	device=/dev/sdb,device=/dev/sdc	0 0
[root@localhost ~]# df -hP /testbtrfs/
S.ficheros     Tamaño Usados  Disp Uso% Montado en
/dev/sdb         2,0G   3,6M  1,8G   1% /testbtrfs
[root@localhost ~]# 

Añadir un nuevo disco a un filesystem BTRFS

Si necesitamos más espacio, siempre podemos añadir un disco más al filesystem.

[root@localhost ~]# btrfs device add /dev/sdd /testbtrfs/
[root@localhost ~]# 

También podemos optar por la opción de ampliar una LUN y luego el filesystem, algo que veremos más abajo en este documento.

Visualizar el estado de un filesystem BTRFS

Tenemos varias opciones para ver el estado de un filesystem BTRFS. Básicamente, sabremos qué discos se están utilizando y cuánto espacio se está usando para datos y metadatos.

[root@localhost ~]# btrfs filesystem show /testbtrfs/
Label: none  uuid: 551a9ae6-1495-4fd6-86a6-75890bb4d43b
	Total devices 3 FS bytes used 192.00KiB
	devid    1 size 1.00GiB used 118.38MiB path /dev/sdb
	devid    2 size 1.00GiB used 110.38MiB path /dev/sdc
	devid    3 size 1.00GiB used 0.00B path /dev/sdd

[root@localhost ~]#

[root@localhost ~]# btrfs filesystem df /testbtrfs 
Data, single: total=8.00MiB, used=64.00KiB
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=102.38MiB, used=112.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
[root@localhost ~]# 

[root@localhost ~]# btrfs filesystem usage /testbtrfs 
Overall:
    Device size:		   3.00GiB
    Device allocated:		   1.59GiB
    Device unallocated:		   1.41GiB
    Device missing:		     0.00B
    Used:			   1.00GiB
    Free (estimated):		   1.66GiB	(min: 977.44MiB)
    Data ratio:			      1.00
    Metadata ratio:		      2.00
    Global reserve:		   3.25MiB	(used: 0.00B)
    Multiple profiles:		        no

Data,single: Size:1.25GiB, Used:1.00GiB (80.01%)
   /dev/sdc	 320.00MiB
   /dev/sdd	 320.00MiB
   /dev/sdb	 640.00MiB

Metadata,RAID1: Size:142.38MiB, Used:1.17MiB (0.82%)
   /dev/sdd	 142.38MiB
   /dev/sdb	 142.38MiB

System,RAID1: Size:32.00MiB, Used:16.00KiB (0.05%)
   /dev/sdd	  32.00MiB
   /dev/sdb	  32.00MiB

Unallocated:
   /dev/sdc	 704.00MiB
   /dev/sdd	 529.62MiB
   /dev/sdb	 209.62MiB
[root@localhost ~]#

Eliminar un disco de un filesystem BTRFS

Si intentamos eliminar un disco y no hay espacio para ello, no nos dejará eliminarlo:

[root@localhost ~]# btrfs device delete /dev/sdd /testbtrfs
ERROR: error removing device '/dev/sdd': No space left on device
[root@localhost ~]# 

Si hay espacio para mover los datos del disco a eliminar a los discos restantes del filesystem BTRFS, podremos eliminar el disco sin problemas:

[root@localhost ~]# btrfs device delete /dev/sdd /testbtrfs
[root@localhost ~]# btrfs filesystem show /testbtrfs/
Label: none  uuid: 551a9ae6-1495-4fd6-86a6-75890bb4d43b
	Total devices 2 FS bytes used 102.76MiB
	devid    1 size 1.00GiB used 110.38MiB path /dev/sdb
	devid    2 size 1.00GiB used 430.38MiB path /dev/sdc

[root@localhost ~]# 

En BTRFS el equivalente al PVMOVE de LVM es automático cuando eliminamos un disco.

Eliminar un disco averiado

Si tenemos una avería hardware en un disco, podemos eliminarlo de la estrctura BTRFS para sustituirlo por otro.

Primero, desmontamos el disco y luego lo eliminamos:

mount -o degraded /dev/sdb /mnt
btrfs device delete missing /mnt

A continuación, ya podemos añadir un disco nuevo como lo hacemos habitualmente y rebalancear los datos entre todos los discos.

Rescanear discos BTRFS

Si necesitamos hacer un rescan de discos con formato BTRFS, lo haremos con el siguiente comando:

[root@localhost ~]# btrfs device scan
Scanning for Btrfs filesystems
[root@localhost ~]# 

Para escanear de nuevo un disco en concreto, lo haríamos así:

btrfs device scan /dev/sdb

Equilibrar los datos entre todos los discos BTRFS

Si queremos rebalancear los datos que contiene cada uno de los discos de un FS BTRFS para que cada uno soporte el mismo volumen de carga, ejecutaremos el siguiente comando:

[root@localhost ~]# btrfs filesystem balance /testbtrfs
Done, had to relocate 7 out of 7 chunks
[root@localhost ~]# 

De esta manera evitamos que, por ejemplo, todos los datos estén almacenados en el disco /dev/sdb.

Reducir el tamaño de un filesystem BTRFS

Lo que haremos será revisar el ID (devid) de cada uno de los discos que forman el filesystem y reducir el tamaño del que nos interese. Por ejemplo:

[root@localhost ~]# btrfs filesystem show /testbtrfs/
Label: none  uuid: 551a9ae6-1495-4fd6-86a6-75890bb4d43b
	Total devices 3 FS bytes used 1.00GiB
	devid    2 size 1.00GiB used 896.00MiB path /dev/sdc
	devid    3 size 1.00GiB used 608.00MiB path /dev/sdd
	devid    4 size 1.00GiB used 352.00MiB path /dev/sdb

[root@localhost ~]# btrfs filesystem resize 2:-100m /testbtrfs/
Resize '/testbtrfs/' of '2:-100m'
[root@localhost ~]# btrfs filesystem show /testbtrfs/
Label: none  uuid: 551a9ae6-1495-4fd6-86a6-75890bb4d43b
	Total devices 3 FS bytes used 1.00GiB
	devid    2 size 924.00MiB used 896.00MiB path /dev/sdc
	devid    3 size 1.00GiB used 608.00MiB path /dev/sdd
	devid    4 size 1.00GiB used 352.00MiB path /dev/sdb

[root@localhost ~]# 

Como podemos observar, se ha reducido el espacio asignado al dispositivo «2» (/dev/sdc).

Ampliar un filesystem BTRFS

La ampliación de un filesystem BTRFS es muy similar al la reducción. Para ampliar el espacio máximo disponible:

[root@localhost ~]# btrfs filesystem resize 2:max /testbtrfs/
Resize '/testbtrfs/' of '2:max'
[root@localhost ~]# btrfs filesystem show /testbtrfs/
Label: none  uuid: 551a9ae6-1495-4fd6-86a6-75890bb4d43b
	Total devices 3 FS bytes used 1.00GiB
	devid    2 size 1.00GiB used 896.00MiB path /dev/sdc
	devid    3 size 1.00GiB used 608.00MiB path /dev/sdd
	devid    4 size 1.00GiB used 352.00MiB path /dev/sdb

[root@localhost ~]# 

Aunque también podemos utilizar el comando especificando el tamaño exacto al que queremos ampliar. Por ejemplo:

btrfs filesystem resize 2:+200M /testbtrfs/

Creación de subvolúmenes y snapshots

Los snapshots únicamente se pueden crear a partir de subvolúmenes de BTRFS, así que, primero, crearemos un subvolumen:

[root@localhost ~]# btrfs subvolume create /testbtrfs/subvol1
Create subvolume '/testbtrfs/subvol1'
[root@localhost ~]# btrfs subvolume list /testbtrfs 
ID 322 gen 203 top level 5 path subvol1
[root@localhost ~]# 

A continuación, ya podemos crear el snapshot:

[root@localhost testbtrfs]# btrfs subvolume snapshot /testbtrfs/subvol1/ /testbtrfs/subvol1/snapshot
Create a snapshot of '/testbtrfs/subvol1/' in '/testbtrfs/subvol1/snapshot'
[root@localhost testbtrfs]#

[root@localhost testbtrfs]# cd /testbtrfs/subvol1/snapshot
[root@localhost snapshot]# ll
total 1048576
-rw-r--r--. 1 root root 1073741824 sep  7 06:29 test_file2
[root@localhost snapshot]# 

Eliminación de un snapshot de BTRFS

Antes de eliminar el snapshot, vamos a borrar todos sus datos. Luego ya lo podremos eliminar sin problemas, de la siguiente manera:

[root@localhost testbtrfs]# rm -r /testbtrfs/subvol1/*
rm: ¿descender al directorio '/testbtrfs/subvol1/snapshot'? (s/n) s
rm: ¿borrar el fichero regular '/testbtrfs/subvol1/snapshot/test_file2'? (s/n) s
rm: ¿borrar el directorio '/testbtrfs/subvol1/snapshot'? (s/n) s
[root@localhost testbtrfs]#

[root@localhost testbtrfs]# btrfs subvolume delete /testbtrfs/subvol1
Delete subvolume (no-commit): '/testbtrfs/subvol1'
[root@localhost testbtrfs]# 

Te puede interesar

COMPÁRTEME

Deja un comentario