Trabajando con Btrfs – Subvolúmenes

Este artículo es parte de una serie de artículos que analizan más de cerca Btrfs, el sistema de archivos predeterminado para Fedora Estación de trabajo y Fedora Silverblue desde Fedora Linux 33.

En caso de que te lo hayas perdido, aquí está el artículo anterior de la serie: https://fedoramagazine.org/working-with-btrfs-general-concepts/

Introducción

Los subvolúmenes permiten la partición de un sistema de archivos Btrfs en subsistemas de archivos separados. Esto significa que puede montar subvolúmenes desde un sistema de archivos Btrfs como si fueran sistemas de archivos independientes. Además, puede, por example, defina el espacio máximo que puede ocupar un subvolumen a través de qgroups (hablaremos de esto en otro artículo de esta serie), o use subvolúmenes para incluir o excluir específicamente archivos de las instantáneas (hablaremos de esto también en otro artículo de esta serie). cada defecto Fedora Estación de trabajo y Fedora Instalación de Silverblue desde Fedora Linux 33 hace uso de subvolúmenes. En este artículo exploraremos cómo funciona.

A continuación encontrará muchos ejemplos relacionados con los subvolúmenes. Si desea seguir, debe tener acceso a algún sistema de archivos Btrfs y acceso de root. Puede verificar si su directorio /home/ es Btrfs mediante el siguiente comando:

$ findmnt -no FSTYPE /home
btrfs

Este comando generará el nombre del sistema de archivos de su directorio /home/. Si dice btrfs, ya está todo listo. Vamos a crear un nuevo directorio para realizar algunos experimentos en:

$ mkdir ~/btrfs-subvolume-test
$ cd ~/btrfs-subvolume-test

En el texto a continuación, encontrará muchos resultados de comandos en cuadros como los que se muestran arriba. Tenga en cuenta al leer/comparar las salidas de los comandos que elel contenido de la caja está envuelto al final de la línea. Esto dificulta el reconocimiento de líneas largas que se dividen en varias líneas para facilitar la lectura. En caso de duda, intente cambiar el tamaño de la ventana de su navegador y vea cómo se comporta el texto.

Crear y jugar con subvolúmenes

Podemos crear un subvolumen Btrfs con el siguiente comando:

$ sudo btrfs subvolume create first
Create subvolume './first'

Cuando inspeccionemos el directorio actual, veremos que ahora tiene una nueva carpeta nombrada primero. Tenga en cuenta el primer carácter d en la salida a continuación:

$ ls -l
total 0
drwxr-xr-x. 1 root root 0 Oct 15 18:09 first

Podemos manejar esto como cualquier carpeta normal: podemos cambiarle el nombre, moverla, crear nuevos archivos y carpetas dentro, etc. Tenga en cuenta que la carpeta pertenece a la raíz, por lo que debemos ser raíz para hacer estas cosas.

Si actúa como una carpeta y parece una carpeta, ¿cómo sabemos si es un subvolumen Btrfs? Podemos usar las herramientas btrfs para enumerar todos los subvolúmenes:

$ sudo btrfs subvolume list .
ID 256 gen 30 top level 5 path home
ID 257 gen 30 top level 5 path root
ID 258 gen 25 top level 257 path root/var/lib/machines
ID 259 gen 29 top level 256 path hartan/btrfs-subvolume-test/first

Si está en una versión reciente y sin modificar Fedora Instalación de Linux, es probable que vea el mismo resultado que el anterior. Inspeccionaremos el hogar y la raíz, así como el significado de todos los números más adelante. Por ahora, vemos que hay un subvolumen en la ruta que especificamos. Podemos limitar la salida a los subvolúmenes debajo de nuestra ubicación actual:

$ sudo btrfs subvolume list -o .
ID 259 gen 29 top level 256 path home/hartan/btrfs-subvolume-test/first

Cambiemos el nombre del subvolumen:

