Entendiendo el sistema de archivos Btrfs en Fedora Linux

B-Tree Filesystem (Btrfs) es un sistema de archivos de copia en escritura (CoW) para sistemas operativos Linux. Los usuarios de Fedora conocieron Btrfs cuando el equipo del proyecto de Fedora lo convirtió en el sistema de archivos predeterminado para Fedora Workstation 33. No había pensado demasiado en Btrfs a pesar de que estaba disponible para Linux durante varios años. Este artículo lo pondrá al día con el sistema de archivos Btrfs y sus características como instantáneas, subvolúmenes y cuotas.

Btrfs

B-Tree Filesystem (Btrfs) es tanto un sistema de archivos como un administrador de volumen. Ha estado en desarrollo desde 2007 y, desde entonces, ha sido parte del kernel de Linux. Sus desarrolladores apuntan a crear un sistema de archivos moderno que pueda resolver los desafíos asociados con el escalado a grandes subsistemas de almacenamiento. Desde la página de manual de Btrfs, sus principales características se centran en la tolerancia a fallos, la facilidad de administración y la reparación.

Índice

Sistema de archivos Btrfs en Fedora Linux

Sus principales características son:

  • Instantáneas: instantáneas grabables y de solo lectura.
  • REDADA.
  • Autorreparación: sumas de comprobación para datos y metadatos.
  • Detección automática de corrupción de datos.
  • Subvolúmenes.
  • Conciencia de SSD.
  • Copias de seguridad incrementales eficientes

Puede obtener más información sobre sus funciones avanzadas y beneficios en la página de manual oficial de Btrfs.

Requisito previo

Si ya está ejecutando Fedora Workstation 33, entonces está listo para los siguientes pasos. De lo contrario, puede descargar la ISO oficial de Fedora Workstation e instalarla o ejecutarla en una nueva máquina virtual desde cualquier distribución de Linux que esté utilizando.

Al escribir este artículo, no me he encontrado con una herramienta gráfica para trabajar con Btrfs (¡las sugerencias son bienvenidas!). Por lo tanto, trabajaremos con la línea de comandos para la mayoría de las demostraciones de este artículo. Tienes que trabajar con Btrfs como superusuario para los siguientes pasos.

~]$ sudo su # change into super user mode

Puede examinar el formato Btrfs ejecutando el siguiente comando.

Echando un vistazo más de cerca al sistema de archivos Btrfs

Muestre el sistema de archivos Fedora Btrfs:

[root@fosslinux tuts]# btrfs filesystem show
Label: 'fedora_localhost-live' uuid: 688a6af2-77e1-4da4-bc63-878c5b0f063b
Total devices 1 FS bytes used 18.94GiB
devid 1 size 148.05GiB used 21.02GiB path /dev/sda2

Puede notar que la etiqueta del sistema de archivos es 'fedora_localhost-live'. Puede cambiar la etiqueta para representar una representación más precisa de su sistema, ya que no estamos ejecutando la versión USB en vivo de Fedora.

Cambio de etiquetas Btrfs:

Puede cambiar la etiqueta usando el comando btrfs filesystem label.

[root@fosslinux tuts]# btrfs filesystem label /
fedora_localhost-live
[root@fosslinux tuts]# btrfs filesystem label / fedoraworkstation33
[root@fosslinux tuts]# btrfs filesystem label /
fedoraworkstation33
[root@fosslinux tuts]#
Btrfs Fedora filesystem label
Btrfs subvolumes

Los subvolúmenes no son lo mismo que las particiones, pero se pueden comparar con las particiones y se usan de manera similar a como se usan las particiones. Un subvolumen es el directorio estándar que puede administrar Btrfs.

Puede utilizar un subvolumen para tomar instantáneas, establecer una cuota y replicarlo en otras ubicaciones y otros sistemas operativos host siempre que se ejecuten en el sistema de archivos Btrfs.

Enumere los subvolúmenes de Btrfs:

[root@fosslinux tuts]# btrfs subvolume list /
ID 256 gen 24421 top level 5 path home
ID 258 gen 24407 top level 5 path root
ID 265 gen 22402 top level 258 path var/lib/machines

Etiqueta del sistema de archivos Btrfs Fedora
Etiqueta del sistema de archivos Btrfs Fedora

Crear subvolumen:

Puede crear un nuevo subvolumen ejecutando el comando btrfs subvolume create.

[root@fosslinux tuts]# btrfs subvolume create /opt/foo
Create subvolume '/opt/foo'
[root@fosslinux tuts]# btrfs subvolume list /
ID 256 gen 24469 top level 5 path home
ID 258 gen 24469 top level 5 path root
ID 265 gen 22402 top level 258 path var/lib/machines
ID 279 gen 24469 top level 258 path opt/foo

Eliminar subvolumen:

Puede eliminar un subvolumen ejecutando el comando btrfs subvolume delete.

[root@fosslinux tuts]# btrfs subvolume delete /opt/foo
Delete subvolume (no-commit): '/opt/foo'
[root@fosslinux tuts]# btrfs subvolume list /
ID 256 gen 24495 top level 5 path home
ID 258 gen 24493 top level 5 path root
ID 265 gen 22402 top level 258 path var/lib/machines

Los subvolúmenes pueden resultar útiles para los administradores de sistemas, especialmente al agregar usuarios.

Agregar un usuario

Antes de Fedora Linux 33, la creación de una nueva cuenta de usuario crearía un directorio de inicio para la cuenta. Básicamente, el directorio de usuarios creado es un subdirectorio de / home. Significaba que la propiedad y los privilegios se adaptaron al propietario del directorio / home. También significó que no había funciones especiales para administrar el subdirectorio. Con Btrfs, tiene más control para administrar y aplicar restricciones a los directorios de usuarios creados.

La forma tradicional de agregar un nuevo usuario.

Agregue un nuevo usuario, 'fedoran1', usando el comando useradd:

[root@fosslinux tuts]# useradd fedoran1
[root@fosslinux tuts]# getent passwd fedoran1
fedoran1:x:1001:1001::/home/fedoran1:/bin/bash
[root@fosslinux tuts]# ls -l /home
total 0
drwx------. 1 fedoran1 fedoran1 80 Apr 7 19:00 fedoran1
drwx------. 1 tuts tuts 308 Apr 6 08:33 tuts
Uso de subvolúmenes Btrfs como hogares de usuarios

Puede acomodar subvolúmenes Btrfs como hogares de usuarios agregando –btrfs-subvolume-home al comando useradd. El comando creará un nuevo subvolumen Btrfs para el usuario.

[root@fosslinux tuts]# useradd --btrfs-subvolume-home fedoran2
Create subvolume '/home/fedoran2'
[root@fosslinux tuts]# getent passwd fedoran2
fedoran2:x:1002:1002::/home/fedoran2:/bin/bash

Si ejecuta el comando btrfs subvolume list / command, notará un nuevo subvolumen para el directorio de inicio del nuevo usuario.

[root@fosslinux tuts]# btrfs subvolume list /
ID 256 gen 24732 top level 5 path home
ID 258 gen 24731 top level 5 path root
ID 265 gen 22402 top level 258 path var/lib/machines
ID 280 gen 24728 top level 256 path home/fedoran2
Eliminar un usuario:

A veces, desea eliminar un usuario con todos los archivos del usuario y su directorio de inicio simultáneamente. Puede usar el comando userdel con la opción -r, que también eliminará el subvolumen Btrfs del usuario.

[root@fosslinux tuts]# userdel -r fedoran2
Delete subvolume (commit): '/home/fedoran2'

Cuotas de btrfs

¿Alguna vez ha tenido un programa que se salió de control y escribió en su disco hasta que se llenó todo el directorio / home? Estos problemas surgen, especialmente con aplicaciones o servidores que almacenan contenido y archivos de registro. Puede evitar que su sistema o servidor se detenga porque el disco se llena configurando e implementando cuotas de Btrfs.

El primer paso es habilitar cuotas en su sistema de archivos Btrfs:

[root@fosslinux tuts]# btrfs quota enable /

A continuación, anote el número de identificación del grupo de cuotas (qgroup) de cada subvolumen utilizando el comando btrfs subvolume list. Lo mejor sería asociar cada subvolumen con un qgroup en función de su número de identificación mediante el comando btrfs qgroup create. Puede hacer esto de forma individual, pero también puede utilizar el siguiente comando para acelerar la creación de qgroups para subvolúmenes.

>btrfs subvolume list <path> | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup destroy 0/{} <path>

En su Fedora 33, reemplace con la ruta raíz (/) de su sistema de archivos.

 # btrfs subvolume list / | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup create 0/{} /

Ejecute el comando btrfs quota rescan para ver los qgroups que ha creado.

[root@fosslinux tuts]# btrfs qgroup show /
WARNING: rescan is running, qgroup data may be incorrect
qgroupid rfer excl
-------- ---- ----
0/5 16.00KiB 16.00KiB
0/256 23.70MiB 23.70MiB
0/258 449.61MiB 449.61MiB
0/265 16.00KiB 16.00KiB
0/279 16.00KiB 16.00KiB

Ahora puede asignar una cuota a un qgroup que aplicará los cambios al subvolumen asociado.

Ahora podemos usar el comando btrfs qgroup limit para limitar el uso del directorio de inicio del usuario fedoran2 a 2GB.

[root@fosslinux tuts]# btrfs qgroup limit 2G /home/fedoran2

Confirme los cambios del límite de cuota para el usuario fedoran2.

[root@fosslinux tuts]# btrfs qgroup show -reF /home/fedoran2
qgroupid rfer excl max_rfer max_excl
-------- ---- ---- -------- --------
0/279 16.00KiB 16.00KiB 2.00GiB none

Muestre todos los qgroups y los límites de cuota asignados, si los hay, utilizando btrfs qgroup show -re /

[root@fosslinux tuts]# btrfs qgroup show -reF /home/fedoran2
qgroupid rfer excl max_rfer max_excl
-------- ---- ---- -------- --------
0/279 16.00KiB 16.00KiB 2.00GiB none

Instantáneas de Btrfs

Una instantánea en el sistema de archivos Btrfs es simplemente una copia de un subvolumen. Por lo tanto, una instantánea es un subvolumen que puede compartir sus datos y metadatos con otros subvolúmenes utilizando las capacidades de copia en escritura (CoW). Tomar una instantánea es inmediato, pero no ocupa un espacio tan pronto como se crea.

Cuando toma una instantánea, el espacio de la instantánea aumentará con los cambios en el subvolumen original o en la instantánea si se puede escribir. Además, cualquier archivo agregado, modificado o eliminado en el subvolumen seguirá residiendo en la instantánea. Estas funciones ofrecen una forma de crear copias de seguridad en su sistema de manera conveniente.

Crea copias de seguridad usando instantáneas

De forma predeterminada, una instantánea residirá en el mismo disco que el subvolumen y puede examinar o incluso recuperar una copia de un archivo en su estado original como cuando se tomó la instantánea. Una característica interesante de las instantáneas es que puede enviarlas a un disco duro externo o un sistema remoto mediante SSH. El problema es que el destino debería tener un sistema de archivos Btrfs. Para aprovechar esta función en las instantáneas, utilizará los comandos btrfs send y btrfs receive.

Nota: almacenar una instantánea en el mismo disco que el subvolumen no es una estrategia de copia de seguridad ideal. Si su disco se daña, perderá tanto el subvolumen como las instantáneas.

Siga estos pasos para crear una copia de seguridad de un subvolumen.

1: crea un subvolumen para tu proyecto

Para fines de demostración, crearemos un subvolumen Btrfs (myproject) dentro de $ HOME / Desktop / myproject. El subvolumen Btrfs se verá y funcionará como un directorio estándar.

Cree un subvolumen usando el siguiente comando:

[tuts@fosslinux ~]$ btrfs subvolume create $HOME/Desktop/myproject
Create subvolume '/home/tuts/Desktop/myproject'

Cree un directorio oculto para almacenar sus instantáneas:

[tuts@fosslinux ~]$ mkdir $HOME/.myprojectsnapshots

Cree un archivo de texto dentro del subvolumen $ HOME / Desktop / myproject:

[tuts@fosslinux ~]$ cd /home/tuts/Desktop/myproject
[tuts@fosslinux myproject]$ ls
[tuts@fosslinux myproject]$ vi day0.txt
[tuts@fosslinux myproject]$ ls
day0.txt

2: toma una instantánea

De forma predeterminada, las instantáneas se pueden escribir, pero tendrá que crear una instantánea de solo lectura para usar los comandos btrfs send y btrfs receive. '

Se pueden tomar instantáneas cada día, cada hora o incluso cada minuto.

Tome una instantánea de solo lectura del subvolumen $ HOME / Desktop / myproject y organícela en $ HOME / .myprojectsnapshots usando el siguiente comando.

[tuts@fosslinux ~]$ btrfs subvolume snapshot -r $HOME/Desktop/myproject $HOME/.myprojectsnapshots/myproject-day0
Create a readonly snapshot of '/home/tuts/Desktop/myproject' in '/home/tuts/.myprojectsnapshots/myproject-day0'

Nota:

  • Utilice la marca -r para crear una instantánea de solo lectura. La bandera -r ofrecerá mayor consistencia y seguridad y le permitirá enviar y recibir a un disco duro externo.
  • Las instantáneas no tomarán instantáneas recursivas de sí mismas. Una instantánea del subvolumen / home no tomará una instantánea del subvolumen $ HOME / Desktop / myproject.
Utilizando btrfs send y btrfs receive para realizar copias de seguridad de instantáneas.

En la siguiente demostración, la instantánea del volumen Btrfs (/.myprojectsnapshots/myproject-day0) se enviará a una unidad USB montada como / run / media / tuts / bk.

[tuts@fosslinux ~]$ sudo btrfs send $HOME/.myprojectsnapshots/myproject-day0 | sudo btrfs receive /run/media/tuts/bk
At subvol /home/tuts/.myprojectsnapshots/myproject-day0
ERROR: /run/media/tuts/bk doesn't belong to btrfs mount point

Dependiendo de cómo haya formateado su unidad USB, es posible que reciba el siguiente mensaje de error:

ERROR: /run/media/tuts/bk doesn't belong to btrfs mount point.’

El error es una indicación de que su unidad USB no tiene el formato del sistema de archivos btrfs. El comando btrfs send no puede funcionar en un sistema de archivos que no sea btrfs.

Si recibe este mensaje de error, formatee su unidad USB a btrfs usando el siguiente comando.

Formatee la unidad USB al formato del sistema de archivos btrfs:

[tuts@fosslinux ~]$ sudo mkfs.btrfs /dev/sdb -L 'bk' -f

Ahora ejecute el comando btrfs send y btrfs receive:

[tuts@fosslinux ~]$ sudo btrfs send $HOME/.myprojectsnapshots/myproject-day0 | sudo btrfs receive /run/media/tuts/bk
[sudo] password for tuts:
At subvol /home/tuts/.myprojectsnapshots/myproject-day0
At subvol myproject-day0

El comando btrfs send se ha completado con éxito y puede ver y explorar su instantánea 'myproject-day0' en su unidad USB.

El comando puede tardar algún tiempo dependiendo del tamaño de su subvolumen ($ HOME / .myprojectsnapshots / myproject-day0). Los envíos btrfs incrementales posteriores tardarán menos tiempo.

Copias de seguridad incrementales usando btrfs send

Para usar btrfs send incrementalmente, tendrá que tomar otra instantánea de su subvolumen.

Crea instantáneas:

[tuts@fosslinux ~]$ btrfs subvolume snapshot -r $HOME/Desktop/myproject $HOME/.myprojectsnapshots/myproject-day1
Create a readonly snapshot of '/home/tuts/Desktop/myproject' in '/home/tuts/.myprojectsnapshots/myproject-day1'

Envío incremental de btrfs:

[tuts@fosslinux ~]$ sudo btrfs send -p $HOME/.myprojectsnapshots/myproject-day0 $HOME/.myprojectsnapshots/myproject-day1 | sudo btrfs receive /run/media/tuts/bk
At subvol /home/tuts/.myprojectsnapshots/myproject-day1
At snapshot myproject-day1

La siguiente copia de seguridad incremental (el día siguiente).

Crea una instantánea:

[tuts@fosslinux ~]$ btrfs subvolume snapshot -r $HOME/Desktop/myproject $HOME/.myprojectsnapshots/myproject-day2
Create a readonly snapshot of '/home/tuts/Desktop/myproject' in '/home/tuts/.myprojectsnapshots/myproject-day2'

Envío incremental de btrfs (el día después):

[tuts@fosslinux ~]$ sudo btrfs send -p $HOME/.myprojectsnapshots/myproject-day1 $HOME/.myprojectsnapshots/myproject-day2 | sudo btrfs receive /run/media/tuts/bk
At subvol /home/tuts/.myprojectsnapshots/myproject-day2
At snapshot myproject-day2
Limpiar

Nota: Necesita al menos la última instantánea para realizar el envío incremental de btrfs. Asegúrese de que la instantánea esté presente en el origen y el destino.

Eliminar instantáneas en la ubicación de origen

Puede eliminar instantáneas innecesarias con el siguiente comando:

[tuts@fosslinux ~]$ sudo btrfs subvolume delete $HOME/.myprojectsnapshots/myproject-day0
[sudo] password for tuts:
Delete subvolume (no-commit): '/home/tuts/.myprojectsnapshots/myproject-day0'
[tuts@fosslinux ~]$ sudo btrfs subvolume delete $HOME/.myprojectsnapshots/myproject-day1
[sudo] password for tuts:
Delete subvolume (no-commit): '/home/tuts/.myprojectsnapshots/myproject-day1'

Eliminar instantáneas en la ubicación de destino:

[tuts@fosslinux ~]$ sudo btrfs subvolume delete /run/media/tuts/bk/myproject-day0
Delete subvolume (no-commit): '/run/media/tuts/bk/myproject-day0'
[tuts@fosslinux ~]$ sudo btrfs subvolume delete /run/media/tuts/bk/myproject-day1
Delete subvolume (no-commit): '/run/media/tuts/bk/myproject-day1'

Nota: Sería mejor si conservara la última instantánea en las ubicaciones de origen y destino para poder realizar un nuevo envío incremental de btrfs.

Recuperar un archivo o directorio de una instantánea btrfs

Errores como eliminar un directorio o archivo por error son inevitables. Cuando ocurren tales errores, puede recuperar archivos o directorios de la instantánea reciente. También puede recuperar una versión anterior del directorio o archivo a partir de una instantánea anterior.

Dado que las instantáneas funcionan como directorios, puede usar el comando cp para restaurar un archivo usando el siguiente comando.

Usando el comando cp

Restaurar un archivo eliminado usando el comando cp:

[tuts@fosslinux ~]$ cp $HOME/.myprojectsnapshots/myproject-day1/day0.txt $HOME/Desktop/myproject

Restaurar un directorio eliminado usando el comando cp:

[tuts@fosslinux ~]$ cp -r $HOME/.myprojectsnapshots/myproject-day1/directory $HOME/Desktop/myproject

Si elimina todo el directorio $ HOME / Desktop / myproject (subvolumen), puede volver a crear el subvolumen y usar el comando cp para restaurar todo el contenido de una instantánea.

Restaurar un subvolumen eliminado:

[tuts@fosslinux ~]$ btrfs subvolume create $HOME/Desktop/myproject
Create subvolume '/home/tuts/Desktop/myproject'
[tuts@fosslinux ~]$ cp -rT $HOME/.myprojectsnapshots/myproject-day1 $HOME/Desktop/myproject
Usando el comando btrfs snapshot

Puede restaurar un subvolumen eliminado tomando una instantánea de instantáneas.

Restaure un subvolumen usando el comando btrfs snapshot:

[tuts@fosslinux ~]$ btrfs subvolume snapshot $HOME/.myprojectsnapshots/myproject-day1 $HOME/Desktop/myproject
Create a snapshot of '/home/tuts/.myprojectsnapshots/myproject-day1' in '/home/tuts/Desktop/myproject'
Recuperar instantáneas btrfs de una unidad externa

Puede usar el comando cp para restaurar una instantánea desde una unidad USB o una unidad externa.

Recuperar un archivo:

[tuts@fosslinux ~]$ cp /run/media/tuts/bk/myproject-day1/day0.txt $HOME/Desktop/myproject

Puede utilizar los comandos btrfs send y btrfs receive para recuperar una instantánea completa. Debe establecer la opción de solo lectura en falso para restaurar un subvolumen grabable.

Recupere una instantánea completa:

[tuts@fosslinux ~]$ sudo btrfs send /run/media/tuts/bk/myproject-day1 | sudo btrfs receive $HOME/Desktop/
[sudo] password for tuts:
At subvol /run/media/tuts/bk/myproject-day1
At subvol myproject-day1

Resumen

El artículo ha destacado algunas características de Btrfs que vale la pena aprender. Btrfs se creó como una alternativa al sistema de archivos ZFS y ofrece muchas características avanzadas del sistema de archivos para los sistemas operativos Fedora y Linux.

Puede obtener más información sobre Btrfs usando el comando btrfs - - help o la documentación en línea, a la que puede acceder usando man btrfs-subvolume, man btrfs-send o man btrfs-receive. También encuentro útil la Wiki oficial de Btrfs.

¡A todos nos vendría bien una herramienta gráfica para interactuar con Btrfs! Para ti, equipo del proyecto Fedora.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir