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

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

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-à-dire
un 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 -dconvert
et, de -mconvert
nouveaux 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-à-dire
les 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 nocow
ne 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'attributnocow
chaque 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 nocow
ne peut être défini que dans un fichier nouveau ou vide.Et une autre façon de définir l'indicateur automatiquement nocow
est 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 nocow
et supprimez l'instantané du sous-volume dans lequel se trouve ce fichier. Dans ce cas, btrfs ignore l'indicateur nocow
si 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:Vous nocow
ne pouvez pas définir l' attribut sur un fichier de données existant. Cependant, vous pouvez suivre le chemin suivant: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.