$ sudo mv first second
$ sudo btrfs subvolume list -o .
ID 259 gen 29 top level 256 path home/hartan/btrfs-subvolume-test/second

También podemos anidar subvolúmenes:

$ sudo btrfs subvolume create second/third
Create subvolume 'second/third'
$ sudo btrfs subvolume list .
ID 256 gen 34 top level 5 path home
ID 257 gen 37 top level 5 path root
ID 258 gen 25 top level 257 path root/var/lib/machines
ID 259 gen 37 top level 256 path hartan/btrfs-subvolume-test/second
ID 260 gen 37 top level 259 path hartan/btrfs-subvolume-test/second/third

Y también podemos eliminar subvolúmenes, ya sea como eliminamos carpetas:

$ sudo rm -r second/third

o mediante comandos Btrfs especiales:

$ sudo btrfs subvolume delete second
Delete subvolume (no-commit): '/home/hartan/btrfs-subvolume-test/second'

Manejo de subvolúmenes Btrfs como sistemas de archivos separados

La introducción mencionó que los subvolúmenes de Btrfs actúan como sistemas de archivos separados. Esto significa que podemos montar subvolúmenes y pasarles algunas opciones de montaje. Primero crearemos una pequeña estructura de carpetas para comprender mejor lo que sucede:

$ mkdir -p a a/1 a/1/b
$ sudo btrfs subvolume create a/2
Create subvolume 'a/2'
$ sudo touch a/1/c a/1/b/d a/2/e

Así es como se ve la estructura:

$ tree
.
└── a
    ├── 1
    │   ├── b
    │   │   └── d
    │   └── c
    └── 2
        └── e

4 directories, 3 files

Verifique que ahora hay un nuevo subvolumen Btrfs:

$ sudo btrfs subvolume list -o .
ID 261 gen 41 top level 256 path home/hartan/btrfs-subvolume-test/a/2

Para montar el subvolumen, debemos conocer la ruta del dispositivo de bloque donde reside el subvolumen del sistema de archivos Btrfs. El siguiente comando nos dice:

$ findmnt -vno SOURCE /home/
/dev/vda3

Ahora podemos montar el subvolumen. Asegúrese de reemplazar los argumentos con los valores para su PC:

$ sudo mount -o subvol=home/hartan/btrfs-subvolume-test/a/2 /dev/vda3 a/1/b

Observe que usamos el indicador -o para dar opciones adicionales al programa de montaje. En este caso, le indicamos que monte el subvolumen con el nombre home/hartan/btrfs-subvolume-test/a/2 desde el sistema de archivos btrfs en el dispositivo /dev/vda3. Esta es una opción específica de Btrfs y no está disponible en otros sistemas de archivos.

Vemos que la estructura del directorio ha cambiado:

$ tree
.
└── a
    ├── 1
    │   ├── b
    │   │   └── e
    │   └── c
    └── 2
        └── e

4 directories, 3 files

Tenga en cuenta que el archivo e existe dos veces ahora y d se ha ido. Ahora podemos acceder al mismo subvolumen Btrfs por dos caminos diferentes. Todos los cambios que realizamos en cualquiera de las rutas se reflejan inmediatamente en todas las demás ubicaciones:

$ sudo touch a/1/b/x
$ ls -lA a/2
total 0
-rw-r--r--. 1 root root 0 Oct 15 18:14 e
-rw-r--r--. 1 root root 0 Oct 15 18:16 x

Juguemos un poco más con las opciones de montaje. Para example podemos montar el subvolumen como de solo lectura bajo a/1/b así (¡Inserte argumentos para su PC!):

$ sudo umount a/1/b
$ sudo mount -o subvol=home/hartan/btrfs-subvolume-test/a/2,ro /dev/vda3 a/1/b

Usamos el mismo comando que arriba, excepto que agregamos ro al final. Ahora ya no podemos crear archivos a través de este montaje:

$ sudo touch a/1/b/y
touch: cannot touch 'a/1/b/y': Read-only file system

pero acceder al subvolumen directamente todavía funciona como antes:

$ sudo touch a/2/y
$ tree
.
└── a
    ├── 1
    │   ├── b
    │   │   ├── e
    │   │   ├── x
    │   │   └── y
    │   └── c
    └── 2
        ├── e
        ├── x
        └── y

4 directories, 7 files

No olvides limpiar antes de continuar:

$ sudo rm -rf a
rm: cannot remove 'a/1/b/e': Read-only file system
rm: cannot remove 'a/1/b/x': Read-only file system
rm: cannot remove 'a/1/b/y': Read-only file system

¿Oh no que paso? Bueno, dado que montamos el subvolumen de solo lectura anterior, no podemos eliminarlo. Una eliminación desde la perspectiva de un sistema de archivos es una operación de escritura: para eliminara/1/b/e,eliminamos la entrada del directorio paramidel contenido del directorio de su directorio principal,uno/1/ben este caso. En otras palabras, debemos escribir auno/1/bpara decirle quemiya no existe. Entonces, primero desmontamos el subvolumen nuevamente y luego eliminamos la carpeta:

$ sudo umount a/1/b
$ sudo rm -rf a
$ tree
.

0 directories, 0 files

El ID del subvolumen.

¿Recuerda la primera salida del subcomando subvolume list? Eso contenía muchos números, así que veamos de qué se trata. Copié la salida aquí para echar otro vistazo:

ID 256 gen 30 top level 5 path home
ID 257 gen 30 top level 5 path root
ID 258 gen 25 top level 257 path root/var/lib/machines
ID 259 gen 29 top level 256 path hartan/btrfs-subvolume-test/first

Vemos que hay tres columnas de números, cada una con un prefijo de algunas letras para describir lo que hacen. La primera columna de números es un ID de subvolúmenes. Los ID de subvolumen son únicos en un sistema de archivos Btrfs y, como tales, identifican de forma única los subvolúmenes. Esto significa que también se puede hacer referencia al subvolumen llamado home por su ID256. En el comando de montaje anterior escribimos:

$ sudo mount -o subvol=hartan/...

Otra opción perfectamente legal es usar ID de subvolumen:

$ sudo mount -o subvolid=...

Los ID de subvolumen comienzan en

256 y aumente en 1 por cada subvolumen creado. Sin embargo, hay una excepción a esto: la raíz del sistema de archivos siempre tiene el nombre de subvolumen / y el ID de subvolumen 5. Así es, incluso la raíz de un sistema de archivos Btrfs es técnicamente un subvolumen. Esto se conoce implícitamente, por lo tanto, no aparece en la salida de la lista de subvolumen de btrfs. Si monta un sistema de archivos Btrfs sin el argumento subvol o subvolid, el subvolumen raíz con subvolid=5 se asume como predeterminado. A continuación veremos un example de cuándo uno puede querer montar explícitamente la raíz del sistema de archivos.

La segunda columna de números es el contador de generación y se incrementa en cada transacción Btrfs. Esto es principalmente un contador interno y no se discutirá más aquí.

Finalmente, la tercera columna de números es el ID del subvolumen del padre del subvolumen. En el resultado anterior, vemos que tanto el subvolumen principal como el raíz tienen 5 como ID de subvolumen principal. Recuerde que ID 5 tiene un significado especial: es la raíz del sistema de archivos. Entonces sabemos que home y root son hijos del subvolumen raíz. hartan/btrfs-subvolume-test/first por otro lado es un hijo del subvolumen con ID 256, que en nuestro caso es home.

En la siguiente sección, veremos de dónde provienen los subvolúmenes root y home.

Inspeccionar subvolúmenes predeterminados en Fedora linux

Cuando crea un nuevo sistema de archivos Btrfs desde cero, no habrá subvolúmenes en él (excepto, por supuesto, el subvolumen raíz). Entonces, ¿dónde están los subvolúmenes home y root? Fedora Linux viene?

