BTRFS pour les plus petits

Bonjour, Khabravchane. Je travaille chez Veeam Software et je suis l'un des développeurs de notre solution de sauvegarde Linux. Par occupation, il m'est arrivé de rencontrer BTRFS. Plus récemment, il est passé du statut «pas encore adapté» au statut «stable». Et tandis que ses premiers utilisateurs sur le réseau discutaient des problèmes et des problèmes de stabilité, nous, chez Veeam, l'avons poussé avec une baguette et avons essayé de le sauvegarder. Il s'est avéré, pour ne pas dire grand-chose - c'est trop différent, pas comme les systèmes de fichiers traditionnels. J'ai dû étudier de nombreux aspects et collecter beaucoup de râteaux avant d'apprendre à travailler avec. Dans le processus d'apprentissage, BTRFS a réussi à m'impressionner, à la fois dans le bon sens et moins. Je suis sûr qu'elle ne laissera indifférent aucun spécialiste informatique du monde Linux: certains cracheront, d'autres feront l'éloge.

Si vous avez entendu parler de ce système de fichiers, mais que vous ne savez pas pourquoi il est intéressé par les détails ou que vous cherchez où commencer à le connaître, je vous invite à chatter.

Présentation


BTRFS (B-Tree Filesystem) - système de fichiers pour les systèmes d'exploitation de type Unix, basé sur la technique Copy on Write (CoW), conçu pour fournir une facilité de mise à l'échelle du système de fichiers, un degré élevé de fiabilité et de sécurité des données, une flexibilité de configuration et une facilité d'administration, tout en maintenant en même temps à grande vitesse. C'est du moins ce que dit la page principale du wiki .

Pour respecter les formalités, nous listons les principales fonctionnalités de btrfs:

  • Taille maximale du fichier 2 ^ 64 octets
  • Table d'inode dynamique
  • Déduplication des données
  • Stockage efficace des fichiers de très petites et très grandes tailles
  • Création de sous-groupes et d'instantanés
  • Quotas de sous-volume
  • Somme de contrôle des données et des métadonnées
  • La possibilité de combiner plusieurs disques en un seul système de fichiers
  • Création d'une configuration RAID au niveau du système de fichiers
  • Compression des données
  • Défragmentation des données à la volée

Je tiens à vous avertir immédiatement que BTRFS se développe activement, et certains points peuvent différer d'une version à l'autre. Le lien - https://btrfs.wiki.kernel.org/index.php/Changelog, vous permet de savoir quand quelles fonctionnalités ont été ajoutées, modifiées ou corrigées.

Oui, BTRFS est un système de fichiers jeune et moderne qui résout un large éventail de tâches, mais pas sans ses inconvénients:

  • Son développement actif entraîne une modification de tous les points clés sur lesquels les utilitaires tiers peuvent s'appuyer lorsqu'ils travaillent avec.
  • Malgré les assurances des développeurs quant à la stabilité de BTRFS, les utilisateurs rencontrent régulièrement des problèmes pouvant entraîner une perte de données. En règle générale, ils sont de nature «flottante», de sorte qu'ils n'ont pas encore été étudiés et corrigés.
  • Haute sensibilité à la fragmentation.
  • Documentation limitée et parfois obsolète.

Une page entière est consacrée aux problèmes du système de fichiers sur différentes versions des noyaux - https://btrfs.wiki.kernel.org/index.php/Gotchas . Je vous conseille fortement de regarder là-bas - cela s'avère beaucoup intéressant et non évident.

Structure BTRFS


Le périphérique BTRFS simplifié peut être divisé selon les niveaux suivants:



Les périphériques de bloc sont situés au niveau le plus bas, représentant un ou plusieurs espaces d'adressage physiques distincts (le même «physique» que les périphériques de bloc eux-mêmes, mais ce sont déjà des détails). Grâce à des structures spéciales, les blocs de mémoire physique alloués sont combinés en un seul espace d'adressage virtuel.

Les structures de métadonnées et les blocs contenant des données utilisateur (étendues) sont déjà traités à un niveau logique. Par conséquent, les données situées séquentiellement à un niveau logique peuvent résider physiquement sur différents périphériques de bloc.

Les structures de métadonnées peuvent être divisées en niveaux. Bien sûr, je ne les classerai pas - il y en a beaucoup, et ces détails de bas niveau font l'objet d'un article séparé. Il est important ici que certaines structures de la hiérarchie se révèlent être de niveau supérieur à d'autres, et tout en haut, il y aura une structure qui est un sous-volume.

Le sous-volume est une sorte de point d'entrée, ou plutôt, les éléments racine du système de fichiers. Ils forment une couche distincte de représentation des données, qui encapsule le travail des couches inférieures, présentant les données utilisateur sous la forme habituelle: répertoires et fichiers. De plus, les sous-loups sont un élément clé du mécanisme CoW sur BTRFS. Les mêmes fichiers dans deux sous-volumes peuvent se révéler être le même ensemble de données aux niveaux inférieurs.

La dernière couche est la couche de données. Comme l'utilisateur les voit. Ce sont des fichiers et des répertoires situés dans le sous-volume.

Mais assez de théorie. Il est temps de passer à la pratique!

Btrfs-progs


Il s'agit d'un ensemble standard d'utilitaires pour la gestion de BTRFS. Selon le package de distribution avec ces utilitaires dans le référentiel peuvent avoir des noms différents: btrfsprogs , btrfs-progs , btrfs-tools , etc. Si votre référentiel n'avait rien de similaire, vous pouvez toujours le compiler manuellement, les sources ne sont pas loin - https://github.com/kdave/btrfs-progs .
Les utilitaires les plus importants de ce package sont btrfs et mkfs.btrfs . À partir de la seconde, je pense que tout est très clair - il est nécessaire de créer BTRFS sur un périphérique bloc. Tout d'abord, btrfs est l'utilitaire principal qui vous permet de faire le reste. Une sorte de "couteau suisse".

Dans cet article, j'ai utilisé la version v4.15.1. L'utilitaire se développe très activement et il existe des différences notables d'une version à l'autre. Donc, si vous n'aviez pas la commande nécessaire, vérifiez la version de l'utilitaire btrfs , elle est peut-être déjà obsolète.

De plus, très probablement, les utilitaires btrfsck et btrfstune se trouvent dans le package.

  • Le premier sert à vérifier le système de fichiers pour les erreurs et les corrections ultérieures, cependant, je ne recommande pas de l'utiliser - il est dans un état obsolète , sa fonctionnalité a été déplacée vers la commande de vérification btrfs .
  • Le second vous permet d'effectuer certaines opérations utiles sur btrfs, par exemple, de changer l'identifiant unique du système de fichiers (FS UUID), ou d'activer certaines fonctionnalités du système de fichiers.

En plus des utilitaires répertoriés ci-dessus, il existe plusieurs autres utilitaires dans le package, mais ils sont principalement nécessaires pour le débogage de btrfs et ne nous seront pas utiles dans cet article.

Formatage d'un disque en BTRFS


En pratique, tout est plus simple. Commençons par un lecteur.
Le formatage d'un seul disque dans btrfs se produit avec la commande habituelle:

mkfs.btrfs /dev/sdc -L single_drive 

En réponse, l'utilitaire affichera les paramètres du système de fichiers créé sur la console:

 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 

Passons en revue les paramètres présentés.

  • Étiquette - Un nom d'étiquette ou de système de fichiers. Il est spécifié par le commutateur -L et est un paramètre facultatif.
  • UUID est un identifiant unique qui permet au noyau btrfs de différencier les instances les unes des autres.
  • Taille du nœud - la taille des éléments de l'arbre B dans lesquels les métadonnées sont stockées. Il peut être défini à l'aide de l' -n | --nodesize -n | --nodesize , et il doit être un multiple de la taille de la taille du secteur . La petite taille du nœud entraîne une augmentation de la hauteur de l'arbre B (une augmentation du nombre de nœuds) et, par conséquent, une diminution de la concurrence pour bloquer un nœud individuel. D'un autre côté, la petite taille du nœud rend l'instance du système de fichiers plus sujette à la fragmentation. Les gros nœuds, en revanche, contribuent à un meilleur empaquetage des métadonnées sur le disque, ce qui réduit la fragmentation.
    L'inconvénient est l'augmentation du temps d'accès aux données pour la mise à jour du même nœud par plusieurs threads. Sur les noyaux antérieurs à 3.11, par défaut, la taille du nœud est de 16384 octets ou la taille de la page de mémoire du système d'exploitation (la plus grande de ces deux valeurs).
  • Taille du secteur - la quantité d'espace qui est des multiples dont l'espace est alloué et libéré au niveau physique. Elle est égale à la taille de page de la mémoire virtuelle du système d'exploitation, sauf indication contraire avec le -s .
  • Taille du système de fichiers - la capacité totale du système de fichiers (données et métadonnées). Défini manuellement avec le commutateur -b . Par défaut, tout le volume du périphérique de bloc est occupé.
  • Fonctionnalités incompatibles - une liste de fonctionnalités incluses sur les btrfs créés qui rompent la compatibilité descendante avec les anciennes versions du noyau. Si la compatibilité descendante est nécessaire, vous pouvez désactiver:

     --features ^extref,^skinny-metadata. 

    Soit dit en passant, vous pouvez vérifier les fonctionnalités prises en charge par le noyau actuel par l'appel suivant:

     mkfs.btrfs --features list-all 
  • Nombre de périphériques et de périphériques - combien de périphériques de bloc sont impliqués dans l'instance btrfs créée, et une liste de tous les périphériques, respectivement.
  • Nous devrions également parler du paramètre Block Group Profiles . Il indique le profil d'enregistrement applicable pour chacun des trois types de données: données, métadonnées et système. Revenant à la structure généralisée de btrfs, on peut dire que:

    • Les données sont des données utilisateur;
    • Les métadonnées sont une combinaison d'une couche de sous-volume et d'une couche de métadonnées et d'étendues;
    • Les systèmes sont des structures permettant de mapper l'espace d'adressage de la mémoire physique en un espace continu d'adresses logiques.

    Un profil d'enregistrement est un moyen de stocker des données au niveau physique:

    • Single - stockage des données en une seule copie;
    • DUP - duplication de données sur un seul support;
    • RAIDX est l'une des configurations de RAID0, RAID1, RAID10, RAID5 et RAID6.


