Recherche sur le site Web

Comment gérer les instantanés avec Snapper sous Linux


Snapper est une application gratuite et open source que nous pouvons utiliser pour gérer les instantanés sous Linux. Il a été conçu à l’origine pour fonctionner avec des instantanés BTRFS, mais a été étendu pour prendre en charge également les volumes logiques LVM à provisionnement léger. Dans ce tutoriel, nous apprenons comment installer Snapper sur les distributions Linux les plus utilisées et comment l’utiliser pour gérer les instantanés sous Linux.

Dans ce tutoriel, vous apprendrez :

  • Comment installer Snapper sur les distributions Linux les plus utilisées
  • Comment générer des configurations Snapper
  • Comment créer, modifier et supprimer des instantanés avec Snapper
  • Comment créer automatiquement des instantanés horaires
  • Comment choisir et appliquer un algorithme de nettoyage d’instantané

Installation

Créé à l’origine par le développeur d’OpenSUSE Arvin Schnell, Snapper est maintenant disponible dans les dépôts officiels de toutes les distributions Linux les plus utilisées. Pour installer l’application sur Fedora, nous pouvons utiliser le gestionnaire de paquets dnf :

sudo dnf install snapper

Pour installer Snapper sur Debian, et les distributions basées sur Debian, à la place, nous utilisons la commande suivante :

sudo apt install snapper

Snapper est également disponible dans le dépôt « Extra » d’Archlinux. Nous pouvons installer l’application avec pacman :

sudo pacman -S snapper

Enfin, pour installer Snapper sur OpenSUSE lui-même, nous utilisons le gestionnaire de paquets zypper :

sudo zypper in snapper

Génération d’une configuration Snapper

Avant de pouvoir utiliser Snapper, nous devons générer une configuration pour chaque système de fichiers que nous voulons instantanér, en utilisant la commande create-config. Supposons que nous ayons un sous-volume BTRFS monté à « / ». Pour générer une configuration Snapper pour cela, nous exécuterions :

sudo snapper -c myconfig create-config -f btrfs /

Analysons la commande ci-dessus. Nous avons invoqué snapper avec l’option -c : c’est l’abréviation de --config : nous utilisons cette option pour spécifier un nom de configuration. Dans l’exemple, nous utilisons « myconfig » comme argument de l’option, ce qui n’est pas obligatoire : si nous l’omettons, le nom par défaut sera utilisé (« root »). Nous avons invoqué la commande create-config avec l’option -f (abréviation de --fstype) pour spécifier le backend de l’instantané. Comme dans ce cas, nous travaillons avec un système de fichiers BTRFS, nous avons passé « btrfs » comme argument. Si nous avions créé la configuration d’un instantané LVM à provisionnement léger, nous aurions spécifié le système de fichiers au-dessus du volume logique, en exécutant :

sudo snapper -c myconfig create-config -f "lvm(ext4)" /

Les configurations de Snapper sont sauvegardées dans le répertoire /etc/snapper/configs.

Obtenir une liste des instantanés créés pour une configuration

Pour avoir une vue d’ensemble des instantanés créés avec Snapper, nous pouvons utiliser la commande ls. Encore une fois, si nous ne spécifions pas de nom de configuration avec l’option -c, le nom par défaut est supposé, donc si nous avons créé une configuration avec un nom personnalisé, nous devrions explicitement pointer vers elle dans toutes les commandes Snapper. Dans l’exemple précédent, nous avons utilisé « myconfig » comme nom de configuration; Pour obtenir la liste des instantanés qui y sont associés, nous exécuterions :

sudo snapper -c myconfig ls

Nous n’avons pas encore créé d’instantané, donc la sortie de la commande est la suivante :

 # | Type   | Pre # | Date | User | Cleanup | Description | Userdata
---+--------+-------+------+------+---------+-------------+---------
0  | single |       |      | root |         | current     |

L’instantané avec l’ID 0 n’est pas un « vrai » instantané : il pointe simplement vers l’état actuel du système. Par défaut, la sortie de la commande rapporte les informations suivantes :

  • L’identifiant de l’instantané
  • Le type d’instantané (simple, pré ou post – voir ci-dessous)
  • L’identifiant de l’instantané « pré » connexe si l’instantané est de type « post » (encore une fois, voir ci-dessous)
  • La date à laquelle l’instantané a été créé
  • L’utilisateur qui a créé l’instantané
  • L’algorithme de nettoyage (nombre, chronologie ou pré-publication vide)
  • La description facultative fournie pour l’instantané
  • La liste des paires clé-valeur fournie pour l’instantané

Créer des instantanés avec Snapper

Snapper organise les instantanés en trois catégories : « pré », « post » et « unique ». Il n’y a pas de différences structurelles entre ces types d’instantanés, seulement relationnelles : les instantanés « pré » et « post » sont toujours liés : chaque instantané « post » est associé à un instantané « pré » correspondant. Ils sont créés pour marquer l’état du système de fichiers avant et après une action ou une commande. Les instantanés « uniques », comme leur nom l’indique, sont plutôt « isolés » : ils ne sont liés à aucun autre instantané.

Pour créer un instantané avec Snapper, nous utilisons la commande create. Lorsqu’elle n’est utilisée sans autre option, la commande crée un « seul » instantané :

sudo snapper -c myconfig create

Nous pouvons spécifier le type d’instantanés que nous voulons créer en utilisant l’option -t (--type). Juste à titre d’exemple, pour créer un instantané « pré », nous exécuterions :

sudo snapper -c myconfig create -t pre

Lors de la création d’un instantané « post », nous devons spécifier l’identifiant de l’instantané « pré » associé; Nous pouvons le faire en le passant comme argument à l’option --pre-number, par exemple :

sudo snapper -c myconfig create -t post --pre-number 1

Pour éviter de créer manuellement des instantanés « pre » et « post », nous pouvons utiliser l’option --command. Cette option prend une commande comme valeur : Snapper créera automatiquement un instantané « pré » avant d’exécuter la commande, et un instantané « post » après l’exécution de la commande. À titre d’exemple, pour créer un instantané avant la mise à jour du système, et un instantané juste après la mise à jour du système, nous exécutons :

sudo snapper -c myconfig create --command “dnf update”

Fournir des métadonnées d’instantanés

Lors de la création d’un instantané avec Snapper, nous pouvons fournir une description facultative et une série de paires clé-valeur qui peuvent nous aider à décrire son rôle. Pour fournir la description instantanée au moment de la création, nous utilisons l’option -d (--description) et passons la description comme argument. Dans l’exemple ci-dessous, nous créons un instantané « unique » avec une description factice (si la description comprend des espaces, elle doit être entourée de guillemets simples) :

sudo snapper -c myconfig create -d 'This is a dummy description'

Nous pouvons également fournir une liste de paires clé-valeur séparées par des virgules via l’option -u (--userdata) :

sudo snapper -c myconfig create -u important=yes

Spécification d’un algorithme de nettoyage pour l’instantané

Lors de la création d’un instantané, nous pouvons l’associer à l’un des algorithmes de nettoyage disponibles. Pour spécifier un algorithme de nettoyage, nous utilisons l’option -c ou --cleanup-algorithm. Dans l’exemple ci-dessous, nous créons un instantané et l’associons à l’algorithme « nombre » :

sudo snapper -c myconfig create -c number

Continuez à lire pour en savoir plus sur le fonctionnement des algorithmes de nettoyage disponibles et sur la façon de les configurer. L’algorithme de nettoyage associé à un instantané, tout comme ses métadonnées, peut être modifié une fois l’instantané créé, à l’aide de la commande modifier, à l’aide des options correspondantes.

Création automatique d’instantanés horaires

Pour créer automatiquement un instantané horaire, il suffit de définir la variable TIMELINE_CREATE sur « oui » dans un fichier de configuration Snapper, puis d’activer le système snapper-timeline.timer. Chaque minuterie systemd est associée à un service systemd du même nom. Dans ce cas, la minuterie exécutera snapper-timeline.service une fois par heure. Pour activer la minuterie, nous exécutons :

sudo systemctl enable snapper-timeline.timer

Algorithmes de nettoyage

Les algorithmes de nettoyage sont utilisés pour « faire pivoter » les instantanés et éviter de les accumuler indéfiniment. Les algorithmes actuellement disponibles sont : « number », « timeline » et « empty-pre-post »; voyons comment ils fonctionnent.

L’algorithme du « nombre »

L’algorithme du « nombre » est simplement basé sur le nombre maximal d’instantanés autorisés. Il peut être configuré via les variables suivantes spécifiées dans un fichier de configuration :

  • NUMBER_CLEANUP
  • Âge minimum
  • LIMITE_DE_NOMBRE
  • LIMITATION_DE_NOMBRE_IMPORTANTE

La variable NUMBER_CLEANUP prend une valeur booléenne et détermine si l’algorithme de nettoyage « nombre » doit s’exécuter pour la configuration. La variable NUMBER_MIN_AGE accepte plutôt l’âge minimum que les instantanés doivent avoir pour que l’algorithme de nettoyage soit appliqué; la valeur est spécifiée en secondes. Avec la variable NUMBER_LIMIT, nous spécifions le nombre maximum d’instantanés que nous voulons conserver à la fois. Enfin, la variable NUMBER_LIMIT_IMPORTANT est utilisée pour définir le nombre maximal d’instantanés importants autorisés. Nous pouvons marquer un instantané comme « important » en spécifiant la paire clé-valeur « important=yes » comme argument de l’option -u lors de sa création, comme nous l’avons vu ci-dessus.

L’algorithme de la « chronologie »

L’algorithme de la « chronologie » est basé sur le nombre d’instantanés horaires, quotidiens, hebdomadaires, mensuels et annuels qui doivent être conservés. Les paramètres de l’algorithme de la « chronologie » sont spécifiés à l’aide des variables suivantes :

  • NETTOYAGE_DE_LA_LIGNE_TEMPORELLE
  • Âge minimum de la chronologie
  • CHRONOLOGIE_HORAIRE
  • CHRONOLOGIE_QUOTIDIENNE
  • LIGNES DU TEMPS_HEBDOMADAIRE
  • ÉCHEANCIER_MENSUEL
  • LIGNÉE_TEMPORELLE_ANNUELLE

La variable TIMELINE_CLEANUP prend une valeur booléenne : elle est utilisée pour déterminer si l’algorithme « timeline » doit fonctionner pour la configuration spécifique. La variable TIMELINE_MIN_AGE est utilisée pour déterminer l’âge minimum, en secondes, qu’un instantané doit avoir, pour être pris en compte par l’algorithme. Enfin, les variables TIMELINE_HOURLY, TIMELINE_DAILY, TIMELINE_WEEKLY, TIMELINE_MONTHLY et TIMELINE_YEARLY sont utilisées pour spécifier combien d’instantanés horaires, quotidiens, hebdomadaires, mensuels et annuels doivent être conservés.

L’algorithme « empty-pre-post »

L’algorithme « empty-pre-post » est utilisé pour supprimer les paires pré/post-instantanés avec des diffs vides (instantanés associés sans différence). Nous pouvons ajuster le comportement de l’algorithme en utilisant les deux variables suivantes :

  • EMPTY_PRE_POST_CLEANUP
  • VIDE_PRE_POST_MIN_AGE

La variable EMPTY_PRE_POST prend une valeur booléenne qui active et désactive l’algorithme de nettoyage d’une configuration; la variable EMPTY_PRE_POST_MIN_AGE, au lieu de cela, détermine l’âge minimum, en secondes, qu’un instantané doit avoir, pour être pris en compte par l’algorithme.

Exécution d’un algorithme de nettoyage

Les algorithmes de nettoyage peuvent être exécutés manuellement via la commande Snapper cleanup. Lors de l’exécution de la commande, nous spécifions l’algorithme de nettoyage que nous voulons exécuter comme premier argument. Pour appliquer l’algorithme « number » à la configuration « myconfig », par exemple, nous exécuterions :

sudo snapper -c myconfig cleanup number

Snapper est généralement installé avec une minuterie de nettoyage systemd et son service connexe. Le minuteur est configuré pour fonctionner 10 minutes après le démarrage du systemd (OnBootSec=10m) et est désactivé par défaut. Pour l’activer, nous exécutons :

sudo systemctl enable snapper-cleanup.timer

Le snapper-cleanup.service applique tous les algorithmes de nettoyage activés dans les fichiers de configuration existants.

Suppression d’instantanés

Pour supprimer manuellement un instantané ou une plage d’instantanés avec Snapper, nous pouvons utiliser la commande delete. Tout ce que nous avons à faire est de passer le(s) identifiant(s) des instantanés que nous voulons supprimer. Pour supprimer l’instantané avec l’ID 1, par exemple, nous exécuterions :

sudo snapper -c myconfig delete 1

Pour supprimer les instantanés de 1 à 3, :

sudo snapper -c myconfig delete 1-3

Commandes spécifiques au backend

Comme nous l’avons déjà dit, Snapper prend en charge à la fois les instantanés BTRFS et LVM en tant que backend. En raison de la nature très différente de ces types d’instantanés, certaines commandes ne s’appliquent qu’avec un backend spécifique.

La commande snapper mount, par exemple, n’a de sens que lorsque vous travaillez avec des instantanés LVM. Cette commande active le thin snapshot spécifié (les thin snapshots LVM ne sont pas activés par défaut) et le monte dans le répertoire approprié. D’autres commandes telles que le rollback ne fonctionnent que si vous utilisez BTRFS comme backend. Pour en savoir plus sur ces commandes, veuillez consulter le manuel de Snapper.

Conclusions

Dans ce tutoriel, nous avons vu comment installer Snapper sur les distributions Linux les plus utilisées, et comment l’utiliser pour gérer les instantanés. Snapper fonctionne comme une interface pour les instantanés à provisionnement mince BTRFS et LVM. Nous avons vu comment générer une configuration Snapper pour un système de fichiers, comment créer, supprimer et modifier des instantanés, et comment appliquer les algorithmes de nettoyage disponibles.

Articles connexes: