Recherche sur le site Web

Comment créer des instantanés sous Linux


Un instantané est une image de l’état d’un système de fichiers à un moment précis. Les instantanés sont vraiment utiles pour « remonter le temps » et ramener le système à un bon état connu si quelque chose ne va pas. Au moment d’écrire ces lignes, il existe deux façons natives principales de créer des instantanés atomiques sous Linux : en utilisant LVM (Logical Volume Manager) ou en créant un système de fichiers BTRFS, qui a des instantanés comme fonctionnalité intégrée.

Dans ce tutoriel, nous apprenons les différences entre les instantanés LVM et BTRFS, comment les créer et les gérer sous Linux.

Dans ce tutoriel, vous apprendrez :

  • Comment créer et gérer des instantanés LVM traditionnels et légers
  • Comment créer et gérer des instantanés du BTRFS

LVM contre BTRFS

Comparer LVM à BTRFS n’est pas tout à fait équitable : alors que ce dernier est un système de fichiers, le premier est un gestionnaire de volumes, qui fonctionne comme une couche d’abstraction sur les périphériques de stockage, offrant une flexibilité supplémentaire dans la gestion de l’espace en introduisant des concepts tels que des volumes logiques et des groupes de volumes. En comparant les deux, alors? Nous le faisons parce que le système de fichiers BTRFS intègre au niveau du système de fichiers certaines fonctionnalités qui, du moins sous Linux, étaient traditionnellement implémentées en utilisant LVM. Un système de fichiers BTRFS peut, par exemple, s’étendre sur plusieurs appareils; il peut être utilisé pour implémenter des configurations RAID et, ce qui nous intéresse le plus dans ce cas, supporte la création d’instantanés atomiques.

Bien que les instantanés LVM et BTRFS servent, plus ou moins, le même objectif, ils sont complètement différents : les premiers sont créés en tant que périphériques de blocs, tandis que les seconds sont créés en utilisant des espaces de noms sur le système de fichiers principal.

Instantanés LVM épais et minces

Lorsque nous parlons de LVM, nous devons faire la distinction entre les volumes et instantanés logiques traditionnels (« épais ») et minces. Nous avons parlé en détail de LVM thin provisioning dans un article récent; Ici, en quelques mots, nous pouvons dire que la principale différence entre les volumes épais et minces est la façon dont l’espace est réparti. Lors de l’utilisation de volumes logiques LVM traditionnels, l’espace est alloué au moment de la création; Les volumes « minces », au contraire, sont créés avec une taille « virtuelle ». Ils font partie de bassins de stockage minces à partir desquels l’espace n’est alloué qu’en cas de besoin.

Lors de la création d’un instantané traditionnel ou « épais », tout comme lors de la création d’un volume logique régulier, nous devons spécifier l’espace que nous voulons lui allouer dans un groupe de volumes. L’espace est immédiatement réservé à l’instantané, qui n’a pas besoin d’être aussi grand que son origine, puisqu’il n’est utilisé que pour stocker les blocs qui vont être modifiés sur le volume source. Avant d’être modifiées, les données sur le volume d’origine sont conservées en étant copiées dans l’instantané : cette stratégie s’appelle Copy On Write (CoW). Un instantané LVM traditionnel doit être suffisamment grand pour stocker tous les changements qui se produisent à son origine : s’ils se remplissent, ils sont automatiquement abandonnés.

Les instantanés épais ne sont pas destinés à être stockés pendant de longues périodes : ils sont généralement utilisés pour obtenir un état de système de fichiers « gelé », utile pour créer des sauvegardes cohérentes; ils sont généralement jetés immédiatement après la fin de ces sauvegardes. C’est parce qu’ils ont un impact important sur la performance. Comme ils ne partagent pas de données, un changement sur l’origine nécessite autant d’opérations CoW que le nombre d’instantanés existants.

Création et gestion d’un instantané épais d’un volume logique LVM traditionnel