Lors du balisage d'un périphérique bloc, btrfs appliquera la duplication aux métadonnées et aux données système par défaut, et les données utilisateur resteront sur le support en une seule copie. La création de btrfs sur plusieurs disques à la fois appliquera le profil «RAID0» aux données utilisateur par défaut et «RAID1» aux métadonnées.
Ce groupe de paramètres est contrôlé à l'aide de deux clés: -d pour les données et -m pour les métadonnées et les données système.

Mais il y a une nuance ... Les choses sont différentes avec les SSD. Le fait est que si nous marquions un lecteur SSD (ou un lecteur flash), par défaut, le système de fichiers ne dupliquerait pas les métadonnées. Les disques SSD peuvent étendre la déduplication des données pour prolonger la durée de vie des éléments de mémoire. C'est-à-dire ayant deux copies logiques des données, en fait une seule sera enregistrée sur le support. Par conséquent, lorsqu'un segment de mémoire échoue, les «deux copies» des données seront endommagées. De plus, en écrivant deux fois des données, la ressource SSD est simplement consommée plus rapidement.

Pour déterminer le type de support, btrfs vérifie le contenu du fichier / sys / block / DEV / queue / rotation , où "DEV" est le nom du périphérique de bloc en cours de vérification.
Bien sûr, même dans le cas d'un SSD, le profil de stockage peut être forcé.

Pour créer une instance btrfs sur plusieurs appareils, spécifiez-les simplement avec un espace:

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

ou avec des profils:

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

Il convient de noter que les supports ne doivent pas nécessairement être de la même taille, même si la mise en miroir complète est utilisée. Cependant, dès qu'il n'y a pas assez d'espace sur le plus petit lecteur pour allouer de la mémoire, le système de fichiers affiche un message indiquant qu'il n'y a pas d'espace libre, bien que physiquement il puisse toujours y avoir de l'espace libre sur d'autres supports.

Montage


Le premier montage de btrfs fraîchement créé n'est pas différent des autres systèmes de fichiers:

 mount /dev/sdc /mnt 

Si le système de fichiers se trouve sur plusieurs disques, pour le montage, il suffit de spécifier l'un d'entre eux.

En général, le montage de btrfs implique toujours le montage d'un ou plusieurs de ses sous-volumes. Si la commande mount n'est pas spécifiée, quel sous-volume doit être monté, alors btrfs lira à partir de l'enregistrement spécial l'ID du sous-volume, qui doit être monté par défaut. Cette entrée peut être modifiée ultérieurement avec la commande btrfs set-default , mais lorsque vous la montez pour la première fois sur btrfs, il n'y a qu'un seul sous-volume - celui racine. Il est spécifié par défaut pour le montage.

Le sous-monde racine sur btrfs est toujours présent. Il apparaît avec le système de fichiers et n'est soumis à aucune modification à l'avenir.

Il existe deux façons de monter un sous-volume autre que celui par défaut:
spécifiez le chemin depuis le sous-volume racine btrfs:

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

spécifiez soit l'ID de sous-volume:

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

Comme déjà mentionné, l'un des sous-volumes btrfs est spécifié comme monté par défaut. Découvrez lequel est possible en faisant:

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

Pour installer le sous-montage par défaut, vous pouvez utiliser la commande:

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

Dans ce cas, le chemin d'accès au sous-volume n'est nécessaire que pour indiquer l'instance btrfs spécifique à laquelle la commande s'applique. Soit dit en passant, il n'est pas nécessaire que ce soit un sous-monde; le chemin vers n'importe quel répertoire convient également.

La commande mount accepte un grand nombre d'options pour contrôler les capacités de btrfs: défragmentation, vidage du cache, compression, vache, journalisation, équilibre, prise en charge ssd et beaucoup d'autres choses spécifiques à btrfs. Je ne les considérerai pas dans le cadre de cet article, car ils sont nécessaires pour affiner le système de fichiers, et dans la grande majorité des cas, vous pouvez vous en passer.

Le sous-volume est


Un sous-volume est un élément clé de btrfs qui remplit diverses fonctions:

  • stockage des données utilisateur et autres sous-volumes,
  • accès aux données (montage),
  • Mécanisme CoW
  • créer des instantanés.

En première approximation, le sous-volume est un répertoire normal. Vous pouvez les renommer / déplacer, afficher leur contenu, y placer et modifier des fichiers. Aucun utilitaire spécial n'est requis.

La création et la suppression d'un sous-volume sont effectuées sur des btrfs montés à l'aide de commandes spéciales:

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

Je note que si vous essayez de supprimer le sous-volume à l'aide du gestionnaire de fichiers ou de l'utilitaire rm , l'opération se terminera par une erreur d' opération non autorisée (l'opération n'est pas autorisée).

UPD: à partir de la version 4.18.0 du noyau, les sous-volées peuvent être supprimées à l'aide de l'utilitaire rm ou des outils du gestionnaire de fichiers. Apparemment, c'était un bug, pas une fonctionnalité. Merci à Prototik habravchanin pour la clarification.

Après avoir créé un sous-volume, vous pouvez voir ses propriétés:

 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): 

Passons en revue les principales propriétés du sous-volume:

  • Nom - le nom du sous-volume
  • UUID est un identifiant unique universel qui sert principalement à déterminer les relations subwoofer-snapshot,
  • UUID parent - identifiant de l'ancêtre du sous-volume dont dérive l'actuel,
  • UUID reçu - identifiant de l'ancêtre du sous-volume envoyé via btrfs send ,
  • ID de sous-volume - un identifiant unique pour le placement dans l'arbre B,
  • Génération - numéro de transaction lors de la dernière mise à jour des métadonnées de sous-volume,
  • Gén à la création - numéro de transaction au moment de la création du sous-volume,
  • ID parent - identifiant du sous-volume dans lequel le courant est intégré,
  • L'ID de niveau supérieur est exactement le même que l'ID parent,
  • Drapeaux - drapeaux (en fait, un seul drapeau est en lecture seule ),
  • Instantanés - une liste d'instantanés pris à partir de ce sous-volume.

Le sous-volume a un paramètre de plus - c'est son chemin depuis l'élément racine btrfs. Le chemin est affiché lors de la liste du sous-volume:

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

Mais ici, tout est simple et clair - cela n'a même pas de sens d'apporter la sortie de la commande.
Comme pour les commandes get-default et set-default , vous pouvez spécifier ici le chemin d'accès à n'importe quel sous-volume, le résultat ne changera pas. Ce chemin est utilisé pour trouver les btrfs du sous-bol racine. Après quoi tout l'arbre sous-wolum est lu.

Si vous essayez de copier le sous-volume, par exemple, avec l'utilitaire cp , l'opération de copie réussira, mais en conséquence, non le sous-volume sera créé, mais le répertoire habituel. Cependant, btrfs fournit un outil beaucoup plus flexible pour créer de telles copies - des instantanés.

Le snapshot est


Snapshot est également un sous-monde, ayant juste des propriétés avancées.

Leur principale différence est que l'instantané contient des enregistrements à partir desquels il a été produit. Il s'agit des champs UUID parent et UUID reçu . Dans le caisson de basses, ces champs sont également présents, mais ils sont toujours vides. Donc, en fait, un instantané et un sous-volume sont une seule et même chose.
Lors de la création, vous pouvez bloquer l'instantané des modifications à l'aide du commutateur -r .

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

Dans ce cas, les fichiers sont garantis dans leur état d'origine au moment de la création de l'instantané.

L'indicateur en lecture seule peut également être contrôlé manuellement, cela fonctionne pour n'importe quel sous-volume:

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

Si nous regardons maintenant les propriétés de l'instantané, nous verrons le champ UUID parent rempli:

 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): 

Une caractéristique importante de l'opération d'instantané est qu'elle n'est pas récursive. Au lieu d'un sous-volume imbriqué, des répertoires vides seront créés dans l'instantané.

Passons à l'exemple suivant.

Sur le système de fichiers, il y a un subwoofer «sub0», à l'intérieur duquel se trouve un subwoofer subA et un répertoire dirB . À l'intérieur de chacun d'eux se trouvent respectivement le fichierA et le fichierB .

Supprimer l'instantané:

 btrfs subvolume snapshot sub0 snap0 



Le snapshot snap0 créé héritera de tous les fichiers et répertoires de son parent, cependant, le subwoofer subA n'apparaîtra pas dans le snapshot. Au lieu de cela, seul un répertoire vide apparaîtra dans l'instantané, c'est-à-dire le contenu du sous- volume subA ne sera pas hérité.

D'une part, c'est bien - nous supprimons l'instantané d'un sous-volume spécifique, et tous ceux imbriqués ne nous intéressent pas. D'un autre côté, si un instantané récursif est requis, alors btrfs n'a pas de solution à ce problème. Nous devrons chercher des tournées de travail.

La première solution de contournement est basée sur le fait que l'instantané a été supprimé sans indicateur de lecture seule, ce qui vous permet de corriger la situation tout simplement:

  • supprimer un répertoire supplémentaire de l'instantané

     rmdir snap0/subA 

  • supprimer un instantané d'un sous-volume imbriqué

     btrfs subvolume snapshot sub0/subA snap0/subA 




Si l'instantané a été supprimé avec l'indicateur de lecture seule, l'option ci-dessus ne fonctionnera pas, car dans snap0, vous ne pouvez ni supprimer le répertoire ni placer un instantané. Il n'y a qu'une seule option - placer des instantanés quelque part près du caisson de basses snap0:

 btrfs subvolume snapshot sub0/subA snapA 

puis montez snapA dans l'instantané snap0 , le répertoire correspondant est déjà là:

 mount -o subvol=snapA snap0/subA 



Dans tous les cas, il est important de comprendre que les instantanés récursifs seront tous tournés dans différentes opérations, à des moments différents. Il ne peut être question d'une suppression atomique d'un instantané de plusieurs sous-volumes.

Copie en écriture


Un peu sur le sous-volume et l'approche CoW. Imaginez qu'un sous-volume soit présent sur le système de fichiers et qu'un fichier s'y trouve (prenez le cas idéal - le fichier n'est pas fragmenté). Ensuite, un instantané est supprimé du sous-chariot.



Un nouveau sous-volume (instantané) apparaîtra sur le système de fichiers avec exactement le même contenu que le sous-volume d'origine. Le processus de création d'un instantané est presque instantané - les données du fichier lui-même ne sont pas copiées. Au lieu de cela, des métadonnées supplémentaires sont créées et un instantané avec le sous-volume parent devient le propriétaire du fichier. En fait, il n'y avait qu'un seul fichier sur le disque, mais maintenant il appartient à la fois au sous-volume et à l'instantané.
Si vous modifiez maintenant le fichier dans le sous-volume, les modifications n'affecteront pas le fichier dans l'instantané. Si l'indicateur de lecture seule n'a pas été défini lors de la création de l'instantané, le fichier de l'instantané peut également être modifié.



Techniquement, lorsqu'un fichier est modifié, seules ces modifications sont enregistrées. Ainsi, le fichier source sera stocké sur le disque plus un delta qui distingue le fichier d'origine du fichier modifié. Si vous supprimez l'un des sous-volumes (par la seconde je veux dire un instantané), les données en excès qui ne sont plus utilisées par personne seront effacées du disque, et seule la version actuelle du fichier restera sur le disque (du point de vue du sous-volume restant).

Une courte note : lors du retrait, le caisson de graves disparaîtra instantanément des yeux de l'utilisateur, et l'utilitaire rendra le contrôle au terminal, cependant, les données sur le disque seront nettoyées par le processus d'arrière-plan pendant un certain temps. Autrement dit, contrairement à la suppression d'un répertoire normal, il n'est pas nécessaire d'attendre la fin réelle de l'opération de suppression. Si vous devez vous synchroniser avec ce processus et attendre qu'il se termine, vous pouvez spécifier le --commit-after lors de l'appel de la suppression . La commande btrfs subvolume list , invoquée avec le commutateur -d , affiche une liste des sous-volumes qui ont été supprimés par l'utilisateur et sont en train d'être supprimés du disque.

De plus, btrfs vous permet de cloner des fichiers sur le système de fichiers sans avoir recours à des instantanés. Cela se fait en copiant régulièrement avec l' --reflink :

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

La reflink=always indique au système de fichiers que nous voulons utiliser le mécanisme CoW lors de la copie. Après la copie, les fichiers peuvent être modifiés indépendamment les uns des autres, de sorte que nous obtenons le même comportement qu'après la création d'un instantané. Alors pourquoi avons-nous besoin de sous-bols?

Les sous-volumes sur btrfs jouent le rôle d'un outil de contrôle de haut niveau pour des ensembles de données entiers: d'une part, il s'agit de la suppression d'instantanés atomiques de toutes les données d'un sous-volume (dans le cas où --reflink atomicity n'est qu'au niveau du fichier), et d'autre part, il est possible de voir de qui il est hérité ou «restaurez» rapidement l'ensemble de données dans une version antérieure, etc.
Ainsi, btrfs offre la possibilité de capturer les états des fichiers aux moments souhaités, en utilisant le sous-volume comme moyen de haut niveau pour gérer ces états.

Récupération de sous-volume


Dans les vastes étendues, la question se pose souvent: "J'ai un subwoofer, j'ai un instantané, comment faire un reverse?" Cette approche n'est pas applicable à btrfs, car il n'y a aucune possibilité de "faire reculer le sous-chariot". Au lieu de cela, btrfs propose une stratégie pour remplacer le sous-chariot par son instantané. En effet, pourquoi revenir sur quelque chose, si l'instantané lui-même est cet objet que nous voulons obtenir avec revenir.

Imaginez ce scénario: sur btrfs il y a un sous-volume dans lequel se trouvent les fichiers d'une base de données (enfin, ou d'autres données importantes). Les instantanés sont périodiquement supprimés de ce sous-volume et, à un moment donné, il est nécessaire de restaurer les données. Dans ce cas, nous nous débarrassons simplement du sous-groupe et commençons à la place à utiliser l'instantané qui en est extrait, ou - si nous ne voulons pas gâcher ces données également - nous supprimons un autre instantané de l'instantané. Si le sous-monde d'origine n'a pas été monté et utilisé comme répertoire normal, il doit alors être supprimé ou déplacé / renommé, et un instantané doit être mis à sa place.



Dans la console, cela pourrait ressembler à ceci:

  • renommer la subwolly

     mv the_subvolume the_subvol.old 
  • mettre son instantané à la place du sous-volume

     btrfs subvolume snapshot the_snapshot the_subvolume 

Si le sous-volume a été monté et utilisé via le point de montage, il suffit de démonter le sous-volume et de monter un instantané à sa place.



  • Démontez le caisson de basses

     umount /mnt/ 
  • Vous pouvez créer un instantané d'un instantané afin de ne pas gâcher les dernières données survivantes:

     btrfs subvolume snapshot /path/to/snapshot /path/to/snapshot_copy 
  • montage instantané:

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

Pour être complet, je vais réessayer et un peu différemment. Le sous-volume dans lequel les changements se produisent est la branche principale .



Lors de la création d'un instantané, l'état des fichiers sur le disque est fixe. Désormais, un instantané est un brunch de la branche principale . Toutes les autres modifications apportées à main principale n'affecteront en aucun cas l'instantané. Revenir à l'instantané signifie arrêter l'utilisation de la branche principale et passer complètement au brunch. La branche principale peut être supprimée car inutile. Ainsi, btrfs est pratiquement un système de contrôle de version, mais sans possibilité de fusionner les branches.

Arborescence du système de fichiers


L'un des points non évidents associés à l'utilisation de btrfs est de savoir comment diviser les données système en sous-volume. Bien sûr, il n'y a pas de «bonne» approche à ce problème. Mais il y a 3 façons d'organiser la structure du sous-volume: une structure plate, imbriquée et mixte.

Une structure plate signifie que le sous-volume est placé dans une liste plate dans le sous-volume racine. Par exemple, vous pouvez sélectionner la racine du système de fichiers (appelons-la root ), le répertoire utilisateur home , le répertoire avec le site / var / www et la base de données située par exemple dans / var / database comme sous-volumes séparés.



Pour plus de commodité, certains sous-volumes peuvent être placés dans des répertoires, comme, par exemple, dans le cas du sous-volume var / www .

Avec cette approche, tous les sous-volumes doivent être montés. Le sous- root doit avoir un point de montage /, et à l'intérieur il doit contenir les répertoires home et var .Après le montage de la racine dans la maison / doit être installé sabvolyum la maison et dans le / var / www et / var / databas e - sabvolyumy var / www et base de données , respectivement.

Ainsi, l'arborescence de btrfs-subvolume peut être affichée arbitrairement dans le système de fichiers virtuel de l'OS, et il y en a déjà assez pour cela.

Avantages:

  • l'utilisateur ne voit que le sous-volume monté,
  • il est facile de remplacer le subwoofer (démonter l'un, monter l'autre),
  • subwoofer facile à retirer.

Inconvénients:

  • il est facile de se demander où l'installer,
  • pour chaque sous-volume, il devrait y avoir une entrée dans fstab, et s'il y a des «rollbacks» aux instantanés, alors les entrées correspondantes dans fstab doivent également être mises à jour.

La structure imbriquée du sous-volume suggère une utilisation simple du sous-volume au lieu de certains répertoires.



Dans ce cas, en plus du sous-volume racine, rien de plus n'est requis pour être monté.

Avantages:

  • tous les sous-volumes sont visibles, la structure est facile à percevoir,
  • vous n'avez plus besoin de monter quoi que ce soit, tout est comme avec un système de fichiers «normal».

Inconvénients:

  • tous les sous-volumes sont visibles, peut-être que certains voudraient se cacher de l'utilisateur,
  • il est difficile de retirer / remplacer le sous-loup (la raison en est les sous-loups imbriqués).

Eh bien, la troisième approche est mixte. Il implique une combinaison des deux premiers pour maximiser les avantages des deux. Cependant, il est possible que cette approche particulière conduise à une structure complexe, difficile à modifier et confuse avec un grand nombre d'entrées dans fstab. Tout dépend de la sobriété de l'administrateur système.



Ajouter / retirer un disque, équilibrer


btrfs possède d'excellentes fonctionnalités - la possibilité d'ajouter des périphériques bloqués à chaud directement pendant le fonctionnement du système de fichiers:

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

Ou supprimez:

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

Soit dit en passant, dans un seul appel d'ajout / suppression, vous pouvez spécifier plusieurs disques.
Encore une fois, le chemin spécifié est le chemin vers tout sous-volume de ce btrfs auquel la commande sera appliquée.

Vérifions le nombre et les périphériques de blocs contrôlés par 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 dans le champ utilisé nous indique que le disque ajouté est vide. Pour le remplir de données en fonction du profil d'enregistrement, vous devez équilibrer:

 btrfs balance start /path/to/btrfs 

La commande balance redistribue les données sur les disques en fonction du profil d'enregistrement sélectionné. Par exemple, dans le cas de RAID1, l'équilibre entraînera le clonage des données du périphérique d'origine, dans le cas de RAID0, cela conduira à une distribution plus uniforme des données sur deux disques, etc.
En raison de l'équilibre, si auparavant il y avait des vides sur le disque, les données sur le disque seront écrites de manière plus dense, c'est-à-dire la défragmentation se révélera. Cependant, il est important de comprendre qu'il ne s'agit pas exactement de «cette» défragmentation. Dans ce cas, la commande balance ne regarde pas le contenu logique, mais ne fonctionne que sur les blocs de données. Elle ne fait pas attention au fait qu'un fichier soit étalé sur le disque. Au lieu de cela, le solde transfère les blocs de données d'un endroit à un autre. C'est-à-direun fichier fragmenté pour équilibrer restera fragmenté après lui. Mais! La fragmentation au niveau des blocs de données continuera de diminuer, et cela peut être utilisé.

Pour éviter toute confusion, disons ceci: l'opération d' équilibrage réduit la fragmentation au niveau des blocs de données, mais n'affecte pas la fragmentation des fichiers.

De plus, la commande de balance offre la possibilité de modifier le profil d'enregistrement. Par exemple, le profil DUP a été utilisé sur le disque, et après avoir ajouté le disque, ils ont décidé de faire un RAID1 complet. Pour ce faire, utilisez le filtre convert:

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

À l'aide des options -dconvertet, de -mconvertnouveaux profils d'enregistrement sont définis pour les données et les métadonnées, respectivement. Il existe également l'option -sconvert, qui est conçue pour modifier le profil d'écriture des données système, mais vous devrez également ajouter le commutateur -f (--force) avec lui pour forcer l'opération.

En général, l'objectif principal des filtres est de définir les règles de l'opération d'équilibrage: quels blocs traiter et lesquels ne pas toucher. Ainsi, par exemple, vous ne pouvez affecter que des blocs enregistrés avec un profil d'enregistrement spécifique (profils de filtre), ou des blocs occupés au-dessus d'un certain pourcentage (filtre d'utilisation), ou vous ne pouvez affecter que des groupes de blocs liés à un disque particulier (filtre dévid), etc. À propos, ils peuvent toujours être combinés. En général, les capacités des filtres sont très étendues et sont principalement nécessaires pour effectuer un équilibre sélectif des données.

Fragmentation


Malheureusement, btrfs, en raison de son architecture, est extrêmement sensible à un phénomène tel que la fragmentation. Le fait est que les données sont toujours écrites dans un nouvel emplacement sur le disque. Même si vous lisez le fichier, ne faites rien avec les données et réécrivez-les dans le même fichier, les données iront dans une nouvelle zone sur le disque. La même chose se produit si vous ne mettez à jour que partiellement les données du fichier - les modifications sont écrites dans une nouvelle zone du disque. Ainsi, les changements fréquents de fragments de fichiers très fortement, augmentant la «dispersion» des fragments, dans le cas général, sur plusieurs disques. Cela entraîne une charge accrue sur le processeur et une consommation de mémoire inutile. Les plus fragmentés sont les bases de données et les images de machines virtuelles.

Vous pouvez évaluer la fragmentation des fichiers à l'aide de l'utilitaire filefrag (non inclus dans btrfs-progs).

 filefrag /path/to/your/file 

Il indique le nombre d'extensions utilisées pour stocker le fichier. Autrement dit - moins il y a d'extensions, moins le fichier est fragmenté.

Il existe deux méthodes pour lutter contre la fragmentation sur btrfs: la défragmentation et l'indicateur nocow.

La défragmentation peut être appliquée à un seul fichier ou à un sous-volume / répertoire, y compris récursivement. La commande est la suivante:

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

Je dois dire que cette équipe ne conduit pas toujours aux résultats escomptés. Les petits fichiers légèrement fragmentés (10 à 20 extensions) après la défragmentation peuvent être divisés en plusieurs parties. De plus, la défragmentation btrfs sur certaines versions du noyau rompt la déduplication des fichiers, ce qui en fait de véritables copies physiques. C'est-à-direles instantanés au niveau physique deviendront des copies complètes.

La deuxième façon de lutter contre la fragmentation consiste à utiliser un attribut de fichier nocow.

 chattr +C /path/to/file 

L'attribut nocowne peut être défini que sur un fichier nouveau ou vide. Il désactive le mécanisme de copie en écriture , donc btrfs fonctionnera toujours avec une zone de disque fixe lors de la mise à jour du contenu d'un fichier, en écrivant des données sur celles existantes (au niveau physique). Parmi les inconvénients de nocow - il désactive également la vérification de la somme de contrôle pour ce fichier. En d'autres termes, pas de vache - pas de somme de contrôle.

Bien sûr, définissez manuellement l'attributnocowchaque fichier est une tâche ingrate. Si cet indicateur du répertoire / sous-volume est défini, tous les nouveaux fichiers créés dans celui-ci hériteront automatiquement de l'indicateur. Il en va de même pour les répertoires imbriqués créés. Si au moment où l'attribut a été activé, des données étaient déjà dans le répertoire, cela ne les affectera en aucune façon - l'attribut nocowne peut être défini que dans un fichier nouveau ou vide.

Et une autre façon de définir l'indicateur automatiquement nocowest de monter le système de fichiers avec l'option nodatacow:

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

Cette option entraînera la connexion automatique de l'option nodatasum, de sorte que pour les fichiers nouvellement créés, les sommes de contrôle ne seront pas calculées.

Comme d'habitude, il y a une nuance: vous ne pouvez pas monter un seul subwoofer avec une option nocow. Soit tous les sous-volumes auront une option nocow, soit aucune. Tout est décidé par le premier sous-volume monté: si une option était spécifiée nodatacow, tous les montages suivants iront automatiquement avec cette option.

