Sistemas de ficheros avanzados. Btrfs.
Warning: This information may be outdated. Please note the date of the post.
ZFS/Btrfs
Son sistemas de archivos de alto rendimiento.
En este post hablaremos sobre Btrfs, que es el que hemos elegido para la práctica.
Btrfs lo desarrolló Oracle Corporation para GNU/Linux. Surge con el objetivo de sustituir el sistema de archivos ZFS linux. Actualmente se considera estable. A diferencia del sistema original tiene una serie de caracteristicas que lo aventaja.
Se trata de un sistema completo de almacenamiento que no requiere otras herramientas pero podemos instalar btrfs-progs que es una herramienta adicional. Btrfs viene nativa en el kernel linux actualmente.
Btrfs tiene como caracteristicas similares a las de ZFS.
Caracteristicas avanzadas de ZFS:
- Consta de Copy on Write (CoW). Este sistema hace que al copiar un fichero, la copia no es más que una referencia o puntero del original(no cambian los rangos en los bloques a no ser que se modifique la copia).
- Permite la deduplicación.
- Cifrado propio.
- Permite la compresión. Almacena los ficheros comprimidos para optimizar el uso del espacio.
- Gestión de volúmenes. Permite gestionar volúmenes de forma independiente.
- Permite hacer snapshots de forma nativa.
- Tiene redundancia (RAID) sin necesidad de utilizar otro software como mdadm.
Como hemos dicho anteriormente, Btrfs prácticamente tiene las mismas caracteristicas excluyendo el cifrado propio.
Entorno de trabajo: Escenario.
Crea un escenario que incluya una máquina y varios discos asociados a ella.
Vamos a crear una mv en Vagrant con Virtualbox, que contendrá 5 discos y el SO será Debian Buster.
disk = './tmp/hdd21.vdi'
disk2 = './tmp/hdd22.vdi'
disk3 = './tmp/hdd23.vdi'
disk4 = './tmp/hdd24.vdi'
disk5 = './tmp/hdd25.vdi'
Vagrant.configure("2") do |config|
config.vm.box = "debian/buster64"
config.vm.hostname = "btrfs2"
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 1
#Añadir discos
if not File.exist?(disk)
vb.customize ['createhd', '--filename', disk, '--size', 1 * 1024]
end
vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', disk]
if not File.exist?(disk)
vb.customize ['createhd', '--filename', disk2, '--size', 1 * 1024]
end
vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 2, '--device', 0, '--type', 'hdd', '--medium', disk2]
if not File.exist?(disk)
vb.customize ['createhd', '--filename', disk3, '--size', 1 * 1024]
end
vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 3, '--device', 0, '--type', 'hdd', '--medium', disk3]
if not File.exist?(disk)
vb.customize ['createhd', '--filename', disk4, '--size', 1 * 1024]
end
vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 4, '--device', 0, '--type', 'hdd', '--medium', disk4]
if not File.exist?(disk)
vb.customize ['createhd', '--filename', disk5, '--size', 1 * 1024]
end
vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 5, '--device', 0, '--type', 'hdd', '--medium', disk5]
end
end
Una vez dentro de la mv vamos a ejecutar ‘lsblk’ para ver que los discos están disponibles.
vagrant@btrfs2:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 19.8G 0 disk
├─sda1 8:1 0 18.8G 0 part /
├─sda2 8:2 0 1K 0 part
└─sda5 8:5 0 1021M 0 part [SWAP]
sdb 8:16 0 1G 0 disk
sdc 8:32 0 1G 0 disk
sdd 8:48 0 1G 0 disk
sde 8:64 0 1G 0 disk
sdf 8:80 0 1G 0 disk
Instala si es necesario el software de ZFS/Btrfs.
Instalamos el software necesario si no viene incluido de la siguiente forma.
sudo apt install btrfs-tools
Gestiona los discos adicionales con ZFS/Btrfs.
En esta practica vamos a montar un Raid 5 con los tres primeros discos y dejaremos los dos últimos para sustituirlos en caso de fallo de alguno de ellos.
¡!
Todos los discos son de 1 GB pero podríamos tener discos de diferente tamaño para comprobar que al montar el RAID aprobecha todo el espacio posible y no pone un máximo o una quota como lo hace mdadm de la forma tradicional. En este caso como todos son de 1Gb no se verá esta característica, pero es importante mencionarla.
Formatear sdb a btrfs
Vamos a crear un sistema de ficheros btrfs sobre sdb
mkfs.btrfs /dev/sdb
root@btrfs2:/home/vagrant# mkfs.btrfs /dev/sdb
btrfs-progs v4.20.1
See http://btrfs.wiki.kernel.org for more information.
Label: (null)
UUID: 0f50eb6d-5c33-4633-b2d7-a2dbcaac8d9b
Node size: 16384
Sector size: 4096
Filesystem size: 1.00GiB
Block group profiles:
Data: single 8.00MiB
Metadata: DUP 51.19MiB
System: DUP 8.00MiB
SSD detected: no
Incompat features: extref, skinny-metadata
Number of devices: 1
Devices:
ID SIZE PATH
1 1.00GiB /dev/sdb
Comprobamos que se ha definido correctamente
root@btrfs2:/home/vagrant# lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
├─sda1 ext4 983742b1-65a8-49d1-a148-a3865ea09e24 16.1G 7% /
├─sda2
└─sda5 swap 04559374-06db-46f1-aa31-e7a4e6ec3286 [SWAP]
sdb btrfs 0f50eb6d-5c33-4633-b2d7-a2dbcaac8d9b
sdc
sdd
sde
sdf
Soporte en dos dispositivos (pool de almacenamiento)
Extenderemos el almacenamiento al disco sdc y comprobamos que funciona correctamente montandolo en un directorio.
root@btrfs2:/home/vagrant# sudo mkfs.btrfs -f /dev/sdb /dev/sdc
btrfs-progs v4.20.1
See http://btrfs.wiki.kernel.org for more information.
Label: (null)
UUID: 86b2529f-b1a8-4937-8bbc-71666a87c24b
Node size: 16384
Sector size: 4096
Filesystem size: 2.00GiB
Block group profiles:
Data: RAID0 204.75MiB
Metadata: RAID1 102.38MiB
System: RAID1 8.00MiB
SSD detected: no
Incompat features: extref, skinny-metadata
Number of devices: 2
Devices:
ID SIZE PATH
1 1.00GiB /dev/sdb
2 1.00GiB /dev/sdc
Vemos que se ha montado correctamente y que el UUID es el mismo. Lo interpreta como RAID0 /RAID1. Une los dos discos como si fueran uno.
root@btrfs2:/home/vagrant# mkdir /btrfs
root@btrfs2:/home/vagrant# mount /dev/sdb /btrfs/
root@btrfs2:/home/vagrant# lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
├─sda1 ext4 983742b1-65a8-49d1-a148-a3865ea09e24 16.1G 7% /
├─sda2
└─sda5 swap 04559374-06db-46f1-aa31-e7a4e6ec3286 [SWAP]
sdb btrfs 86b2529f-b1a8-4937-8bbc-71666a87c24b 1.8G 1% /btrfs
sdc btrfs 86b2529f-b1a8-4937-8bbc-71666a87c24b
sdd
sde
sdf
Ahora vamos a desmontarlo y crearemos el raid 5 en los tres primeros discos.
Configura los discos en RAID, haciendo pruebas de fallo de algún disco y sustitución, restauración del RAID. Comenta ventajas e inconvenientes respecto al uso de RAID software con mdadm.
Creamos raid5 con btrfs, le indicaremos que es un RAID5 de la siguiente forma.
root@btrfs2:/home/vagrant# mkfs.btrfs -d raid5 -m raid5 -f /dev/sdb /dev/sdc /dev/sdd
btrfs-progs v4.20.1
See http://btrfs.wiki.kernel.org for more information.
Label: (null)
UUID: 76597d6f-6564-4468-9f6d-2d4f1de13a39
Node size: 16384
Sector size: 4096
Filesystem size: 3.00GiB
Block group profiles:
Data: RAID5 204.75MiB
Metadata: RAID5 204.75MiB
System: RAID5 16.00MiB
SSD detected: no
Incompat features: extref, raid56, skinny-metadata
Number of devices: 3
Devices:
ID SIZE PATH
1 1.00GiB /dev/sdb
2 1.00GiB /dev/sdc
3 1.00GiB /dev/sdd
Vemos los dispositivos de bloques en el que el uuid es el mismo y pertenece a los tres discos.
root@btrfs2:/home/vagrant# btrfs filesystem show
Label: none uuid: 76597d6f-6564-4468-9f6d-2d4f1de13a39
Total devices 3 FS bytes used 128.00KiB
devid 1 size 1.00GiB used 212.75MiB path /dev/sdb
devid 2 size 1.00GiB used 212.75MiB path /dev/sdc
devid 3 size 1.00GiB used 212.75MiB path /dev/sdd
Montamos uno de los discos del raid y comprobamos su capacidad.
root@btrfs2:/home/vagrant# mount /dev/sdb /btrfs/
root@btrfs2:/home/vagrant# df -h
Filesystem Size Used Avail Use% Mounted on
udev 480M 0 480M 0% /dev
tmpfs 99M 2.9M 96M 3% /run
/dev/sda1 19G 1.4G 17G 8% /
tmpfs 494M 0 494M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 494M 0 494M 0% /sys/fs/cgroup
tmpfs 99M 0 99M 0% /run/user/1000
/dev/sdb 3.0G 17M 2.6G 1% /btrfs
Como se puede apreciar tiene un total de 3GB , la suma de los tres discos.
Debemos saber que hay una utilidad, SCRUB de btrfs, que se utiliza pra limpiar el sistema de archivos btrfs. Lee los dispositivos de bloque y verifica las sumas de su comprobación, en otras palabras comprueba que no hay errores, y repara los bloques dañados si hay una copia correcta disponible.
De la siguiente forma comprobamos que todo está correcto.
root@btrfs2:/home/vagrant# btrfs scrub start /dev/sdb
scrub started on /dev/sdb, fsid 76597d6f-6564-4468-9f6d-2d4f1de13a39 (pid=5086)
root@btrfs2:/home/vagrant# btrfs scrub status /dev/sdb
scrub status for 76597d6f-6564-4468-9f6d-2d4f1de13a39
scrub started at Sat May 1 18:21:39 2021 and finished after 00:00:00
total bytes scrubbed: 0.00B with 0 errors
En este ejemplo no vamos a provocar un fallo como tal pero suponemos que uno de los discos está dañado, entonces procedemos a añadir uno de los discos adicionales para sustituirlo.
Comprobaremos que el tamaño a 4 gb ya que tenemos los 4 discos.
root@btrfs2:/home/vagrant# btrfs device add /dev/sde /btrfs
root@btrfs2:/home/vagrant# lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
├─sda1 ext4 983742b1-65a8-49d1-a148-a3865ea09e24 16.1G 7% /
├─sda2
└─sda5 swap 04559374-06db-46f1-aa31-e7a4e6ec3286 [SWAP]
sdb btrfs 76597d6f-6564-4468-9f6d-2d4f1de13a39 3.1G 0% /btrfs
sdc btrfs 76597d6f-6564-4468-9f6d-2d4f1de13a39
sdd btrfs 76597d6f-6564-4468-9f6d-2d4f1de13a39
sde btrfs 76597d6f-6564-4468-9f6d-2d4f1de13a39
sdf
root@btrfs2:/home/vagrant# df -h
Filesystem Size Used Avail Use% Mounted on
udev 480M 0 480M 0% /dev
tmpfs 99M 2.9M 96M 3% /run
/dev/sda1 19G 1.4G 17G 8% /
tmpfs 494M 0 494M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 494M 0 494M 0% /sys/fs/cgroup
tmpfs 99M 0 99M 0% /run/user/1000
/dev/sdb 4.0G 17M 3.2G 1% /btrfs
Vemos los discos actuales.
root@btrfs2:/home/vagrant# btrfs filesystem show
Label: none uuid: 76597d6f-6564-4468-9f6d-2d4f1de13a39
Total devices 4 FS bytes used 256.00KiB
devid 1 size 1.00GiB used 364.75MiB path /dev/sdb
devid 2 size 1.00GiB used 364.75MiB path /dev/sdc
devid 3 size 1.00GiB used 364.75MiB path /dev/sdd
devid 4 size 1.00GiB used 0.00B path /dev/sde
Eliminamos el disco que tiene el fallo por ejemplo el sdc y comprobamos que usa el nuevo disco sde
root@btrfs2:/home/vagrant# btrfs device delete /dev/sdc /btrfs/
root@btrfs2:/home/vagrant# btrfs filesystem show
Label: none uuid: 76597d6f-6564-4468-9f6d-2d4f1de13a39
Total devices 3 FS bytes used 320.00KiB
devid 1 size 1.00GiB used 320.00MiB path /dev/sdb
devid 3 size 1.00GiB used 320.00MiB path /dev/sdd
devid 4 size 1.00GiB used 320.00MiB path /dev/sde
Vemos que actualmente tenemos ocupados (sdb, sdd, sde)
vagrant@btrfs2:~$ lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
├─sda1
│ ext4 983742b1-65a8-49d1-a148-a3865ea09e24 16.1G 7% /
├─sda2
│
└─sda5
swap 04559374-06db-46f1-aa31-e7a4e6ec3286 [SWAP]
sdb btrfs 76597d6f-6564-4468-9f6d-2d4f1de13a39
sdc
sdd btrfs 76597d6f-6564-4468-9f6d-2d4f1de13a39
sde btrfs 76597d6f-6564-4468-9f6d-2d4f1de13a39
sdf
Realiza ejercicios con pruebas de funcionamiento de las principales funcionalidades: compresión, cow, deduplicación, cifrado, etc.
Compresion al vuelo
Se trata de almacenar la información comprimida, de foma que hacer la lectura el sistema es capaz de descomprimirla en ese mismo momento. La compresión se realiza archivo por archivo. Hay tres algoritmos disponibles ZLIB, LZO y ZSTD. El método predeterminado utliza el algoritmo ZLIB.
Para ello vamos a utilzar el disco sdf, le damos formato y lo montamos en un directorio aparte.
sudo mkfs.btrfs /dev/sdf
vagrant@btrfs2:~$ mkdir compresion
Ahora relizamos la compresión al vuelo
sudo mount -o compress=zlib /dev/sdf compresion/
Vemos que se ha montado correctamente
vagrant@btrfs2:~$ lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
├─sda1 ext4 983742b1-65a8-49d1-a148-a3865ea09e24 16.1G 7% /
├─sda2
└─sda5 swap 04559374-06db-46f1-aa31-e7a4e6ec3286 [SWAP]
sdb btrfs 76597d6f-6564-4468-9f6d-2d4f1de13a39
sdc
sdd btrfs 76597d6f-6564-4468-9f6d-2d4f1de13a39
sde btrfs 76597d6f-6564-4468-9f6d-2d4f1de13a39
sdf btrfs feef8097-1952-4633-ac08-04dd1eeee2f6 904.6M 2% /home/vagrant/compresion
Ahora vamos a introducir algunos ficheros para ver que puede almacenar más información ya que la comprime. Esto se demora unos minutos ya que está introduciendo datos hasta que se quede sin espacio.
El disco es de 1G por lo que introduciremos información con la utlidad dd.
vagrant@btrfs2:~$ sudo dd if=/dev/zero of=compresion/info
dd: writing to 'compresion/info': No space left on device
44332355+0 records in
44332354+0 records out
22698165248 bytes (23 GB, 21 GiB) copied, 152.189 s, 149 MB/s
Comprobamos el tamaño de la información comprimida que ocupa en este caso 22G
vagrant@btrfs2:~/compresion$ ls -la
total 22166200
drwxr-xr-x 1 root root 8 May 3 15:11 .
drwxr-xr-x 4 vagrant vagrant 4096 May 3 15:04 ..
-rw-r--r-- 1 root root 22698165248 May 3 15:14 info
vagrant@btrfs2:~/compresion$ du -hs
22G .
vagrant@btrfs2:~/compresion$ du
22166196 .
vagrant@btrfs2:~/compresion$ du -hs info
22G info
Comprobamos que el disco sigue siendo de 1G
vagrant@btrfs2:~/compresion$ sudo btrfs filesystem show /home/vagrant/compresion
Label: none uuid: feef8097-1952-4633-ac08-04dd1eeee2f6
Total devices 1 FS bytes used 709.50MiB
devid 1 size 1.00GiB used 1023.00MiB path /dev/sdf
Como conclusión podemos entender que el espacio está mejor aprovechado ya que la compresion la realiza al momento de introducir la información.
Cow

Btrfs utiliza Copy on Write. Esta técnica permite hacer copias a los ficheros pero de forma distinta. Consiste en tener los archivos aparentemente copiados pero estos son simplemente punteros hacia el original, no es un enlace tampoco, ya que al modificar una copia se crean dispositivos de bloques nuevos a partir de los ya creados. Pero los primeros dispositivos de bloques del fichero al hacer la ‘copia’ son los mismos en cada fichero copiado al original.
Con todo esto quiero decir que al hacer la copia del fichero si no se modifica la copia, el espacio consumido no aumenta al copiar sino al modificar el fichero copiado. Lo comprobamos de la siguiente forma.
Usaremos el disco sdf, que hemos utlizado antes pero antes hemos borrado la información del ejercicio anterior.
Creamos el fichero de prueba
vagrant@btrfs2:~/compresion$ sudo nano prueba.txt
vagrant@btrfs2:~/compresion$ ls -l
total 4
-rw-r--r-- 1 root root 14 May 3 15:43 prueba.txt
Vemos el espacio ocupado en el disco
vagrant@btrfs2:~/compresion$ df -h | grep 'sdf'
/dev/sdf 1.0G 17M 681M 3% /home/vagrant/compresion
Hacemos la copia con el parámetro –reflink
vagrant@btrfs2:~/compresion$ sudo cp --reflink=always prueba.txt copia.txt
vagrant@btrfs2:~/compresion$ df -h | grep 'sdf'
/dev/sdf 1.0G 17M 681M 3% /home/vagrant/compresion
Comprobamos que no ha ocupado más espacio.
¿COMO VER LOS BLOQUES OCUPADOS?
Vemos que los dispositivos de bloques son los mismos
vagrant@btrfs2:~/compresion$ sudo btrfs filesystem df /home/vagrant/compresion
Data, single: total=224.00MiB, used=128.00KiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=163.19MiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B
vagrant@btrfs2:~/compresion$ sudo btrfs filesystem du /home/vagrant/compresion
Total Exclusive Set shared Filename
0.00B 0.00B - /home/vagrant/compresion/prueba.txt
0.00B 0.00B - /home/vagrant/compresion/copia.txt
0.00B 0.00B - /home/vagrant/compresion/copia2.txt
0.00B 0.00B 0.00B /home/vagrant/compresion
vagrant@btrfs2:~/compresion$ sudo btrfs filesystem usage /home/vagrant/compresion
Overall:
Device size: 1.00GiB
Device allocated: 566.38MiB
Device unallocated: 457.62MiB
Device missing: 0.00B
Used: 384.00KiB
Free (estimated): 681.50MiB (min: 452.69MiB)
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 16.00MiB (used: 0.00B)
Data,single: Size:224.00MiB, Used:128.00KiB
/dev/sdf 224.00MiB
Metadata,DUP: Size:163.19MiB, Used:112.00KiB
/dev/sdf 326.38MiB
System,DUP: Size:8.00MiB, Used:16.00KiB
/dev/sdf 16.00MiB
Unallocated:
Redimension de discos
Podemos aumentar o disminuir el tamaño del disco en caliente.
Lo podemos hacer con el disco sdf
vagrant@btrfs2:~$ sudo btrfs filesystem show /home/vagrant/compresion/
Label: none uuid: feef8097-1952-4633-ac08-04dd1eeee2f6
Total devices 1 FS bytes used 68.54MiB
devid 1 size 1.00GiB used 566.38MiB path /dev/sdf
Reducción:
vagrant@btrfs2:~$ sudo btrfs filesystem resize -400m /home/vagrant/compresion/
Resize '/home/vagrant/compresion/' of '-400m'
vagrant@btrfs2:~$ sudo btrfs filesystem show /home/vagrant/compresion/
Label: none uuid: feef8097-1952-4633-ac08-04dd1eeee2f6
Total devices 1 FS bytes used 68.54MiB
devid 1 size 624.00MiB used 342.38MiB path /dev/sdf
Aumento:
vagrant@btrfs2:~$ sudo btrfs filesystem resize +300m /home/vagrant/compresion/
Resize '/home/vagrant/compresion/' of '+300m'
vagrant@btrfs2:~$ sudo btrfs filesystem show /home/vagrant/compresion/
Label: none uuid: feef8097-1952-4633-ac08-04dd1eeee2f6
Total devices 1 FS bytes used 68.47MiB
devid 1 size 924.00MiB used 342.38MiB path /dev/sdf
Fragmentación

Para hacer una Fragmentación ejecutamos lo siguiente
vagrant@btrfs2:~$ sudo btrfs filesystem defragment -r /home/vagrant/compresion/
vagrant@btrfs2:~$ sudo btrfs filesystem show /home/vagrant/compresion/
Label: none uuid: feef8097-1952-4633-ac08-04dd1eeee2f6
Total devices 1 FS bytes used 68.47MiB
devid 1 size 924.00MiB used 342.38MiB path /dev/sdf
El cifrado no lo soporta btrfs
Snapshots con Btrfs
Un snapshots en este caso es una instantánea de un dispositivo de almacenamiento.
Una vez tenemos formateado el disco en btrfs. Usaremos el disco sdf.
Tenemos que crear subvolúmenes.
Creacion de subvolúmenes
# Creamos el directorio donde vamos a montar el disco
vagrant@btrfs2:~$ mkdir puntodemontaje
# Montamos el volumen
vagrant@btrfs2:~$ sudo mount /dev/sdf /home/vagrant/puntodemontaje/
# Comprobamos que se ha montado correctamente
vagrant@btrfs2:~$ lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
├─sda1 ext4 983742b1-65a8-49d1-a148-a3865ea09e24 15.2G 12% /
├─sda2
└─sda5 swap 04559374-06db-46f1-aa31-e7a4e6ec3286 [SWAP]
sdb btrfs 76597d6f-6564-4468-9f6d-2d4f1de13a39
sdc
sdd btrfs 76597d6f-6564-4468-9f6d-2d4f1de13a39
sde btrfs 76597d6f-6564-4468-9f6d-2d4f1de13a39
sdf btrfs feef8097-1952-4633-ac08-04dd1eeee2f6 736.4M 9% /home/vagrant/puntodemontaje
# Creamos el subvolumen 1 y el subvolumen 2
vagrant@btrfs2:~$ sudo btrfs subvolume create puntodemontaje/sub1
Create subvolume 'puntodemontaje/sub1'
vagrant@btrfs2:~$ sudo btrfs subvolume create puntodemontaje/sub2
Create subvolume 'puntodemontaje/sub2'
# Introducimos dos ficheros en el sub1
vagrant@btrfs2:~/puntodemontaje/sub1$ ls
fichero2.txt fichero.txt
Creacion de instantánea
Ahora vamos a crear la instantánea del subvolumen 1, se comporta independientemente del subvolumen original, por lo que puede hacer lo que quiera sin afectar el original.
# Creamos una instantánea del sub1 en el sub2
vagrant@btrfs2:~$ sudo btrfs subvolume snapshot puntodemontaje/sub1/ puntodemontaje/sub2/snap_sub1
Create a snapshot of 'puntodemontaje/sub1/' in 'puntodemontaje/sub2/snap_sub1'
# Vemos que contiene los mismos ficheros que el sub1
vagrant@btrfs2:~$ ls -l puntodemontaje/sub2/snap_sub1/
total 8
-rw-r--r-- 1 root root 5 May 4 18:10 fichero2.txt
-rw-r--r-- 1 root root 13 May 4 18:09 fichero.txt
Si ocurriese algo y se ha realizado la instantánea anteriormente primero desmontamos el subvolumen que está dañado y luego montamos la instantánea en su lugar. Podríamos utilizar /etc/fstab para montarlo automáticamente.
# En este caso eliminamos el fichero.txt del sub1
vagrant@btrfs2:~$ sudo rm puntodemontaje/sub1/fichero.txt
vagrant@btrfs2:~$ ls puntodemontaje/sub1/
fichero2.txt
# listamos los subvolumentes y las instantaneas
vagrant@btrfs2:~$ sudo btrfs subvolume list /home/vagrant/puntodemontaje
ID 263 gen 245 top level 262 path sub1
ID 264 gen 246 top level 262 path sub2
ID 265 gen 245 top level 264 path sub2/snap_sub1
# Si queremos volver al punto anterior en el subvolumen 1 ponemos predeterminado la instantanea
vagrant@btrfs2:~$ sudo btrfs subvolume set-default 265 /home/vagrant/puntodemontaje/sub1
# Para que tenga que tenga efecto tenemos que desmontar y volver a montar el volumen
vagrant@btrfs2:~$ sudo umount /home/vagrant/puntodemontaje
vagrant@btrfs2:~$ sudo mount /dev/sdf /home/vagrant/puntodemontaje/
# Comprobamos que se ha montado directamente desde la instantánea
vagrant@btrfs2:~$ ls puntodemontaje/
fichero2.txt fichero.txt
Si listamos los subvolumenes comprobamos que guarda todos y cada uno de ellos pudiendo recuperar el que más nos convenga
Aquí estuve haciendo otras pruebas en otro directorio como se p uede apreciar.
vagrant@btrfs2:~$ sudo btrfs subvolume list /home/vagrant/puntodemontaje
ID 258 gen 231 top level 5 path sub1
ID 259 gen 236 top level 5 path sub2
ID 260 gen 231 top level 258 path sub1/snapshot1
ID 261 gen 236 top level 5 path sub3
ID 262 gen 242 top level 261 path sub3/snapshot2
ID 263 gen 247 top level 262 path sub3/snapshot2/sub1
ID 264 gen 246 top level 262 path sub3/snapshot2/sub2
ID 265 gen 245 top level 264 path sub3/snapshot2/sub2/snap_sub1
Si queremos recuperar los directorios solo tenemos que hacer el mismo procedimiento.
vagrant@btrfs2:~$ sudo btrfs subvolume set-default 262 /home/vagrant/puntodemontaje/
vagrant@btrfs2:~$ sudo umount /home/vagrant/puntodemontaje
vagrant@btrfs2:~$ sudo mount /dev/sdf /home/vagrant/puntodemontaje/
vagrant@btrfs2:~$ ls puntodemontaje/
hola.txt sub1 sub2
vagrant@btrfs2:~/puntodemontaje$ tree
.
├── hola.txt
├── sub1
│ └── fichero2.txt
└── sub2
└── snap_sub1
├── fichero2.txt
└── fichero.txt
3 directories, 4 files
Fuentes
https://www.oracle.com/technical-resources/articles/it-infrastructure/admin-advanced-btrfs.html https://wiki.archlinux.org/title/btrfs#Copy-on-Write_(CoW)