Voyons comment créer un instantané épais d’un volume logique LVM traditionnel. Dans l’exemple ci-dessous, nous avons un volume logique nommé « root ». Le volume logique existe dans le groupe de volumes appelé « fedora », qui, comme vous pouvez le voir dans la sortie de la commande vgdisplay, a de l’espace libre :

 --- Volume group ---
 VG Name fedora
 System ID 
 Format lvm2
 Metadata Areas 1
 Metadata Sequence No 6
 VG Access read/write
 VG Status resizable
 MAX LV 0
 Cur LV 1
 Open LV 1
 Max PV 0
 Cur PV 1
 Act PV 1
 VG Size 48.41 GiB
 PE Size 4.00 MiB
 Total PE 12393
 Alloc PE / Size 5120 / 20.00 GiB
 Free PE / Size 7273 / 28.41 GiB
 VG UUID ZX67es-BWk3-SENV-L25P-VwvI-mqsx-qCqxVJ

Supposons que nous voulions créer une sauvegarde du volume logique « racine », qui est monté sur « / ». Effectuer une sauvegarde d’un système de fichiers monté n’est pas une bonne idée, car les fichiers peuvent être modifiés au fur et à mesure que la sauvegarde elle-même est effectuée. En créant un instantané du volume, nous pouvons obtenir une vue « figée » du système de fichiers sans baisser le système. Comme nous l’avons déjà dit, notre instantané doit être suffisamment grand pour contenir tous les changements qui peuvent survenir au volume source, au cours d’une période donnée. Dans l’exemple ci-dessous, nous créons un instantané d’une taille de 5 Gio :

sudo lvcreate -s /dev/fedora/root -L 5GiB -n root-snapshot0

Pour créer l’instantané, nous invoquons lvcreate avec l’option -s (abréviation de --snapshot). Nous fournissons la quantité d’espace que nous voulons allouer à l’instantané comme argument à -L (abréviation de --size), et le nom de l’instantané comme argument à -n (abréviation de --name). Une fois créé, un instantané est visible dans la sortie de la commande lvs :

 LV             VG     Attr       LSize  Pool Origin Data% Meta% Move Log Cpy%Sync Convert
 root           fedora owi-aos--- 20.00g 
 root-snapshot0 fedora swi-a-s---  5.00g      root   0.01

On peut reconnaître un instantané LVM traditionnel en regardant la valeur de la colonne « Attr » : là, on trouvera que le premier bit d’attribut est « s ». Dans la colonne « Origine », nous pouvons également voir le nom du volume sur lequel l’instantané est basé (« racine », dans ce cas). Encore une fois, puisque nous avons affaire à un instantané traditionnel, l’espace que nous lui avons alloué est immédiatement retiré du groupe de volumes :

 --- Volume group ---
 VG Name fedora
 System ID 
 Format lvm2
 Metadata Areas 1
 Metadata Sequence No 13
 VG Access read/write
 VG Status resizable
 MAX LV 0
 Cur LV 2
 Open LV 1
 Max PV 0
 Cur PV 1
 Act PV 1
 VG Size 48.41 GiB
 PE Size 4.00 MiB
 Total PE 12393
 Alloc PE / Size 6400 / 25.00 GiB
 Free PE / Size 5993 / 23.41 GiB
 VG UUID ZX67es-BWk3-SENV-L25P-VwvI-mqsx-qCqxVJ

En plus d’utiliser l’instantané pour créer une sauvegarde cohérente du volume d’origine, nous pouvons le « fusionner » à l’origine, pour supprimer tous les changements survenus depuis la création de l’instantané. Pour fusionner un instantané à son origine, nous utilisons la commande lvconvert avec l’option --merge, fournissant le chemin de l’instantané comme argument. Pour fusionner l’instantané root-snapshot0 avec le volume racine, par exemple, nous exécutons :

sudo lvconvert --merge /dev/fedora/root-snapshot0

Si le volume d’origine et l’instantané peuvent être fermés, la « fusion » se produit immédiatement; Si ce n’est pas possible, comme dans ce cas, la fusion aura lieu lors de leur prochaine activation (très probablement lors du prochain redémarrage). Après avoir été fusionné, un instantané est supprimé. Si au lieu de fusionner l’instantané, nous voulons le supprimer immédiatement, nous utilisons la commande lvremove :

sudo lvremove /dev/fedora/root-snapshot0

Création et gestion d’instantanés légers de volumes logiques légers LVM

Les snapshots LVM légers sont beaucoup plus efficaces que les snapshots traditionnels, car ils vivent dans le même pool de stockage d’origine : ils partagent des données avec eux et avec d’autres snapshots. Supposons que nous ayons un volume LVM mince appelé « racine » à l’intérieur d’un pool mince appelé « pool00 » :

 LV     VG     Attr       LSize   Pool   Origin Data% Meta% Move Log Cpy%Sync Convert
 pool00 fedora twi-aotz-- <38.61g               5.63   12.15 
 root   fedora Vwi-aotz-- <38.61g pool00        5.63

Pour créer un instantané du volume « racine », encore une fois, nous utilisons la commande lvcreate; cette fois, cependant, nous n’en spécifions pas de taille. Les instantanés minces sont toujours créés avec la même taille virtuelle que celle de leur origine :

sudo lvcreate -s /dev/fedora/root -n root-snapshot0

Voici la sortie de la commande lvs, après la création de l’instantané :

LV             VG     Attr       LSize   Pool   Origin Data% Meta% Move Log Cpy%Sync Convert
pool00         fedora twi-aotz-- <38.61g               5.64  12.26 
root           fedora Vwi-aotz-- <38.61g pool00        5.63 
root-snapshot0 fedora Vwi---tz-k <38.61g pool00 root

Comme on peut le voir, le volume « racine » est rapporté comme l’origine de l’instantané; L’instantané et le volume original ont la même taille virtuelle. Dans ce cas, nous surprovisionnons, car la somme des tailles virtuelles du volume d’origine et de l’instantané est plus grande que l’espace réel du pool.

Les instantanés minces sont créés avec l’indicateur « activations skip », qui est signalé sous la forme d’un « k » dans le dernier bit de la valeur de la colonne « Attr ». Cela empêche leur activation lors de l’utilisation de commandes d’activation. Pour activer tous les volumes logiques d’un groupe de volumes, par exemple, nous utiliserions la commande vgchange -ay. Cela n’activerait pas les volumes avec l’indicateur de saut d’activation, à moins que nous n’utilisions l’option -K (abréviation de --ignoreactivationskip), par exemple :

sudo vgchange -a y -K /dev/fedora

Pour supprimer l’indicateur d’activation de saut d’un volume mince, nous pouvons utiliser la commande lvchange avec l’option -k. Pour supprimer l’indicateur « skip activation » de l’instantané « root-snapshot0 », par exemple, nous exécuterions :

sudo lvchange -k n /dev/fedora/root-snapshot0

Comme nous l’avons déjà dit, nous pouvons créer efficacement plusieurs instantanés minces du même volume logique mince, et même des instantanés d’un instantané. Créons un autre instantané du volume « racine » :

sudo lvcreate -s /dev/fedora/root -n root-snapshot1

Encore une fois, l’instantané est créé avec la même taille virtuelle que son origine :

LV             VG     Attr       LSize   Pool   Origin Data% Meta% Move Log Cpy%Sync Convert
pool00         fedora twi-aotz-- <38.61g               5.89  12.57 
root           fedora Vwi-aotz-- <38.61g pool00        5.84 
root-snapshot0 fedora Vwi---tz-k <38.61g pool00 root 
root-snapshot1 fedora Vwi---tz-k <38.61g pool00 root

Tout comme lors de l’utilisation de volumes logiques et d’instantanés standard, nous pouvons fusionner directement un instantané mince à son origine à l’aide de la commande lvconvert. Comme dans le cas des instantanés traditionnels, cela entraîne la suppression de l’instantané fusionné. Cependant, lorsque l’on utilise des volumes minces, la fusion d’un instantané a également pour effet de supprimer la référence « origine » d’autres instantanés basés sur le même volume original. Bien qu’ils contiennent toujours les données qui représentent l’état de l’origine au moment de leur création, nous ne pourrons pas les fusionner directement à l’aide de la commande lvconvert.

Cependant, lorsque nous utilisons des volumes minces, au lieu de fusionner l’instantané à son origine, nous pouvons utiliser une autre stratégie : d’abord, nous renommons (ou supprimons, selon le cas) le volume mince d’origine, puis nous créons un instantané de l’instantané auquel nous voulons revenir et le nommons volume d’origine. De cette façon, nous pouvons à la fois revenir à un certain état et conserver l’instantané.

Supposons, par exemple, que nous voulions revenir à l’état représenté par l’instantané root-snapshot0. Tout d’abord, nous renommerions le volume logique mince « racine », peut-être en ajoutant la date actuelle au nom original :

sudo lvrename /dev/fedora/root "root-$(date "+%Y-%m-%d")"

Ensuite, nous prenons un instantané de l’instantané que nous voulons utiliser, et nous le nommons « racine » :

sudo lvcreate -s /dev/fedora/root-snapshot0 -n root

Suppression d’un instantané LVM

Un instantané LVM peut être facilement supprimé comme n’importe quel autre volume logique, en utilisant la commande « lvremove ». Pour supprimer l’instantané « root-snapshot0 » que nous avons créé dans l’exemple précédent, nous exécutions :

sudo lvremove /dev/fedora/root-snapshot0

Notez que dans le cas des volumes fins, comme nous l’avons spécifié dans le tutoriel dédié, lors de la suppression d’un volume logique, l’espace n’est pas retourné au pool tant que nous n’avons pas exécuté la commande fsrim.

Instantanés du BTRFS

BTRFS est un système de fichiers moderne qui a des instantanés comme fonctionnalité intégrée; il est utilisé par défaut sur Fedora, OpenSUSE et SUSE Linux Enterprise, et est pris en charge par pratiquement toutes les autres distributions majeures (RHEL et les clones étant l’exception). Contrairement aux volumes logiques LVM, les sous-volumes BTRFS ne sont pas des périphériques de blocs séparés, mais plutôt des zones du système de fichiers qui utilisent des espaces de noms séparés et ont leurs propres hiérarchies de répertoires. Pour obtenir la liste des sous-volumes disponibles sur un système de fichiers BTRFS, nous pouvons exécuter :

sudo btrfs subvolume list /

Sur un système Fedora fraîchement installé, la commande ci-dessus renvoie la sortie suivante :

ID 256 gen 46 top level 5 path root
ID 257 gen 45 top level 5 path home
ID 258 gen 41 top level 256 path var/lib/portables

Pour chaque sous-volume existant, la commande renvoie l’id, le numéro de génération (un compteur interne qui augmente à chaque transaction), l’ID de niveau supérieur (parent) et le chemin relatif du sous-volume à l’intérieur de son parent. Ci-dessus, nous pouvons voir que « root » et « home » sont des sous-volumes du volume de niveau supérieur (le système de fichiers btrfs « principal »), qui a toujours 5 comme id. Nous pouvons facilement le vérifier en montant le volume de niveau supérieur, qui, dans ce cas, se trouve sur la troisième partition du disque :

sudo mount /dev/vda3 /mnt

Après avoir monté le système de fichiers, si nous examinons le contenu du répertoire /mnt, nous verrons les deux sous-volumes, comme des répertoires :

ls -l /mnt
total 0
drwxr-xr-x. 1 root root 6 Aug 29 13:56 home
dr-xr-xr-x. 1 root root 138 Aug 29 13:48 root

Création d’un instantané BTRFS

Les instantanés de BTRFS ne sont que des sous-volumes supplémentaires. Pour créer un instantané, nous utilisons la sous-commande « snapshot », en passant le chemin du sous-volume source et le chemin où l’instantané doit être créé, comme arguments. Pour créer un instantané du sous-volume « racine », qui est monté sur « / », et l’enregistrer comme « /.snapshot0 », nous exécuterions :

sudo btrfs subvolume snapshot / /.snapshot0

Par défaut, les instantanés sont créés en mode lecture-écriture, pour les rendre en lecture seule, nous ajoutons l’option -r à la commande ci-dessus. Si nous examinons le contenu du répertoire /.snapshot0, nous pouvons voir qu’il contient sa propre structure de répertoire :

ls -l /.snapshot0
dr-xr-xr-x. 1 root root 0 Jan 23 2024 afs
lrwxrwxrwx. 1 root root 7 Jan 23 2024 bin -> usr/bin
drwxr-xr-x. 1 root root 0 Aug 29 13:44 boot
drwxr-xr-x. 1 root root 0 Aug 29 13:44 dev
drwxr-xr-x. 1 root root 2658 Aug 30 03:54 etc
drwxr-xr-x. 1 root root 0 Aug 29 13:44 home
lrwxrwxrwx. 1 root root 7 Jan 23 2024 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Jan 23 2024 lib64 -> usr/lib64
drwxr-xr-x. 1 root root 0 Jan 23 2024 media
drwxr-xr-x. 1 root root 0 Jan 23 2024 mnt
drwxr-xr-x. 1 root root 0 Jan 23 2024 opt
drwxr-xr-x. 1 root root 0 Aug 29 13:44 proc
dr-xr-x---. 1 root root 128 Aug 29 13:57 root
drwxr-xr-x. 1 root root 0 Aug 29 13:44 run
lrwxrwxrwx. 1 root root 8 Jan 23 2024 sbin -> usr/sbin
drwxr-xr-x. 1 root root 0 Jan 23 2024 srv
drwxr-xr-x. 1 root root 0 Aug 29 13:44 sys
drwxrwxrwt. 1 root root 0 Aug 29 13:44 tmp
drwxr-xr-x. 1 root root 100 Aug 29 13:48 usr
drwxr-xr-x. 1 root root 170 Aug 30 03:54 var

Les instantanés ne sont pas récursifs, ils n’incluent que le contenu de leur sous-volume parent : si nous examinons le contenu du répertoire /.snapshot0/home/, par exemple, nous remarquerons qu’il est vide, puisque le sous-volume « home » est monté à cette position dans notre système. L’instantané, comme prévu, apparaît dans la liste des sous-volumes :

sudo btrfs subvol list /
ID 256 gen 65 top level 5 path root
ID 257 gen 61 top level 5 path home
ID 258 gen 41 top level 256 path var/lib/portables
ID 261 gen 61 top level 256 path .snapshot0

Utilisation d’un instantané du BTRFS

Bien qu’il n’y ait pas de commande spécifique conçue pour rétablir un sous-volume à un état représenté par un instantané, il existe plusieurs façons d’en utiliser une. Puisque, comme nous l’avons vu, les snasphots BTRFS sont au niveau des fichiers, des versions spécifiques des fichiers peuvent être facilement récupérées simplement en naviguant dans le fileystem.

Pour revenir à un état précédent du système de fichiers, nous pouvons également adopter la même stratégie que celle utilisée par des programmes graphiques comme btrfs-assistant. Dans l’exemple précédent, nous avons pris un instantané du sous-volume « racine »; Cet instantané a capturé l’état du sous-volume parent à ce moment précis. Pour revenir à ce point, nous pouvons simplement remplacer le sous-volume original par son instantané. Tout d’abord, nous montons le système de fichiers de premier niveau :

sudo mount /dev/vda3 /mnt

Maintenant, nous renommons le volume « racine » en ajoutant la date actuelle. Nous pouvons renommer un sous-volume simplement en utilisant la commande mv :

sudo mv /mnt/root "/mnt/root-$(date "+%Y-%m-%d")"

Afin de conserver une copie de l’instantané auquel nous voulons revenir, nous en créons un nouvel instantané et l’enregistrons sous le nom /mnt/root :

sudo btrfs subvolume snapshot /.snapshot0 /mnt/root

Suppression d’un instantané BTRFS

Pour supprimer un instantané, nous utilisons la sous-commande « delete » et passons le chemin de l’instantané comme argument. Juste à titre d’exemple, pour supprimer l’instantané /.snapshot0, nous exécuterions :

sudo btrfs subvolume delete /.snapshot0

La suppression d’un sous-volume ne supprimera pas les sous-volumes imbriqués existants.

Conclusions

Les instantanés nous permettent de figer l’état d’un système de fichiers à un certain moment. Sous Linux, nous pouvons créer des instantanés en utilisant LVM ou le système de fichiers BTRFS. Dans cet article, nous avons vu comment créer des instantanés LVM traditionnels et minces; nous avons appris la différence entre les deux, et entre eux et les instantanés du BTRFS. ZFS est un autre système de fichiers avancé qui a des instantanés comme fonctionnalité intégrée; en raison de problèmes de licence, cependant, il n’est pas pris en charge par le noyau Linux et doit être compilé en tant que module externe, nous ne l’avons donc pas inclus dans ce tutoriel.

Articles connexes: