Recherche de site Web

Comment créer des sauvegardes incrémentielles et différentielles avec tar


Tar (Tape ARchiver) est l’un des utilitaires les plus utiles dans la boîte à outils de tous les administrateurs système Linux. Avec tar, nous pouvons créer des archives qui peuvent être utilisées à diverses fins : pour empaqueter le code source d’applications, par exemple, ou pour créer et stocker des sauvegardes de données.

Dans ce tutoriel, nous nous concentrons sur ce dernier sujet, et nous voyons comment créer des sauvegardes complètes, incrémentielles et différentielles avec tar, et plus précisément avec la version GNU de tar.

Dans ce tutoriel, vous allez apprendre :

  • Quelle est la différence entre les sauvegardes incrémentielles et différentielles ?
  • Comment créer des sauvegardes incrémentielles avec tar
  • Comment créer des sauvegardes différentielles avec tar
  • Comment restaurer les sauvegardes incrémentielles et différentielles
  • Comment lister le contenu d’une archive incrémentielle

Configuration logicielle requise et conventions utilisées

Sauvegardes complètes, incrémentielles et différentielles

Avant de voir comment utiliser tar pour créer des sauvegardes incrémentielles et différentielles, il est important de comprendre la différence entre ces types de sauvegarde.

Tout d’abord, il faut dire que les sauvegardes incrémentales et différentielles sont finalement basées sur des sauvegardes complètes ou « de niveau 0 » : une sauvegarde complète est une sauvegarde qui, sous une forme ou une autre, contient tout le contenu d’un système de fichiers spécifique à un moment déterminé. La création de sauvegardes complètes nécessite potentiellement beaucoup de temps et d’espace sur le disque : cela dépend évidemment de la taille de la source de données. Pour résoudre ces inconvénients, des stratégies de sauvegarde incrémentielle et différentielle peuvent être mises en œuvre. Après la création d’une sauvegarde complète initiale, les sauvegardes suivantes, incrémentielles ou différentielles, n’incluront que les modifications du système de fichiers. Quelle est la différence entre les deux ?

Les sauvegardes incrémentielles et différentielles sont similaires dans le sens où, comme nous l’avons déjà dit, elles sont toutes deux basées sur des sauvegardes complètes. Ce qui change entre les deux, c’est ce qu’ils considèrent comme une base pour calculer les différences de système de fichiers. Une sauvegarde incrémentielle est toujours dépendante et basée sur la sauvegarde qui la précède immédiatement, qu’elle soit complète ou incrémentielle elle-même ; Une sauvegarde différentielle, en revanche, utilise toujours la sauvegarde complète initiale comme base.

Exemple de stratégie de sauvegarde incrémentielle

Supposons que nous souhaitions créer des sauvegardes hebdomadaires d’un répertoire source hypothétique en mettant en œuvre une stratégie de sauvegarde incrémentielle. Tout d’abord, le lundi, nous créerions une sauvegarde complète du répertoire source. Le lendemain, mardi, nous créerions une nouvelle sauvegarde, qui ne contiendrait que les fichiers et les répertoires qui ont été créés ou modifiés dans le répertoire source depuis que la sauvegarde complète a eu lieu. La nouvelle sauvegarde gardera également une trace des fichiers qui ont été supprimés depuis ; C’est ce qu’on appelle une sauvegarde « de niveau 1 ».

Le mercredi, nous créerions une troisième sauvegarde, qui, à son tour, « gardera une trace » de toutes les différences qui se sont produites depuis la sauvegarde que nous avons effectuée mardi. Cette sauvegarde sera donc dépendante de la précédente directement, et indirectement de la première sauvegarde. Nous avons continué à répéter le schéma pendant le reste de la semaine.

Si un désastre devait se produire jeudi, par exemple, pour restaurer l’état du système de fichiers que nous avions mercredi, nous aurions besoin de restaurer, dans l’ordre, toutes les sauvegardes que nous avons faites depuis lundi ; La perte d’une sauvegarde rend impossible la restauration de celles qui viennent après.

Exemple de stratégie de sauvegarde différentielle

Une sauvegarde initiale, complète, est également la toute première chose que nous devons faire si nous décidons de mettre en œuvre une stratégie basée sur les sauvegardes différentielles. La sauvegarde de niveau 0 est créée le lundi, et celle contenant uniquement les différences entre celle-ci et l’état actuel du répertoire source est effectuée le mardi. Jusqu’à présent, il n’y a pas de différences avec la stratégie des sauvegardes incrémentielles.

Les choses changent à partir du lendemain. Le mercredi, au lieu de créer une sauvegarde basée sur celle que nous avons faite la veille, nous en créerions une qui est à nouveau basée sur la sauvegarde initiale et complète que nous avons faite le lundi. Nous effectuons la même action les jours de semaine suivants.

Comme vous pouvez le voir, dans une stratégie de sauvegarde différentielle, chaque sauvegarde dépend uniquement de la sauvegarde complète initiale, donc pour restaurer l’état du système de fichiers avait un certain jour, nous n’avons besoin que de la sauvegarde complète initiale, et de la sauvegarde effectuée ce jour-là.

Une fois que nous avons compris les différences entre les deux approches, nous pouvons voir comment effectuer des sauvegardes incrémentielles et différentielles avec tar.

Création de sauvegardes incrémentielles

Pour créer des sauvegardes incrémentielles avec tar, tout ce que nous avons à faire est de combiner deux options : --create et --listed-incremental. Le premier est ce que nous utilisons pour spécifier que nous voulons créer une archive, le second, à la place, prend le chemin d’un fichier instantané comme argument : ce fichier est utilisé par tar pour stocker des métadonnées sur l’état du système de fichiers source au moment où la sauvegarde est effectuée. En le lisant, lorsque des sauvegardes ultérieures sont effectuées, tar peut déterminer quels fichiers ont été modifiés, ajoutés ou supprimés, et ne stocker que ceux-ci. Voyons un exemple pratique.

Supposons que nous voulions créer des sauvegardes incrémentielles du répertoire ~/Document et le stocker sur un périphérique de bloc externe monté sur /mnt/data (ici, nous supposerons que notre utilisateur dispose des droits d’écriture sur ce répertoire). Dans notre exemple, le répertoire ~/Document ne contient initialement que deux fichiers : one.txt et two.txt. Voici la commande que nous exécuterions pour créer la sauvegarde :

tar --verbose --create --file=/mnt/data/documents0.tar  --listed-incremental=/mnt/data/documents.snar  ~/Documents

Examinons les options que nous avons utilisées ci-dessus. Nous avons invoqué tar avec l’option --verbose pour rendre sa sortie plus explicite, et --create pour spécifier ce que nous voulons faire, c’est créer une archive ; Nous avons ensuite passé le chemin où l’archive doit être créée en argument à l’option --file. Enfin, en utilisant l’option --listed-incrémental, nous avons demandé à tar de créer une sauvegarde différentielle et de stocker les métadonnées du système de fichiers dans le fichier /mnt/data/document.snar (notez que l’extension .snar est arbitraire - c’est juste ce qui est utilisé pour la convention). Comme c’est la première fois que nous exécutons la commande, une sauvegarde complète est créée. Voici le résultat de la commande ci-dessus :

tar: /home/egdoc/Documents: Directory is new
tar: Removing leading `/' from member names
/home/egdoc/Documents/
/home/egdoc/Documents/one.txt
/home/egdoc/Documents/two.txt

L’archive et le fichier d’instantané ont été créés à l’intérieur de /mnt/data :

ls -l /mnt/data
-rw-r--r--. 1 egdoc egdoc 10240 Apr 16 07:13 documents0.tar
-rw-r--r--. 1 egdoc egdoc 113 Apr 16 07:13 documents.snar
drwx------. 2 root root 16384 Apr 9 23:27 lost+found

Supposons que nous ajoutions maintenant une ligne au fichier one.txt dans le répertoire ~/Documents :

echo "this is a new line" >> ~/Documents/one.txt

De plus, nous créons un troisième fichier :

touch ~/Documents/three.txt

Nous exécutons à nouveau tar, en ne changeant que le nom de l’archive de destination. Une sauvegarde de niveau 1 est créée. Il n’inclut que le fichier que nous avons modifié (one.txt) et celui que nous venons de créer (three.txt) :

tar  --create --verbose --file=/mnt/data/documents1.tar --listed-incremental=/mnt/data/documents.snar  ~/Documents
tar: Removing leading `/' from member names
/home/egdoc/Documents/
/home/egdoc/Documents/one.txt
/home/egdoc/Documents/three.txt

Une fois que nous lançons la commande, le contenu du fichier documents.snar est remplacé par des métadonnées sur l’état actuel du répertoire source.

Pour continuer à effectuer des sauvegardes incrémentielles, il suffit de continuer à suivre ce modèle. Tout ce que nous devons changer à chaque fois, bien sûr, c’est le nom de l’archive de destination. Chaque nouvelle archive ne contiendra que les modifications dans le répertoire source qui ont eu lieu depuis la sauvegarde précédente.

Création de sauvegardes différentielles

Comme nous venons de le voir, la création de sauvegardes incrémentielles avec tar est assez facile. La création de sauvegardes différentielles est tout aussi simple : il suffit de changer la façon dont nous gérons le fichier instantané. Comme nous l’avons déjà mentionné, la différence entre les sauvegardes différentielles et incrémentielles est que les premières sont toujours basées sur des sauvegardes complètes.

Étant donné qu’à chaque fois que nous exécutons tar comme nous l’avons fait dans l’exemple précédent, le contenu du fichier instantané est écrasé par des informations de métadonnées sur l’état du système de fichiers au moment où la commande est émise, nous devons créer une copie du fichier instantané généré lors de la sauvegarde complète et passer son chemin à --listed-incremental, afin que l’original reste intact.

La première fois que nous exécutons la commande comme nous l’avons fait ci-dessus, afin qu’une sauvegarde complète soit créée :

tar --verbose --create --file=/mnt/data/documents0.tar --listed-incremental=/mnt/data/documents.snar ~/Documents

Lorsqu’il est temps de créer la première sauvegarde différentielle, nous devons créer une copie du fichier d’instantané, qui serait autrement écrasé :

cp /mnt/data/documents.snar /mnt/data/documents.snar-1

À ce stade, nous invoquons à nouveau tar, mais nous faisons référence à la copie de l’instantané :

tar --verbose --create --file /mnt/data/documents0.tar --listed-incremental=/mnt/data/documents.snar-1 ~/Documents

Pour créer des sauvegardes différentielles, ce modèle doit être répété chaque fois que nous voulons ajouter une nouvelle sauvegarde.

Restauration d’une sauvegarde

La façon de procéder lorsque nous voulons restaurer une sauvegarde créée avec tar dépend de la stratégie de sauvegarde que nous avons mise en place. Dans tous les cas, la première chose à faire est de restaurer la sauvegarde complète, qui dans ce cas est /mnt/data/documents0.tar. Voici la commande que nous exécuterions :

tar --directory=/ --extract --verbose --file=/mnt/data/documents0.tar --listed-incremental=/dev/null

Dans ce cas, nous avons appelé tar avec l’option --directory, pour faire en sorte que tar se déplace dans le répertoire donné avant de commencer l’extraction. Nous avons utilisé --extract pour effectuer l’extraction et --verbose pour exécuter en mode détaillé, puis nous avons spécifié le chemin de l’archive à extraire avec --file. Encore une fois, nous avons utilisé l’option --listed-incrémental, cette fois en passant /dev/null comme argument. Pourquoi l’avons-nous fait ?

Lorsque l’option --listed-incremental est utilisée avec --extract, tar tente de restaurer à partir de l’archive spécifiée, en supprimant tous les fichiers du répertoire de destination qui n’existent pas dans l’archive. Lors de la restauration, le contenu du fichier d’instantané n’a pas besoin d’être lu, il est donc courant de passer /dev/null comme argument à l’option.

Voici le résultat que la commande renverrait dans notre cas :

tar: Deleting ‘home/egdoc/Documents/three.txt’
home/egdoc/Documents/one.txt
home/egdoc/Documents/two.txt

Dans ce cas, comme vous pouvez le voir, le fichier three.txt existant dans le répertoire /home/egdoc/Documents a été supprimé dans le cadre de l’extraction, car lorsque la sauvegarde a été créée, le fichier n’existait pas.

Si nous avons utilisé des sauvegardes incrémentielles, à ce stade, pour restaurer la situation qui existait un jour spécifique, nous devons restaurer, dans l’ordre, toutes les sauvegardes qui ont été créées depuis la création de la sauvegarde complète jusqu’à celle créée ce jour-là. Si nous avons utilisé des sauvegardes différentielles, à la place, puisque chaque sauvegarde différentielle est calculée par rapport à la sauvegarde complète initiale, tout ce que nous avons à faire est de restaurer la sauvegarde que nous avons créée ce jour-là.

Lister le contenu d’une archive incrémentielle

Si nous voulons simplement lister le contenu d’une archive incrémentielle, nous pouvons exécuter tar avec l’option --list et répéter --verbose deux fois, avec --listed-incremental. En voici un exemple. Supposons que nous souhaitions examiner le contenu de la première sauvegarde de niveau 1 que nous avons effectuée après la sauvegarde complète. Voici ce que nous allions exécuter :

tar --list --verbose --verbose --listed-incremental=/dev/null --file=/mnt/data/documents1.tar

Dans notre cas, la commande renvoie le résultat suivant :

drwxr-xr-x egdoc/egdoc 30 2022-04-16 23:40 home/egdoc/Documents/
Y one.txt
Y three.txt
N two.txt

-rw-r--r-- egdoc/egdoc 19 2022-04-16 23:40 home/egdoc/Documents/one.txt
-rw-r--r-- egdoc/egdoc 0 2022-04-16 23:40 home/egdoc/Documents/three.txt

La sortie affiche la liste des fichiers qui existaient dans le répertoire source lors de la création de l’archive. Si le nom du fichier est précédé d’un Y, cela signifie que le fichier est effectivement inclus dans l’archive, s’il est précédé d’un N, il ne l’est pas. Enfin, si le nom du fichier est précédé d’un D, cela signifie qu’il est inclus dans l’archive, mais qu’il s’agit en fait d’un répertoire.

Dans ce cas, les one.txt, two.txt et three.txt étaient en place lors de la création de l’archive, mais seuls one.txt et three.txt sont précédés d’un Y, et en fait inclus dans l’archive, car ce sont les seuls qui ont changé depuis que la sauvegarde précédente a été effectuée (dans l’exemple, nous avons ajouté une ligne à la première et créé la seconde après la sauvegarde complète).

Réflexions finales

Dans ce tutoriel, nous avons appris quelle est la différence entre les sauvegardes complètes, incrémentielles et différentielles, et comment mettre en œuvre ces stratégies de sauvegarde avec tar. Nous avons vu comment créer les sauvegardes, comment les restaurer et comment lister le contenu d’une archive incrémentale.

Articles connexes: