BTRFS para los más pequeños

Buen día, Khabravchane. Trabajo en Veeam Software y soy uno de los desarrolladores de nuestra solución de respaldo de Linux. Por ocupación, me encontré con BTRFS. Más recientemente, pasó del estado de "aún no adecuado" al estado de "estable". Y mientras sus primeros usuarios en la red discutían áreas problemáticas y problemas de estabilidad, en Veeam lo empujamos con una varita e intentamos hacer una copia de seguridad. Resultó, por decirlo suavemente, no mucho: es demasiado diferente, no como los sistemas de archivos tradicionales. Tuve que estudiar muchos aspectos y recolectar muchos rastrillos antes de aprender a trabajar con ellos. En el proceso de aprendizaje, BTRFS logró impresionarme, tanto en el buen sentido como no tanto. Estoy seguro de que no dejará indiferente a ningún especialista en TI del mundo Linux: algunos escupirán, otros elogiarán.

Si has oído hablar de este sistema de archivos, pero no sabes por qué, si estás interesado en los detalles o estás buscando dónde empezar a conocerlo, te invito a que te contacte.

Introduccion


BTRFS (B-Tree Filesystem): sistema de archivos para sistemas operativos tipo Unix, basado en la técnica Copy on Write (CoW), diseñado para facilitar la escala del sistema de archivos, un alto grado de confiabilidad y seguridad de los datos, flexibilidad de configuración y facilidad de administración, mientras se mantiene Al mismo tiempo de alta velocidad. Al menos eso es lo que dice la página wiki principal .

Para cumplir con las formalidades, enumeramos las características principales de btrfs:

  • Tamaño máximo de archivo 2 ^ 64 bytes
  • Mesa dinámica de inodo
  • Deduplicación de datos
  • Almacenamiento efectivo de archivos de tamaños muy pequeños y muy grandes
  • Crear subwolums e instantáneas
  • Cuotas de subvolumen
  • Sumas de verificación para datos y metadatos
  • La capacidad de combinar múltiples unidades en un solo sistema de archivos
  • Crear una configuración RAID a nivel del sistema de archivos
  • Compresión de datos
  • Desfragmentar datos sobre la marcha

Quiero advertirle de inmediato que BTRFS se está desarrollando activamente, y algunos puntos pueden diferir de una versión a otra. El enlace: https://btrfs.wiki.kernel.org/index.php/Changelog, puede averiguar cuándo se agregó, modificó o arregló la funcionalidad.

Sí, BTRFS es un sistema de archivos joven y moderno que resuelve una amplia gama de tareas, pero no sin sus inconvenientes:

  • Su desarrollo activo conduce a un cambio en cualquier punto clave en el que las utilidades de terceros puedan confiar al trabajar con él.
  • A pesar de las garantías de los desarrolladores sobre la estabilidad de BTRFS, los usuarios regularmente encuentran problemas que pueden conducir a la pérdida de datos. Como regla, son de naturaleza "flotante", por lo que aún no han sido estudiados y corregidos.
  • Alta susceptibilidad a la fragmentación.
  • Documentación escasa ya veces desactualizada.

Una página completa está dedicada a los problemas del sistema de archivos en diferentes versiones de los núcleos: https://btrfs.wiki.kernel.org/index.php/Gotchas . Le recomiendo encarecidamente que mire allí: resulta muy interesante y no obvio.

Estructura BTRFS


El dispositivo BTRFS simplificado se puede dividir en los siguientes niveles:



Los dispositivos de bloque están ubicados en el nivel más bajo, representando uno o más espacios de direcciones físicas separados (el mismo "físico" que los dispositivos de bloque, pero estos ya son detalles). A través de estructuras especiales, los bloques asignados de memoria física se combinan en un solo espacio de dirección virtual.

Las estructuras y bloques de metadatos con datos de usuario (extensiones) ya se abordan a nivel lógico. Como resultado, los datos ubicados secuencialmente a un nivel lógico pueden residir físicamente en diferentes dispositivos de bloque.

Las estructuras de metadatos se pueden dividir en niveles. Por supuesto, no los clasificaré, hay muchos de ellos, y esos detalles de bajo nivel son el tema de un artículo separado. Es importante aquí que algunas estructuras en la jerarquía resulten ser de mayor nivel que otras, y en la parte superior habrá una estructura que es un subvolumen.

Subvolumen es un tipo de punto de entrada, o más bien, los elementos raíz del sistema de archivos. Forman una capa separada de representación de datos, que encapsula el trabajo de las capas inferiores, presentando los datos del usuario en la forma habitual: directorios y archivos. Además, los sublobos son un elemento clave del mecanismo CoW en BTRFS. Los mismos archivos en dos subvolúmenes pueden resultar ser el mismo conjunto de datos en los niveles inferiores.

La última capa es la capa de datos. Como el usuario los ve. Estos son archivos y directorios ubicados en subvolumen.

Pero suficiente teoría. ¡Es hora de pasar a practicar!

Btrfs-progs


Este es un conjunto estándar de utilidades para administrar BTRFS. Dependiendo del paquete de distribución, el paquete con estas utilidades en el repositorio puede tener diferentes nombres: btrfsprogs , btrfs-progs , btrfs-tools , etc. Si su repositorio no tenía nada similar, siempre puede compilarlo manualmente, las fuentes no están muy lejos: https://github.com/kdave/btrfs-progs .
Las utilidades más importantes en este paquete son btrfs y mkfs.btrfs . Desde el segundo, creo, todo está muy claro: es necesario crear BTRFS en un dispositivo de bloque. Primero, btrfs es la utilidad principal que te permite hacer el resto. Una especie de "cuchillo suizo".

En este artículo, utilicé la versión v4.15.1. La utilidad se está desarrollando de manera muy activa y existen diferencias notables de una versión a otra. Entonces, si no tenía el comando necesario, verifique la versión de la utilidad btrfs , es posible que ya no esté actualizada.

Además, lo más probable es que las utilidades btrfsck y btrfstune se encuentren en el paquete.

  • El primero de ellos sirve para verificar el sistema de archivos en busca de errores y para correcciones posteriores, sin embargo, no recomiendo usarlo: está en estado obsoleto , su funcionalidad se ha movido al comando de verificación btrfs .
  • El segundo le permite realizar algunas operaciones útiles en btrfs, por ejemplo, cambiar el identificador único del sistema de archivos (FS UUID) o habilitar cierta funcionalidad del sistema de archivos.

Además de las utilidades enumeradas anteriormente, hay varias utilidades más en el paquete, pero son principalmente necesarias para depurar btrfs y no nos serán útiles en este artículo.

Formatear un disco en BTRFS


En la práctica, todo es más simple. Comencemos con una unidad.
El formateo de un solo disco en btrfs se produce con el comando habitual:

mkfs.btrfs /dev/sdc -L single_drive 

En respuesta, la utilidad generará los parámetros del sistema de archivos creado en la consola:

 btrfs-progs v4.15.1 See http://btrfs.wiki.kernel.org for more information. Label:       single_drive UUID:        59307d69-6d2f-4d2e-aae2-a5189ad3c256 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/sdc 

Veamos los parámetros presentados.

  • Etiqueta : una etiqueta o nombre del sistema de archivos. Se especifica mediante el -L y es un parámetro opcional.
  • UUID es un identificador único que hace que el núcleo btrfs diferencie las instancias entre sí.
  • Tamaño de nodo : el tamaño de los elementos del árbol B en el que se almacenan los metadatos. Se puede configurar usando -n | --nodesize -n | --nodesize , y debe ser un múltiplo del tamaño del Sector . El pequeño tamaño del nodo conduce a un aumento en la altura del árbol B (un aumento en el número de nodos) y, como resultado, a una disminución en la competencia por bloquear un nodo individual. Por otro lado, el pequeño tamaño del nodo hace que la instancia del sistema de archivos sea más propensa a la fragmentación. Los nodos grandes, por otro lado, contribuyen a un mejor empaquetado de metadatos en el disco, lo que reduce la fragmentación.
    La desventaja es un mayor tiempo de acceso a datos para actualizar el mismo nodo mediante múltiples hilos. En los núcleos anteriores a 3.11, de forma predeterminada, el tamaño del nodo es 16384 bytes o el tamaño de la página de memoria del sistema operativo (el mayor de estos dos valores).
  • Tamaño del sector : la cantidad de espacio que es múltiplos de los cuales se asigna y libera en el nivel físico. Es igual al tamaño de página de la memoria virtual del sistema operativo, a menos que se especifique lo contrario con el -s .
  • Tamaño del sistema de archivos : la capacidad total del sistema de archivos (datos más metadatos). Establecido manualmente con el -b . Por defecto, todo el volumen del dispositivo de bloque está ocupado.
  • Funciones incompatibles : una lista de funciones incluidas en los btrfs creados que rompen la compatibilidad con versiones anteriores del kernel. Si es necesaria la compatibilidad con versiones anteriores, puede deshabilitar:

     --features ^extref,^skinny-metadata. 

    Por cierto, puede verificar qué características admite el núcleo actual mediante la siguiente llamada:

     mkfs.btrfs --features list-all 
  • Número de dispositivos y dispositivos : cuántos dispositivos de bloque están involucrados en la instancia btrfs creada y una lista de todos los dispositivos, respectivamente.
  • También deberíamos hablar sobre el parámetro Perfiles de grupo de bloques . Indica el perfil de registro aplicable para cada uno de los tres tipos de datos: Datos, Metadatos y Sistema. Volviendo a la estructura generalizada de btrfs, podemos decir que:

    • Los datos son datos del usuario;
    • Los metadatos son una combinación de una capa de subvolumen y una capa de metadatos y extensiones;
    • Los sistemas son estructuras para mapear el espacio de direcciones de la memoria física en un espacio continuo de direcciones lógicas.

    Un perfil de grabación es una forma de almacenar datos a nivel físico:

    • Single: almacenamiento de datos en una sola copia;
    • DUP: duplicación de datos en un medio;
    • RAIDX es una de las configuraciones de RAID0, RAID1, RAID10, RAID5 y RAID6.


Al marcar un dispositivo de bloque, por defecto btrfs aplicará duplicación a los metadatos y datos del sistema, y ​​los datos del usuario permanecerán en los medios en una sola copia. La creación de btrfs en varios discos a la vez aplicará el perfil "RAID0" a los datos del usuario de forma predeterminada, y "RAID1" a los metadatos.
Este grupo de parámetros se controla mediante dos teclas: -d para datos y -m para metadatos y datos del sistema.

Pero hay un matiz ... Las cosas son diferentes con los SSD. El hecho es que si estuviéramos marcando una unidad SSD (o unidad flash), entonces, por defecto, el sistema de archivos no duplicaría los metadatos. Los SSD pueden extender la deduplicación de datos para extender la vida útil de los elementos de memoria. Es decir teniendo dos copias lógicas de los datos, de hecho solo se grabará una en el medio. Como resultado, cuando falla un segmento de memoria, se dañarán "ambas copias" de los datos. Además, al escribir datos dos veces, el recurso SSD simplemente se consume más rápido.

Para determinar el tipo de medio, btrfs verifica el contenido del archivo / sys / block / DEV / queue / rotational , donde "DEV" es el nombre del dispositivo de bloque a verificar.
Por supuesto, incluso en el caso de un SSD, se puede forzar el perfil de almacenamiento.

Para crear una instancia de btrfs en varios dispositivos, solo especifíquelos con un espacio:

 sudo mkfs.btrfs /dev/sdc /dev/sdd -L double_drive 

o con perfiles:

 sudo mkfs.btrfs /dev/sdc /dev/sdd -d raid1 -m raid1 -L raid1_drive 

Cabe señalar que los medios no tienen que ser del mismo tamaño, incluso si se utiliza la duplicación completa. Sin embargo, tan pronto como no haya suficiente espacio en la unidad más pequeña para asignar memoria, el sistema de archivos mostrará un mensaje que indica que no hay espacio libre, aunque físicamente todavía puede haber espacio libre en otros medios.

Montaje


El primer montaje de btrfs recién creados no es diferente de otros sistemas de archivos:

 mount /dev/sdc /mnt 

Si el sistema de archivos está ubicado en varios discos, entonces para el montaje es suficiente especificar cualquiera de ellos.

En general, montar btrfs siempre implica montar uno o más de sus subvolúmenes. Si el comando de montaje no se especifica qué subvolumen se debe montar, entonces btrfs leerá del registro especial la ID del subvolumen, que se debe montar de forma predeterminada. Esta entrada se puede cambiar más tarde con el btrfs set-default , pero cuando la monta por primera vez en btrfs, solo hay un subvolumen: el raíz. Se especifica por defecto para el montaje.

El submundo raíz en btrfs siempre está presente. Aparece junto con el sistema de archivos y no está sujeto a ningún cambio en el futuro.

Hay dos formas de montar cualquier subvolumen que no sea el predeterminado:
especifique la ruta desde el subvolumen raíz btrfs:

 mount -o subvol=/path/to/subvol /dev/sdc /mnt 

especifique la ID del subvolumen:

 mount -o subvolid=257 /dev/sdc /mnt 

Como ya se mencionó, uno de los subvolúmenes btrfs se especifica como montado de forma predeterminada. Descubra cuál es posible haciendo:

 btrfs subvolume get-default /path/to/any/subvolume 

Para instalar el submontaje predeterminado, puede usar el comando:

 btrfs subvolume set-default 258 /path/to/any/subvolume 

La ruta al subvolumen en este caso solo es necesaria para indicar la instancia específica de btrfs a la que se aplica el comando. Por cierto, esto no tiene que ser un submundo; la ruta a cualquier directorio también es adecuada.

El comando mount acepta una gran cantidad de opciones para controlar las capacidades de btrfs: desfragmentación, vaciado de caché, compresión, vaca, registro, equilibrio, soporte de SSD y muchas otras cosas específicas de btrfs. No los consideraré en el marco de este artículo, porque son necesarios para ajustar el sistema de archivos, y en la gran mayoría de los casos puede prescindir de ellos.

Subvolumen es


Un subvolumen es un elemento clave de btrfs que realiza varias funciones:

  • almacenamiento de datos de usuario y otros subvolúmenes,
  • proporcionar acceso a datos (montaje),
  • Mecanismo de vaca
  • creando instantáneas.

En una primera aproximación, el subvolumen es un directorio normal. Puede cambiarles el nombre / moverlos, ver su contenido, colocar y modificar archivos dentro de ellos. No se requieren utilidades especiales.

La creación y eliminación de un subvolumen se realiza en btrfs montados utilizando comandos especiales:

 btrfs subvolume create /mnt/subvolume_name btrfs subvolume delete /mnt/subvolume_name 

Observo que si intenta eliminar el subvolumen utilizando el administrador de archivos o la utilidad rm , la operación finalizará con un error de operación no permitida (la operación no está permitida).

UPD: a partir de la versión 4.18.0 del kernel, las subvolúmenes se pueden eliminar mediante la utilidad rm o las herramientas del administrador de archivos. Aparentemente, fue un error, no una característica. Gracias a Prototik habravchanin por la aclaración.