Un moment non évident se produit si vous placez un indicateur sur un fichier nocowet supprimez l'instantané du sous-volume dans lequel se trouve ce fichier. Dans ce cas, btrfs ignore l'indicateur nocowsi plusieurs sous-volumes font référence au bloc de données mis à jour. Par conséquent, malgré le drapeaunocow(par ailleurs, le fichier en héritera également dans l'instantané), les modifications apportées à l'un des fichiers iront dans une nouvelle zone sur le disque et le fichier sera à nouveau fragmenté. Si le bloc de données du fichier est mis à jour plusieurs fois, la première fois, il tombera dans une nouvelle zone sur le disque et, avec les entrées suivantes, il sera mis à jour dans cette nouvelle zone «en place».

Astuces et échecs


Lorsque vous utilisez btrfs-progs, vous pouvez omettre le nom complet de la commande:

 btrfs sub cre = btrfs subvolume create 

Il suffit juste de la coïncidence des premiers caractères, qui déterminent uniquement la commande:

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

Je pense que le principe est clair.

Hélas, btrfs ne peut pas créer un instantané du répertoire, mais il existe une solution:

  • créer un sous-volume

     btrfs subvolume create ./subvol 
  • copiez les fichiers du répertoire dans le sous-volume:

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

    la clé reflink=alwaysutilisera le mécanisme CoW, c'est-à-dire les données ne seront pas copiées, mais des liens vers celles-ci seront créés à un btrfs de bas niveau.
  • Maintenant, le sous-monde contient tous les fichiers qui se trouvaient dans le répertoire, et vous pouvez en supprimer l'instantané.

Vous nocowne pouvez pas définir l' attribut sur un fichier de données existant. Cependant, vous pouvez suivre le chemin suivant:

  • créer un fichier vide

     touch nocowfile 
  • lui mettre un drapeau nocow
  • allouer de l'espace disque pour un nouveau fichier

     fallocate -l10g nocowfile 
  • copier le contenu d'un fichier existant dans

     cp -v oldcowfile nocowfile 

Si btrfs manque d'espace, même la suppression d'un fichier peut provoquer une erreur «Il ne reste plus d'espace sur le périphérique» . Pour la solution, il est recommandé de connecter un lecteur temporaire avec des tailles de préférence d'au moins 1 Go à btrfs. Nettoyez ensuite les données. Retirez ensuite le lecteur temporaire.

L'opération d' équilibrage , invoquée sans spécifier de profils d'écriture, les fait implicitement passer de dup à raid1 . Ce qui est d'ailleurs écrit sur la page Gotchas . Cela se produit après l'ajout du disque à btrfs, qui utilise le profil d'écriture dup . Rappelez-vous que le formatage d'un seul lecteur dans btrfs utilise le profil de dup par défaut pour les métadonnées et les données système.

Peut-être le plus important


Évitez de créer des clones de bas niveau de périphériques de blocs avec btrfs. Étant un système de fichiers «intelligent», pour certaines opérations (le plus souvent, lors du montage), btrfs relit les données système sur les périphériques de bloc par lui-même pour trouver toutes les parties du système de fichiers. Si deux périphériques de bloc avec les mêmes UUID sont trouvés dans le processus de recherche, alors btrfs les acceptera comme faisant partie de la même instance. Si, cependant, ces deux périphériques s'avèrent être l'original et son clone, alors après le montage, le pilote seul sait comment le système de fichiers fonctionnera, mais il est clair que cela ne se terminera pas par quelque chose de bon. Dans le pire des cas, cela entraînera une corruption irréversible des données.

Si vous voulez vraiment cloner des disques avec btrfs de manière basique, une extrême prudence doit être prise. En général, un clone ne doit pas être visible par le noyau du système d'exploitation en tant que périphérique de bloc tant que l'original est présent dans le système, et vice versa. En fournissant cette condition, vous pouvez changer l'UUID du clone (enfin, ou l'original, ici facultatif). L'utilitaire btrfstune fourni avec le package btrfs-progs vous aidera à :

 btrfstune -u /path/to/device 

Et encore: btrfstune , étant un utilitaire «intelligent», changera l'UUID non seulement sur le disque, mais sur l'ensemble du système de fichiers. Cela signifie que lorsqu'elle sera appelée, elle lira tous les périphériques de bloc afin de remplacer l'UUID sur tous les périphériques liés au système de fichiers.

Au lieu d'une conclusion


Si en ce moment vous ne comprenez rien, c'est normal. Btrfs n'est pas trivial et peut ne pas succomber immédiatement. Chaque fois qu'il me semblait que maintenant je la comprenais, elle me faisait une surprise et lui faisait repenser les choses existantes. Je ne peux pas dire que j'ai tout compris à l'heure actuelle - en train d'écrire, j'ai trouvé quelque chose de nouveau, même si j'ai déjà écrit sur la base de mon expérience.

Je comparerais le processus de maîtrise de btrfs avec la transition d'un style de programmation procédural à un style orienté objet. La première impression est «wow, comme c'est génial», mais ensuite vous continuez constamment à écrire du code procédural enveloppé dans des classes.

Dans l'article, j'ai essayé de ne pas verser d'eau - d'écrire tout sur l'affaire. Malgré cela, cela s'est avéré assez volumineux. Mais loin de tout, il était possible de le dire - vous pouvez toujours écrire et écrire sur btrfs. Cet article n'est que la pointe de l'iceberg. Le tout début est de comprendre sa philosophie et de commencer à l'utiliser. Et maintenant, il est temps de finir.

Merci d'avoir lu jusqu'au bout. J'espère pas fatigué. Écrivez dans les commentaires ce que vous aimeriez savoir d'autre.

Faites des sauvegardes, messieurs. Et laissez-les ne jamais vous être utiles.

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


All Articles