- Tenemos una maquina con varios discos asociados, lo primero que haremos será instalar la paquetería necesaria para el uso de este sistema de archivos.
vagrant@maquina1:~$ sudo apt install btrfs-progs arch-install-scripts
- Montamos en la tabla de particiones los nuevos discos.
vagrant@maquina1:~$ sudo cfdisk -z /dev/vdb
vagrant@maquina1:~$ sudo cfdisk -z /dev/vdc
vagrant@maquina1:~$ sudo cfdisk -z /dev/vdd
vagrant@maquina1:~$ sudo cfdisk -z /dev/vde
- Y vamos a crear el sisitema de ficheros de cada una.
vagrant@maquina1:~$ sudo mkfs.btrfs /dev/vdb1
btrfs-progs v5.10.1
See http://btrfs.wiki.kernel.org for more information.
Label: (null)
UUID: 4c153d30-5d89-4342-a2c0-d5429b449f12
Node size: 16384
Sector size: 4096
Filesystem size: 1022.98MiB
Block group profiles:
Data: single 8.00MiB
Metadata: DUP 51.12MiB
System: DUP 8.00MiB
SSD detected: no
Incompat features: extref, skinny-metadata
Runtime features:
Checksum: crc32c
Number of devices: 1
Devices:
ID SIZE PATH
1 1022.98MiB /dev/vdb1
RAID con btrfs
- Ya tenemos nuestros discos montandos con btrfs, ahora vamos a montar un RAID con ellos usando este sistema de archivos, para ello tendremos que instalar un paquete necesario para ello.
vagrant@maquina1:~$ sudo apt install btrfs-progs
- A continuación crearemos el raid usando el siguiente comando, podriamos crear el raid sin necesidad de haber montando con btrfs las particiones anteriormente:
vagrant@maquina1:~$ sudo mkfs.btrfs -L prueba -d raid5 -m raid5 -f /dev/vdb /dev/vdc /dev/vdd
btrfs-progs v5.10.1
See http://btrfs.wiki.kernel.org for more information.
Label: prueba
UUID: 67a68e3c-2efd-4739-8e2f-5f7b8805dd43
Node size: 16384
Sector size: 4096
Filesystem size: 3.00GiB
Block group profiles:
Data: RAID5 204.75MiB
Metadata: RAID5 170.62MiB
System: RAID5 16.00MiB
SSD detected: no
Incompat features: extref, raid56, skinny-metadata
Runtime features:
Checksum: crc32c
Number of devices: 3
Devices:
ID SIZE PATH
1 1.00GiB /dev/vdb
2 1.00GiB /dev/vdc
3 1.00GiB /dev/vdd
vagrant@maquina1:~$ sudo btrfs filesystem show
warning, device 2 is missing
Label: none uuid: 67a68e3c-2efd-4739-8e2f-5f7b8805dd43
Total devices 2 FS bytes used 128.00KiB
devid 1 size 1.00GiB used 212.75MiB path /dev/vdc
devid 2 size 1.00GiB used 212.75MiB path /dev/vdb
devid 3 size 1.00GiB used 195.69MiB path /dev/vdd
Label: none uuid: ad71b7ff-a997-423a-b3f4-5e704e6af0e9
Total devices 3 FS bytes used 128.00KiB
devid 3 size 1.00GiB used 264.00MiB path /dev/vdd
*** Some devices missing
- Ahora montaremos uno de los discos donde escojamos, en mi caso en una carpeta que he creado en
mnt
vagrant@maquina1:~$ sudo mount /dev/vdb /mnt/raid/
- Y como podemos comprobar el RAID está montado ya en esta carpeta, puede verse que al hacer un
df
este disco tiene 2GB debido a que está usando el RAID que hemos creado con anterioridad.
vagrant@maquina1:~$ sudo df -h /mnt/raid/
ilesystem Size Used Avail Use% Mounted on
/dev/vdb 3.0G 3.4M 1.9G 1% /mnt/raid
- Con el siguiente comando podremos ver mucha mas información detallada, como espacio disponible, espacio total, etc…
vagrant@maquina1:~$ sudo btrfs filesystem usage /mnt/raid
Overall:
Device size: 3.00GiB
Device allocated: 587.06MiB
Device unallocated: 2.43GiB
Device missing: 0.00B
Used: 384.00KiB
Free (estimated): 1.82GiB (min: 1.82GiB)
Free (statfs, df): 1.82GiB
Data ratio: 1.50
Metadata ratio: 1.50
Global reserve: 3.25MiB (used: 0.00B)
Multiple profiles: no
Data,RAID5: Size:204.75MiB, Used:128.00KiB (0.06%)
/dev/vdb 102.38MiB
/dev/vdc 102.38MiB
/dev/vdd 102.38MiB
Metadata,RAID5: Size:170.62MiB, Used:112.00KiB (0.06%)
/dev/vdb 85.31MiB
/dev/vdc 85.31MiB
/dev/vdd 85.31MiB
System,RAID5: Size:16.00MiB, Used:16.00KiB (0.10%)
/dev/vdb 8.00MiB
/dev/vdc 8.00MiB
/dev/vdd 8.00MiB
Unallocated:
/dev/vdb 828.31MiB
/dev/vdc 828.31MiB
/dev/vdd 828.31MiB
- Si queremos añadir un disco es un comando simple, usamos btrfs y añadimos un
device add
con el disco que queremos añadir y la ruta de montaje que escogimos.
vagrant@maquina1:~$ sudo btrfs device add -f /dev/vde /mnt/raid/
vagrant@maquina1:~$ sudo btrfs filesystem show
Label: 'prueba' uuid: 67a68e3c-2efd-4739-8e2f-5f7b8805dd43
Total devices 3 FS bytes used 256.00KiB
devid 1 size 1.00GiB used 212.75MiB path /dev/vdb
devid 2 size 1.00GiB used 212.75MiB path /dev/vdc
devid 3 size 1.00GiB used 0.00B path /dev/vdd
- Vemos que se ha añadido correctamente, sin embargo el uso del mismo está a 0, para solucionarlo tenemos que balancear la carga entre los tres dispositivos.
vagrant@maquina1:~$ sudo btrfs balance start --full-balance /mnt/raid/
Done, had to relocate 3 out of 3 chunks
vagrant@maquina1:~$ sudo btrfs filesystem show
Label: 'prueba' uuid: 67a68e3c-2efd-4739-8e2f-5f7b8805dd43
Total devices 3 FS bytes used 256.00KiB
devid 1 size 1.00GiB used 320.00MiB path /dev/vdb
devid 2 size 1.00GiB used 320.00MiB path /dev/vdc
devid 3 size 1.00GiB used 320.00MiB path /dev/vdd
- Y por si queremos eliminar uno de los discos.
vagrant@maquina1:/mnt/raid$ sudo btrfs device remove /dev/vdb /mnt/raid/
vagrant@maquina1:/mnt$ sudo btrfs filesystem show
Label: 'prueba' uuid: 67a68e3c-2efd-4739-8e2f-5f7b8805dd43
Total devices 2 FS bytes used 256.00KiB
devid 2 size 1.00GiB used 448.00MiB path /dev/vdc
devid 3 size 1.00GiB used 448.00MiB path /dev/vdd
- Para que el montaje sea persistente lo añadimos al fstab, teniendo en cuenta que el UUID que pondremos será el del raid, aunque también podriamos montar uno de los discos y se montaría el raid entero como hicimos anteriormente.
UUID=67a68e3c-2efd-4739-8e2f-5f7b8805dd43 /mnt/raid auto defaults 0 0
- Para ver el errores en el raid podemos iniciar el comprobador de errores.
vagrant@maquina1:/mnt$ sudo btrfs scrub status raid/
scrub started on raid/, fsid 67a68e3c-2efd-4739-8e2f-5f7b8805dd43 (pid=1271)
- Y seguidamente veremos su estado. .
vagrant@maquina1:/mnt$ sudo btrfs scrub status raid/
UUID: 67a68e3c-2efd-4739-8e2f-5f7b8805dd43
Scrub started: Wed Jan 5 09:44:34 2022
Status: finished
Duration: 0:00:00
Total to scrub: 256.00KiB
Rate: 0.00B/s
Error summary: no errors found
- Si un disco fallara la sistitución es muy sencilla, vamos a hacerla con uno de los discos.
vagrant@maquina1:~$ sudo btrfs replace start /dev/vdc /dev/vde /mnt/raid/
- Comprobamos que el disco vdc se ha cambiado por el vde.
vagrant@maquina1:~$ sudo btrfs filesystem show
Label: 'prueba' uuid: 67a68e3c-2efd-4739-8e2f-5f7b8805dd43
Total devices 3 FS bytes used 256.00KiB
devid 1 size 1.00GiB used 219.69MiB path /dev/vdb
devid 2 size 1.00GiB used 219.69MiB path /dev/vde
devid 3 size 1.00GiB used 219.69MiB path /dev/vdd
- Y si quisieramos reparar una unidad dañada podemos usar el siguiente comando:
vagrant@maquina1:~$ sudo mount -o recovery /dev/vdb /mnt/raid/
Ventajas e inconvientes de btrfs sobre mdadm
-
Las mayor ventaja que tiene btrfs frente a un raid convencional con mdadm es que debido a la suma de verificación que realiza este sistema de ficheros le permite identificar las copias de un bloque que son incorrectas y esto lo hace un sistema muuchisimo más seguro.
-
Otra ventaja que tenemos es que el espejo es por archivo, por lo que podríamos tener archivos sin duplicar si quisieramos dentro del raid.
-
La desventaja por supuesto es la velocidad, mayor seguridad requieren más cálculos, por ello un sistema btrfs va a ser siempre más lento, así que deberíamos priorizar que queremos en nuestro sistema.
Pruebas de funcionalidades
- Existen dos formas de compresion al vuelo en btrfs, ZLIB y LZO. Estás nos permiten tener los archivos comprimidos, pero a la hora de leerlos se descomprimen automáticamente y seguidamente volverán a comprimirse automáticamente. la diferencia entre las dos es la capacidad de compresión, ZLIB comprime más, pero por ellos consume más recursos. vamos a hacer una prueba de funcionamiento con el disco que tenemos libre, el cual tendrá que estar formateado con btrfs, usando ZLIB.
vagrant@maquina1:/mnt$ sudo mount -o compress=zlib /dev/vdc1 pruebas/
- Tenemos un volumen de 1 GB montando
vagrant@maquina1:/mnt$ sudo btrfs filesystem show pruebas/
Label: none uuid: f57b08cf-9272-4466-9c9e-b06235ad4c49
Total devices 1 FS bytes used 128.00KiB
devid 1 size 1022.98MiB used 126.25MiB path /dev/vdc1
- Vamos a comprobar como este dispositivo puede almacenar mas información de la que permite ya que esta se comprime. vamos a usar el comando dd para introducir información.
root@maquina1:/mnt/pruebas# dd if=/dev/zero of=/mnt/pruebas/fichero
54011523+0 records in
54011523+0 records out
27653899776 bytes (28 GB, 26 GiB) copied, 449.968 s, 61.5 MB/s
- Como podemos comprobar, aunque nuestro disco es de 1 GB ha podido almacenar un fichero de 26GB.
root@maquina1:/mnt/pruebas# ls -la
total 27005784
drwxr-xr-x 1 root root 14 Jan 5 11:51 .
drwxr-xr-x 4 root root 4096 Jan 5 11:44 ..
-rw-r--r-- 1 root root 27653899776 Jan 5 11:58 fichero
root@maquina1:/mnt/pruebas# du -h
26G .
- Vemos que esos 26GB están ocupando casi todo el dispositivo.
root@maquina1:/mnt/pruebas# btrfs filesystem show /mnt/pruebas/
Label: none uuid: f57b08cf-9272-4466-9c9e-b06235ad4c49
Total devices 1 FS bytes used 874.29MiB
devid 1 size 1022.98MiB used 1021.94MiB path /dev/vdc1
- Hay otra funcionalidad llamada copy on write, una técnica que hace que al hacer copias de ficheros y no tener cambios aparentes de ningún tipo. En realidad se mostraría el fichero original, aunque tengamos una copia, esta no ocupa espacio y apenas tarda tiempo en hacerse, vamos a hacer una prueba, si copiamos un fichero que creemos de unos 2GB este debería aumentar el espacio usado y la copia no sería practicamente instantanea. Esto no sucede con COW.
root@maquina1:/mnt/pruebas# time cp --reflink=always copia1 copia/copia2
real 0m0.329s
user 0m0.002s
sys 0m0.083s
root@maquina1:/mnt/pruebas# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vdc1 1023M 102M 820M 11% /mnt/pruebas
- Pasemos a la deduplicación, esto permite al sistema eliminar bloques de datos duplicados o redundantes, para usarlo primero debemos instalar la herramienta necesaria,
root@maquina1:/mnt/pruebas# apt install duperemove
- He creado otro fichero que he duplicado, veamos el espacio en disco.
root@maquina1:/mnt/pruebas# btrfs filesystem show /mnt/pruebas/
Label: none uuid: f57b08cf-9272-4466-9c9e-b06235ad4c49
Total devices 1 FS bytes used 129.23MiB
devid 1 size 1022.98MiB used 354.25MiB path /dev/vdc1
- Pasemos ahora el duperemove.
root@maquina1:/mnt/pruebas# duperemove -dr .
- Notamos que los ficheros siguen ahí pero el espacio disponible ha subido.
root@maquina1:/mnt/pruebas# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vdc1 1023M 33M 892M 4% /mnt/pruebas
- Una vez visto esta característica podemos pasar al cifrado. para ello instalamos el siguiente paquete:
root@maquina1:/mnt/pruebas# apt install cryptsetup
- Ahora crearemos un fichero con clave de encriptación para el disco.
root@maquina1:/mnt/pruebas# dd if=/dev/random of=/root/KeyFile bs=1 count=4096
4096+0 records in
4096+0 records out
4096 bytes (4.1 kB, 4.0 KiB) copied, 0.0165403 s, 248 kB/s
- Hemos desmontado el disco que estabamos usando antes, para encryptarlo usamos el siguiente comando:
root@maquina1:/mnt# cryptsetup luksFormat --key-file /root/KeyFile /dev/vdc1
WARNING: Device /dev/vdc1 already contains a 'btrfs' superblock signature.
WARNING!
========
This will overwrite data on /dev/vdc1 irrevocably.
Are you sure? (Type 'yes' in capital letters): YES
- Y ya tendríamos nuestro disco enciptado.