Después de crear un subvolumen, puede ver sus propiedades:

 btrfs subvolume show /mnt/subvolume_name Name:          subx UUID:          09af45e8-d2b2-b342-8a92-fa270ac82d0a Parent UUID:      - Received UUID:     - Creation time:     2019-03-23 17:59:28 +0100 Subvolume ID:      268 Generation:       39 Gen at creation:    35 Parent ID:       260 Top level ID:      260 Flags:         - Snapshot(s): 

Veamos las principales propiedades del subwolume:

  • Nombre : el nombre del subvolumen
  • UUID es un identificador único universal que sirve principalmente para determinar las relaciones de subwoofer-instantánea,
  • UUID principal : identificador del antecesor de subvolumen del que se deriva el actual,
  • UUID recibido : identificador del ancestro de subvolumen enviado a través de btrfs send ,
  • ID de subvolumen : un identificador único para la colocación en el árbol B,
  • Generación : número de transacción en la última actualización de los metadatos de subvolumen,
  • Gen en la creación : número de transacción en el momento en que se creó el subvolumen,
  • ID principal : identificador del subvolumen en el que está incrustado el actual,
  • La ID de nivel superior es exactamente la misma que la ID principal,
  • Banderas : banderas (de hecho, solo 1 bandera es de solo lectura ),
  • Instantáneas : una lista de instantáneas tomadas de este subvolumen.

El subvolumen tiene un parámetro más: esta es su ruta desde el elemento raíz btrfs. La ruta se muestra al enumerar el subvolumen:

 btrfs subvolume list /path/to/any/btrfs/mountpoint 

Pero aquí todo es simple y claro: ni siquiera tiene sentido traer el resultado del comando.
Al igual que con los comandos get-default y set-default , aquí puede especificar la ruta a cualquier subvolumen, el resultado de esto no cambiará. Esta ruta se utiliza para encontrar el subbolum raíz btrfs. Después de lo cual se lee todo el árbol subwolum.

Si intenta copiar el subvolumen, por ejemplo, con la utilidad cp , la operación de copia tendrá éxito, pero como resultado, no se creará el subvolumen, sino el directorio habitual. Sin embargo, btrfs proporciona una herramienta mucho más flexible para crear tales copias: instantáneas.

Instantánea es


Instantánea también es un submundo, solo que tiene propiedades avanzadas.

Su principal diferencia es que la instantánea tiene registros de qué subwolum se produjo. Estos son los campos UUID principal y UUID recibido . En el subwoofer, estos campos también están presentes, pero siempre están vacíos. Entonces, de hecho, una instantánea y un subvolumen son lo mismo.
Al crear, puede bloquear la instantánea para cambios utilizando el modificador -r .

 btrfs subvolume snapshot -r /path/to/subvol /path/to/snapshot 

En este caso, se garantiza que los archivos permanecerán en el estado en que se encontraban en el momento en que se creó la instantánea.

El indicador de solo lectura también se puede controlar manualmente, esto funciona para cualquier subvolumen:

 btrfs property get /path/to/subvol ro btrfs property set /path/to/subvol ro true 

Si ahora miramos las propiedades de la instantánea, veremos el campo UUID principal lleno:

 btrfs subvolume show /path/to/snapshot Name:          subx UUID:          d08612d8-596a-11e9-8647-d663bd873d93 Parent UUID:      09af45e8-d2b2-b342-8a92-fa270ac82d0a Received UUID:     - Creation time:     2019-03-23 17:59:28 +0100 Subvolume ID:      269 Generation:       39 Gen at creation:    35 Parent ID:       260 Top level ID:      260 Flags:         - Snapshot(s): 

Una característica importante de la operación de instantánea es que no es recursiva. En lugar de subvolumen anidado, se crearán directorios vacíos en la instantánea.

Pasemos al siguiente ejemplo.

En el sistema de archivos hay un subwoofer "sub0", dentro del cual hay un subwoofer subA y un directorio dirB . Dentro de cada uno de ellos están el archivo A y el archivo B, respectivamente.

Eliminar instantánea:

 btrfs subvolume snapshot sub0 snap0 



La instantánea snap0 creada heredará todos los archivos y directorios de su padre, sin embargo, el subwoofer subA no aparecerá dentro de la instantánea. En cambio, solo aparecerá un directorio vacío en la instantánea, es decir el contenido del subvolumen subA no se heredará.

Por un lado, esto es bueno: eliminamos la instantánea de un subvolumen específico, y todos los anidados no nos interesan. Por otro lado, si se requiere una instantánea recursiva, btrfs no tiene una solución para este problema. Tendremos que buscar rondas de trabajo.

La primera solución se basa en el hecho de que la instantánea se eliminó sin un indicador de solo lectura, lo que le permite solucionar la situación de manera bastante simple:

  • eliminar directorio adicional de la instantánea

     rmdir snap0/subA 

  • eliminar la instantánea de un subvolumen anidado

     btrfs subvolume snapshot sub0/subA snap0/subA 




Si la instantánea se eliminó con el indicador de solo lectura, la opción anterior no funcionará, porque en snap0 no puede eliminar el directorio ni colocar una instantánea. Solo hay una opción: colocar instantáneas en algún lugar cerca del subwoofer snap0:

 btrfs subvolume snapshot sub0/subA snapA 

y luego monte snapA dentro de la instantánea snap0 , el directorio para esto ya está allí:

 mount -o subvol=snapA snap0/subA 



En cualquier caso, es importante comprender que las instantáneas recursivas se tomarán en diferentes operaciones, en diferentes momentos. No se puede hablar de ninguna eliminación atómica de una instantánea de varios subvolúmenes.

Copia en escritura


Un poco sobre subvolumen y enfoque CoW. Imagine que hay un subvolumen en el sistema de archivos y que se encuentra un archivo en él (tome el caso ideal: el archivo no está fragmentado). A continuación, se elimina una instantánea del subwolly.



Aparecerá un nuevo subvolumen (instantánea) en el sistema de archivos con exactamente el mismo contenido que el subvolumen original. El proceso de creación de una instantánea es casi instantáneo: los datos del archivo en sí no se copian. En su lugar, se crean metadatos adicionales y una instantánea junto con el subvolumen principal se convierte en el propietario del archivo. De hecho, solo había un archivo en el disco, pero ahora pertenece tanto al subvolumen como a la instantánea.
Si ahora cambia el archivo en el subvolumen, los cambios no afectarán el archivo en la instantánea. Si el indicador de solo lectura no se configuró al crear la instantánea, entonces el archivo en la instantánea también se puede modificar.



Técnicamente, cuando se cambia un archivo, solo se registran estos cambios. Por lo tanto, el archivo fuente se almacenará en el disco más algún delta que distinga el archivo original del modificado. Si elimina uno de los subvolúmenes (por el segundo me refiero a una instantánea), el exceso de datos que ya no es utilizado por nadie se borrará del disco, y solo la versión actual del archivo permanecerá en el disco (desde el punto de vista del subvolumen restante).

Una breve nota : al extraerlo, el subwoofer desaparecerá de los ojos del usuario al instante y la utilidad devolverá el control al terminal; sin embargo, el proceso en segundo plano limpiará los datos del disco durante un tiempo. Es decir, a diferencia de la eliminación de un directorio normal, no es necesario esperar a que finalice la operación de eliminación. Si necesita sincronizarse con este proceso y esperar a que se complete, puede especificar el interruptor --commit-after llamar al eliminar . El comando btrfs subvolume list , invocado con el modificador -d , muestra una lista de subvolúmenes que el usuario ha eliminado y que actualmente se encuentran en proceso de eliminación del disco.

Además, btrfs le permite clonar archivos en el sistema de archivos sin recurrir a instantáneas. Esto se hace copiando regularmente con la --reflink :

 cp -ax --reflink=always /original/file /copied/file 

La clave reflink=always le dice al sistema de archivos que queremos usar el mecanismo CoW al copiar. Después de copiar, los archivos se pueden cambiar independientemente uno del otro, para que tengamos el mismo comportamiento que después de crear una instantánea. Entonces, ¿por qué necesitamos subbolums?

Los subtolums en btrfs desempeñan el papel de una herramienta de control de alto nivel para conjuntos de datos completos: en primer lugar, es la eliminación de instantáneas atómicas de todos los datos de un subvolumen (en el caso de - la atomicidad de enlace solo está en el nivel de archivo), y en segundo lugar es posible ver de quién se hereda o "revierta" rápidamente el conjunto de datos a una versión anterior, etc.
Por lo tanto, btrfs proporciona la capacidad de capturar estados de archivos en los puntos de tiempo deseados, utilizando subvolúmenes como un medio de alto nivel para administrar estos estados.

Recuperación de subvolumen


En las vastas extensiones, a menudo surge la pregunta: "Tengo un subwoofer, tengo una instantánea, ¿cómo hacer un reverso?" Este enfoque no es aplicable a btrfs, porque no hay oportunidad de "hacer retroceder el subwolly". En cambio, btrfs ofrece una estrategia para reemplazar el subwolly con su instantánea. De hecho, por qué revertir algo, si la instantánea en sí es este objeto que queremos obtener con revertir.

Imagine este escenario: en btrfs hay un subvolumen en el que se encuentran los archivos de una base de datos (bueno, u otros datos importantes). Las instantáneas se eliminan periódicamente de este subvolumen y, en algún momento, es necesario revertir los datos. En este caso, simplemente nos deshacemos del subwolum y, en su lugar, comenzamos a usar la instantánea tomada de él o, si no queremos estropear también estos datos, eliminamos otra instantánea de la instantánea. Si el submundo original no se montó y se usó como un directorio normal, entonces se debe eliminar o mover / renombrar, y se debe colocar una instantánea en su lugar.



En la consola, podría verse así:

  • renombrar el subwolly

     mv the_subvolume the_subvol.old 
  • poner su instantánea en lugar del subvolumen

     btrfs subvolume snapshot the_snapshot the_subvolume 

Si el subvolumen se montó y usó a través del punto de montaje, entonces es suficiente desmontar el subvolumen y montar una instantánea en su lugar.



  • Desmontar el subwoofer

     umount /mnt/ 
  • Puede crear una instantánea de una instantánea para no estropear los últimos datos sobrevivientes:

     btrfs subvolume snapshot /path/to/snapshot /path/to/snapshot_copy 
  • instantánea de montaje:

     mount -o subvol=path/to/snapshot_copy /mnt 

Para completar, lo intentaré de nuevo y un poco diferente. El subvolumen en el que ocurren los cambios es la rama principal .



Al crear una instantánea, el estado de los archivos en el disco es fijo. De ahora en adelante, una instantánea es un brunch de la rama principal . Todos los cambios posteriores a main no afectarán la instantánea de ninguna manera. Volver a la instantánea significa detener el uso de la rama principal y cambiar completamente al brunch. La rama principal se puede eliminar como innecesaria. Por lo tanto, btrfs es prácticamente un sistema de control de versiones, pero sin la capacidad de fusionar las ramas.

Árbol del sistema de archivos


Uno de los puntos no obvios asociados con el uso de btrfs es cómo dividir los datos del sistema en subvolúmenes. Por supuesto, no existe un enfoque "correcto" para este problema. Pero hay 3 formas de organizar la estructura del subvolumen: una estructura plana, anidada y mixta.

Una estructura plana significa que el subvolumen se coloca en una lista plana en el subvolumen raíz. Por ejemplo, puede seleccionar la raíz del sistema de archivos (llamémosla raíz ), el directorio de inicio del usuario, el directorio con el sitio / var / www y la base de datos ubicada, por ejemplo, en / var / database como subvolúmenes separados.



Por conveniencia, se puede colocar algún subvolumen en directorios, como, por ejemplo, en el caso del subvolumen var / www .

Con este enfoque, todos los subvolúmenes deben montarse. La raíz raíz debe tener un punto de montaje /, y en su interior debe contener los directorios home y var .Después de montar la raíz en el / home debe estar instalado sabvolyum casa , y en el directorio / var / www y / var / databas un e - sabvolyumy var / www y la base de datos , respectivamente.

Por lo tanto, el árbol de btrfs-subvolume se puede mostrar arbitrariamente en el sistema de archivos virtual del sistema operativo, y ya hay suficiente para eso.

Pros:

  • el usuario solo ve subvolumen montado,
  • Es fácil reemplazar el subwoofer (desmontar uno, montar el otro),
  • Subwoofer fácil de quitar.

Contras:

  • es fácil confundirse sobre dónde instalarlo,
  • para cada subvolumen debe haber una entrada en fstab, y si hay "retrocesos" en las instantáneas, entonces las entradas correspondientes en fstab también deben actualizarse.

La estructura anidada del subvolumen sugiere un uso simple del subvolumen en lugar de algunos directorios.



En este caso, además del subvolumen raíz, no se requiere nada más para ser montado.

Pros:

  • todos los subvolúmenes son visibles, la estructura es fácil de percibir,
  • no necesita volver a montar nada, todo es como un sistema de archivos "normal".

Contras:

  • todos los subvolúmenes son visibles, tal vez a algunos les gustaría esconderse del usuario,
  • es difícil eliminar / reemplazar el subwolum (la razón de esto es subwolves anidados).

Bueno, el tercer enfoque es mixto. Implica una combinación de los dos primeros para maximizar los beneficios de ambos. Sin embargo, es posible que este enfoque en particular conduzca a una estructura compleja, difícil de cambiar y confusa con una gran cantidad de entradas en fstab. Todo depende de la sobriedad del administrador del sistema.



Agregar / quitar disco, saldo


btrfs cuenta con una excelente funcionalidad: la capacidad de "agregar dispositivos de bloqueo activos" directamente durante el funcionamiento del sistema de archivos:

 btrfs device add /path/to/device /path/to/btrfs 

O eliminar:

 btrfs device remove /path/to/device /path/to/btrfs 

Por cierto, en una llamada de agregar / eliminar puede especificar varios discos.
Nuevamente, la ruta especificada es la ruta a cualquier subvolumen de ese btrfs al que se aplicará el comando.

Veamos cuántos y qué dispositivos de bloque están bajo control de btrfs:

 btrfs filesystem show /path/to/btrfs Label: none uuid: 52961dda-df84-4e2d-9727-e93e7738df81       Total devices 2 FS bytes used 192.00KiB       devid  1 size 20.00GiB used 132.00MiB path /dev/sdc       devid  2 size 50.00GiB used 0.00B path /dev/sdd 

0.00B en el campo usado nos dice que el disco agregado está vacío. Para llenarlo con datos de acuerdo con el perfil de grabación, debe equilibrar:

 btrfs balance start /path/to/btrfs 

El comando balance redistribuye los datos en los discos de acuerdo con el perfil de grabación seleccionado. Por ejemplo, en el caso de RAID1, el saldo conducirá a la clonación de datos del dispositivo original, en el caso de RAID0, conducirá a una distribución más uniforme de los datos en dos discos, etc.
Como resultado del balance, si antes había vacíos en el disco, entonces los datos en el disco se escribirán de una manera más densa, es decir. La desfragmentación resultará. Sin embargo, es importante entender que esto no es exactamente "esa" desfragmentación. En este caso, el comando de equilibrio no mira el contenido lógico, sino que opera solo en bloques de datos. Ella no presta atención al hecho de que cualquier archivo está extendido en el disco. En cambio, el saldo transfiere bloques de datos de un lugar a otro. Es decirun archivo fragmentado para equilibrar permanecerá fragmentado después de él. Pero! La fragmentación a nivel de bloques de datos seguirá disminuyendo, y esto se puede usar.

Para evitar confusiones, digamos esto: la operación de equilibrio reduce la fragmentación a nivel de bloques de datos, pero no afecta la fragmentación de archivos.

Además, el comando de equilibrio proporciona la capacidad de cambiar el perfil de grabación. Por ejemplo, el perfil DUP se utilizó en el disco y, después de agregar el disco, decidieron crear RAID1 completo. Para hacer esto, use el filtro convert:

 btrfs balance start -dconvert=raid1 -mconvert=raid1 /path/to/btrfs 

Usando las opciones -dconverty, -mconvertse configuran nuevos perfiles de registro para datos y metadatos, respectivamente. También existe la opción -sconvert, que está diseñada para cambiar el perfil de escritura de datos del sistema, sin embargo, también deberá agregar el modificador -f (--force) para forzar la operación.

En general, el objetivo principal de los filtros es establecer las reglas para la operación de equilibrio: qué bloques procesar y cuáles no tocar. Entonces, por ejemplo, puede afectar solo los bloques grabados con un perfil de grabación específico (perfiles de filtro), o bloques ocupados por encima de un cierto porcentaje (filtro de uso), o afectar solo a grupos de bloques relacionados con un disco específico (filtro devid), etc. Por cierto, todavía se pueden combinar. En general, las capacidades de los filtros son muy amplias y son principalmente necesarias para realizar un balance selectivo de datos.

Fragmentación


Desafortunadamente, btrfs, debido a su arquitectura, es extremadamente susceptible a un fenómeno como la fragmentación. El hecho es que los datos siempre se escriben en una nueva ubicación en el disco. Incluso si lee el archivo, no haga nada con los datos y vuelva a escribirlos en el mismo archivo, los datos irán a una nueva área en el disco. Lo mismo sucede si actualiza los datos en el archivo solo parcialmente: los cambios se escriben en una nueva área del disco. Por lo tanto, los cambios frecuentes fragmentan los archivos con mucha fuerza, lo que aumenta la "dispersión" de los fragmentos, en el caso general, en varios discos. Esto conduce a una mayor carga en la CPU y al consumo innecesario de memoria. Las más fragmentadas son las bases de datos y las imágenes de máquinas virtuales.

Puede evaluar la fragmentación de archivos con la utilidad filefrag (no incluido en btrfs-progs).

 filefrag /path/to/your/file 

Muestra la cantidad de extensiones utilizadas para almacenar el archivo. En pocas palabras: cuanto menos implicados, menos fragmentado está el archivo.

Hay dos métodos para combatir la fragmentación en btrfs: la desfragmentación y la bandera nocow.

La desfragmentación se puede aplicar a un solo archivo o a un subvolumen / directorio, incluso de forma recursiva. El comando es el siguiente:

 btrfs filesystem defragment /path/to/file/or/dir 

Debo decir que este equipo no siempre conduce a los resultados esperados. Los archivos pequeños y ligeramente fragmentados (10-20 extensiones) después de la desfragmentación se pueden dividir en más partes. Además, la desfragmentación de btrfs en algunas versiones del núcleo interrumpe la deduplicación de archivos, convirtiéndolos en copias físicas reales. Es decirlas instantáneas a nivel físico se convertirán en copias completas.

La segunda forma de combatir la fragmentación es con un atributo de archivo nocow.

 chattr +C /path/to/file 

El atributo nocowsolo se puede establecer en un archivo nuevo o vacío. Deshabilita el mecanismo de copia en escritura , por lo que btrfs siempre funcionará con un área de disco fija al actualizar el contenido de un archivo, escribiendo datos sobre los existentes (a nivel físico). De los inconvenientes de nocow , también deshabilita la comprobación de la suma de comprobación para este archivo. En otras palabras, no hay vaca, no hay suma de control.

Por supuesto, establezca manualmente el atributonocowCada archivo es una tarea ingrata. Si se establece este indicador del directorio / subvolumen, todos los archivos nuevos creados en él heredarán el indicador automáticamente. Lo mismo se aplica a los directorios anidados creados. Si en el momento en que se activó el atributo, los datos ya estaban en el directorio, esto no los afectará de ninguna manera; el atributo nocowsolo se puede establecer en un archivo nuevo o vacío.

Y otra forma de configurar el indicador automáticamente nocowes montar el sistema de archivos con la opción nodatacow:

 mount -o subvol=path/to/subvol,nodatacow /dev/sdXX /path/to/mountpoint 

Esta opción hará que la opción se conecte automáticamente nodatasum, de modo que para los archivos recién creados, no se calcularán las sumas de verificación.

Como de costumbre, hay un matiz: no puede montar solo un subwoofer con una opción nocow. O todos los subvolúmenes tendrán una opción nocowo ninguna. Todo se decide por el primer subvolumen montado: si tenía una opción especificada nodatacow, todos los montajes posteriores irán con esta opción automáticamente.

Un momento no obvio surge si coloca una bandera en un archivo nocowy elimina la instantánea del subvolumen en el que se encuentra este archivo. En este caso, btrfs ignora el indicador nocowsi más de un subvolumen se refiere al bloque de datos actualizado. Por lo tanto, a pesar de la banderanocow(por cierto, el archivo también lo heredará en la instantánea), los cambios en cualquiera de los archivos irán a una nueva área en el disco y el archivo nuevamente se fragmentará. Si el bloque de datos en el archivo se actualiza varias veces, entonces la primera vez caerá en una nueva área en el disco, y con las entradas posteriores se actualizará en esta nueva área "en su lugar".

Trucos y Fallos


Cuando use btrfs-progs, puede omitir el nombre completo del comando:

 btrfs sub cre = btrfs subvolume create 

Es suficiente solo la coincidencia de los primeros caracteres, que determinan de manera única el comando:

 su = subvolume, fi = filesystem, ba = balance, de = device; 

Creo que el principio es claro.

Por desgracia, btrfs no puede crear una instantánea del directorio, pero hay una solución alternativa:

  • crear un subvolumen

     btrfs subvolume create ./subvol 
  • copiar archivos del directorio al subvolumen:

     cp -ax --reflink=always your/dir/. ./subvol 

    la clave reflink=alwaysusará el mecanismo CoW, es decir los datos no se copiarán, pero los enlaces se crearán en btrfs de bajo nivel.
  • Ahora el submundo contiene todos los archivos que estaban en el directorio, y puede eliminar la instantánea del mismo.

No nocowpuede establecer el atributo en un archivo de datos existente. Sin embargo, puede seguir el siguiente camino:

  • crear archivo vacío

     touch nocowfile 
  • ponle una bandera nocow
  • asignar espacio en disco para un nuevo archivo

     fallocate -l10g nocowfile 
  • copiar el contenido de un archivo existente a

     cp -v oldcowfile nocowfile 

Si btrfs se queda sin espacio, incluso eliminar un archivo puede causar un error "No queda espacio en el dispositivo" . Para la solución, se recomienda conectar una unidad temporal con tamaños de preferiblemente al menos 1 GB a btrfs. Luego limpie los datos. Luego retire la unidad temporal.

La operación de equilibrio , invocada sin especificar perfiles de escritura, los cambia implícitamente de dup a raid1 . Lo que, por cierto, está escrito en la página de Gotchas . Esto sucede después de agregar el disco a btrfs, que usa el perfil de escritura dup . Recuerde que formatear una sola unidad en btrfs usa el perfil dup predeterminado para metadatos y datos del sistema.

Quizás lo más importante


Evite crear clones de bajo nivel de dispositivos de bloque con btrfs. Al ser un sistema de archivos "inteligente", para algunas operaciones (la mayoría de las veces, durante el montaje) btrfs vuelve a leer los datos del sistema en dispositivos de bloque para encontrar todas las partes del sistema de archivos. Si se encuentran dos dispositivos de bloque con los mismos UUID en el proceso de búsqueda, btrfs los aceptará como parte de la misma instancia. Si al mismo tiempo estos dos dispositivos resultan ser el original y su clon, luego de montar el controlador solo sabrá cómo funcionará el sistema de archivos, pero está claro que esto no terminará con nada bueno. En el peor de los casos, provocará una corrupción irreversible de los datos.

Si realmente desea clonar discos con btrfs de una manera de bajo nivel, debe tener mucho cuidado. En general, un clon no debe ser visible para el núcleo del sistema operativo como un dispositivo de bloque mientras el original está presente en el sistema, y ​​viceversa. Proporcionando esta condición, puede cambiar el UUID del clon (bueno, o el original, aquí opcional). La utilidad btrfstune que viene con el paquete btrfs-progs ayudará a :

 btrfstune -u /path/to/device 

Y de nuevo: btrfstune , al ser una utilidad "inteligente", cambiará el UUID no solo en el disco, sino en todo el sistema de archivos. Esto significa que cuando se le llame, leerá todos los dispositivos de bloque para reemplazar el UUID en todos los dispositivos relacionados con el sistema de archivos.

En lugar de una conclusión


Si en este momento no comprende nada, esto es normal. Btrfs no es trivial y puede no sucumbir de inmediato. Cada vez que me parecía que ahora la entendía, ella lanzaba una sorpresa y la hacía repensar las cosas existentes. No puedo decir que entendí todo en el momento actual: en el proceso de escritura encontré algo nuevo, aunque ya escribí sobre la base de mi experiencia.

Compararía el proceso de dominar btrfs con la transición de un estilo de programación procesal a uno orientado a objetos. La primera impresión es "wow, qué asombroso", pero luego continúas persistentemente escribiendo código procesal envuelto en clases.

En el artículo, intenté no verter agua, escribir todo sobre el caso. A pesar de esto, resultó bastante voluminoso. Pero lejos de todo era posible decir: aún puede escribir y escribir sobre btrfs. Este artículo es solo la punta del iceberg. El principio es entender su filosofía y comenzar a usarla. Y ahora es tiempo de terminar.

Gracias por leer hasta el final. Espero no estar cansado. Escriba en los comentarios sobre qué más le interesaría saber.

Haga copias de seguridad, caballeros. Y que nunca sean útiles.

Source: https://habr.com/ru/post/458250/


All Articles