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
- Compresión y deduplicación de datos en Linux con este tutorial de VDO (Virtual Data Optimizer)
- Réplica de datos con DRBD
Mi pasión por la tecnología me lleva constantemente a explorar las últimas tendencias y aplicaciones, buscando siempre formas de implementar soluciones innovadoras que mejoren la eficiencia. En puerto53.com comparto contenido valioso para ayudar a otros profesionales y entusiastas de la informática a navegar y dominar el complejo mundo de la tecnología. Mi especialidad en Linux RedHat.
Más sobre mí en el este enlace,