Estos son creados por el instalador en el momento de la instalación. Las instalaciones tradicionales suelen incluir una partición de sistema de archivos independiente para los directorios / y /home. Durante el arranque, estos se montan apropiadamente para ensamblar un sistema de archivos completo. Pero hay un problema con este enfoque: a menos que use tecnologías como lvm, es muy difícil cambiar el tamaño de una partición en algún momento en el futuro. Como consecuencia, puede terminar en una situación en la que su / o /home se quede sin espacio, mientras que la otra partición respectiva tiene mucho espacio libre sin usar.

Dado que los subvolúmenes de Btrfs forman parte del mismo sistema de archivos, compartirán el espacio que ofrece el sistema de archivos subyacente. ¿Recuerdas cuando creamos los subvolúmenes anteriores? Nunca le dijimos a Btrfs qué tan grandes son: un subvolumen puede ocupar todo el espacio que tiene el sistema de archivos, por defecto nada impide que lo haga. Sin embargo, podríamos imponer límites de tamaño dinámicamente a través de qgroups de Btrfs, que también se pueden modificar durante el tiempo de ejecución (y veremos cómo en un artículo posterior de esta serie).

Otra de las ventajas de separar / y /home es que podemos hacer instantáneas por separado. Un subvolumen es un límite para las instantáneas, y las instantáneas nunca contendrán el contenido de otros subvolúmenes por debajo del subvolumen del que se tomó la instantánea. Más detalles sobre las instantáneas siguen en el siguiente artículo de esta serie.

¡Basta de teoría! Veamos de qué se trata todo esto. Primero asegúrese de que su sistema de archivos raíz sea de hecho del tipo Btrfs:

$ findmnt -no FSTYPE /
btrfs

Y luego obtenga la partición en la que reside:

$ findmnt -vno SOURCE /
/dev/vda3

Recuerde que podemos montar la raíz del sistema de archivos por su ID de subvolumen especial 5 (¡Adapte la partición del sistema de archivos!):

$ mkdir fedora-rootsubvol
$ sudo mount -o subvolid=5 /dev/vda3 ./fedora-rootsubvol
$ ls fedora-rootsubvol/
home  root

Y están los subvolúmenes de nuestro Fedora ¡Instalación de Linux! pero como Fedora ¿Linux sabe que el subvolumen root pertenece a / y home pertenece a /home?

El archivo /etc/fstab contiene la llamada información estática sobre el sistema de archivos. En términos simples, durante el arranque, su sistema lee este archivo, línea por línea, y monta todos los sistemas de archivos enumerados allí. En mi sistema, el archivo se ve así:

$ cat /etc/fstab
# [ ... ]
# /etc/fstab
# Created by anaconda on Sat Oct 15 12:01:57 2022
# [ ... ]
#
UUID=5e4e42bb-4f2f-4f0e-895f-d1a46ea47807 /                       btrfs   subvol=root,compress=zstd:1 0 0
UUID=e3a798a8-b8f2-40ca-9da7-5e292a6412aa /boot                   ext4    defaults        1 2
UUID=5e4e42bb-4f2f-4f0e-895f-d1a46ea47807 /home                   btrfs   subvol=home,compress=zstd:1 0 0

(Tenga en cuenta que las líneas “UUID” anteriores se han envuelto en dos líneas)

El UUID al comienzo de cada línea es simplemente un medio para identificar discos y particiones del sistema de archivos en su sistema (más o menos equivalente a /dev/vda3 como lo usé anteriormente). La segunda columna es la ruta en el árbol del sistema de archivos donde se debe montar este sistema de archivos. La tercera columna es el tipo de sistema de archivos. Vemos que las entradas para / y /home son de tipo btrfs, ¡justo lo que esperábamos! Finalmente, en la cuarta columna vemos la magia: Estas son las opciones de montaje, y ahí dice montar / con la opción subvol=root. ¡Ese es exactamente el subvolumen que vimos en la salida de la lista de subvolumen btrfs / todo el tiempo!

Con esta información, podemos reconstruir la llamada a mount que crea esta entrada del sistema de archivos:

$ sudo mount -o subvol=root,compress=zstd:1 UUID=5e4e42bb-4f2f-4f0e-895f-d1a46ea47807 /
(again, the line above has been wrapped into two)

y asi es como Fedora ¡Linux usa subvolúmenes Btrfs! Si tienes curiosidad por saber por qué Fedora Linux decidió usar Btrfs como el sistema de archivos predeterminado, consulte la propuesta de cambio vinculada a continuación

.

Más sobre los subvolúmenes de Btrfs

El wiki de Btrfs tiene información adicional sobre los subvolúmenes y, lo que es más importante, sobre las opciones de montaje que se pueden aplicar a los subvolúmenes de Btrfs. Algunas opciones, como compress, solo se pueden aplicar en un nivel de todo el sistema de archivos y, por lo tanto, afectan a todos los subvolúmenes de un sistema de archivos Btrfs. Puede encontrar la entrada vinculada a continuación

.

Ahora que sabe que los subvolúmenes se comportan como sistemas de archivos, uno puede preguntarse cuál es la mejor manera de colocar un subvolumen en una determinada ubicación. Digamos que desea un subvolumen Btrfs en ~/games, donde su directorio de inicio (~) es en sí mismo un subvolumen, ¿cómo puede lograrlo? Dado que example arriba, puede usar un comando como sudo subvolumen btrfs crear ~/juegos. De esta manera, crea los llamados subvolúmenes anidados: dentro de su subvolumen ~, ahora hay juegos de subvolumen. Esa es una manera perfectamente buena de abordar esta situación.Si le resulta confuso saber qué directorios son directorios simples y cuáles son subvolúmenes, puede adoptar una convención de nomenclatura especial para sus subvolúmenes. Para examplepuede prefijar los nombres de los subvolúmenes con una “@” para que se distingan fácilmente.

Otra solución válida es hacer lo que Fedora lo hace de forma predeterminada: crea todos los subvolúmenes bajo el subvolumen raíz (es decir, de modo que su ID de subvolumen principal sea 5) y los monta en las ubicaciones adecuadas. El wiki de Btrfs tiene una descripción general de estos enfoques junto con una breve discusión sobre sus respectivas implicaciones en la administración del sistema de archivos.

.

  • Conclusión
  • En este artículo descubrimos los subvolúmenes Btrfs, que actúan como sistemas de archivos Btrfs separados dentro de un sistema de archivos Btrfs. Aprendimos a crear, montar y eliminar subvolúmenes. Finalmente, exploramos cómo Fedora Linux hace uso de subvolúmenes, sin que nos demos cuenta.
  • Los próximos artículos de esta serie tratarán sobre:
  • Instantáneas – Retrocediendo en el tiempo

RAID: reemplace su configuración de mdadmCompresión: ahorro de espacio de almacenamiento transparenteQgroups: limitar el tamaño de su sistema de archivos

https://fedoraproject.org/wiki/Changes/BtrfsByDefault#Benefit_to_Fedora
https://btrfs.readthedocs.io/en/latest/Subvolumes.htmlSi hay otros temas relacionados con Btrfs sobre los que desea obtener más información, eche un vistazo a Btrfs Wiki
https://btrfs.wiki.kernel.org/index.php/Main_Pagey documentos
https://btrfs.readthedocs.io/en/latest/Introducción.html. ¡No olvide consultar el primer artículo de esta serie, si aún no lo ha hecho! Si cree que falta algo en esta serie de artículos, háganoslo saber en los comentarios a continuación. ¡Nos vemos en el próximo artículo!
https://btrfs.wiki.kernel.org/index.php/SysadminGuide#LayoutFuentes

: