Créer une sauvegarde avec tar : voici comment fonctionne l’archivage

Le programme d'archivage tar est basé sur une ancienne méthode de sauvegarde des données, qui fait ses preuves encore aujourd'hui. Le nom tar est en fait un acronyme et signifie Tape Archiver, c'est-à-dire l'archivage sur des lecteurs de bandes. Même si les utilisateurs privés les utilisent à peine de nos jours, le programme est toujours l'outil d'archivage le plus populaire sur les systèmes Unix. Le programme peut également être utilisé pour créer des sauvegardes régulières et incrémentales d'un serveur. Nous expliquons comment fonctionne tar et quelles commandes sont utilisées pour la sauvegarde des données.

Backup Cloud IONOS

Finies les interruptions d'activité coûteuses ! Sauvegardez facilement les données de votre entreprise et bénéficiez d'un conseiller personnel.

Simple
Sûr
Intégré

Comment fonctionne tar ?

Tar est un programme d'archivage sous Linux et systèmes connexes. Par défaut, tar n'offre pas de compression, ce qui est atypique pour un tel programme. Néanmoins, le programme est très populaire, car son grand avantage est que des répertoires entiers peuvent être fusionnés en un seul fichier. Cette technique est liée à l'histoire du programme : avec un dérouleur de bande, les données sont transférées l'une après l'autre sur une bande magnétique. Ceci explique le stockage séquentiel et linéaire au format tar. Les nouveaux fichiers sont attachés au dos de l'archive. Un fichier résultant est également appelé tarball, parce que les fichiers sont pratiquement « collés ensemble ».

Pour parvenir à la compression, tar est souvent utilisé en combinaison avec gzip. Les deux programmes se complètent parfaitement, car gzip ne peut compresser qu’un seul fichier à la fois. Par conséquent, tar, et ensuite gzip (ou un autre programme de compression), sont généralement utilisés en premier. Il en résulte des fichiers .tar.gz ou .tzip.

Installer tar 

Sous Ubuntu, tar doit être préinstallé. Si vous utilisez une autre distribution Linux ou Unix, installez le programme de cette façon :

sudo apt-get install tar tar-doc

Le pack tar-doc est facultatif : il contient de la documentation sur le programme d'archivage.

Utiliser tar

Si vous souhaitez utiliser tar, il faut taper ceci :

tar Option Datei

Les options de tar sont les suivantes :

Option Description Particularité  
--help Présente toutes les options    
--version Renvoie à la version de tar utilisée    
-c Crée une nouvelle archive (create)  
-d Compare les fichiers dans le système d'archivage et le système de fichiers (diff)  
-f Écrit une archive dans le fichier spécifié ou lit les données du fichier spécifié (file) Vous devez toujours saisir cette option en dernier, car toutes les entrées ultérieures sont interprétées comme des fichiers  
-z Compresse ou décompresse l'archive directement avec gzip gzip doit déjà être installé  
-Z Compresse ou décompresse l'archive directement avec la compression compress doit déjà être installé. Attention à la casse  
-j Compresse ou décompresse l'archive directement avec bzip2 bzip2 doit déjà être installé  
-J Compresse ou décompresse l'archive directement avec xz xz doit déjà être installé. Attention à la casse  
-k Empêche les fichiers d'écraser les fichiers existants lors de l'extraction de l'archive    
-p Maintient les droits d'accès lors de l'extraction    
-r Ajoute un fichier à une archive existante (recreate) Le dossier est joint. Fonctionne uniquement avec une archive non compressée.  
-t Affiche le contenu d'une archive (table)  
-u Ajoute seulement les fichiers qui sont plus récents que leurs versions respectives dans l'archive    
-v Affiche les étapes d'archivage (verbose)  
-vv Affiche des informations plus détaillées pendant l'archivage (very verbose)  
-w Chaque action doit être confirmée    
-x Extrait les fichiers de l‘archive (extract) les fichiers restent dans l’archive  
-A Attache les fichiers d'une archive existante à une autre Attention à la casse  
-C Indique l'emplacement où les fichiers doivent être extraits Attention à la casse  
-M Crée, visualise ou extraie une archive en plusieurs parties Attention à la casse  
-L Change le support quand le fichier dépasse une certaine taille La taille est spécifiée en kilo-octets. Attention à la casse  
-W Vérifie l’archive une fois qu’elle a été créée Attention à la casse  
-P Archive tous les fichiers du répertoire racine Attention à la casse  
--exclude Exclut les fichiers ou dossiers Spécifié après la commande pour créer avec --exclude=<file/folder>.  
-X Lit une liste de fichiers à exclure Nécessite une liste déjà créée : X <list>.list. Attention à la casse  
-g Crée un journal de tous les répertoires, y compris les sommes de contrôle    

Lors de la création d'archives tar, vous pouvez également créer des caractères génériques avec un astérisque. Lors de la création d'une nouvelle archive, spécifiez toujours les options en premier, puis le nom de fichier de l'archive que vous voulez créer, et enfin les fichiers et dossiers que vous voulez inclure. Dans l'exemple suivant, vous créez une archive (-c) à partir de deux fichiers texte, compressez-la avec gzip (-z) et écrivez-la dans le fichier archiv.tar.gz (-f) :

tar -czf archiv.tar.gz exemple_1.txt exemple_2.txt

Si vous souhaitez combiner tous les fichiers texte du répertoire dans une archive, utilisez un joker approprié :

tar -cf text_archiv.tar *.txt

Vous pouvez également combiner des répertoires complets et leurs sous-répertoires en une seule archive. Dans l'exemple suivant, /registre1, y compris tous les sous-répertoires et les fichiers qu'il contient, n'est archivé que pour le sous-répertoire /registre1/sousregistre_x :

tar -cf archiv.tar --exclude="/registre1/sousregistre_x " / registre_1 

Dans l'exemple suivant, extrayez (-x) l'archive compressée (-z) que nous avons créée dans le premier exemple vers un autre répertoire (-C) :

Pour ajouter un autre fichier à une archive (qui doit être décompressée), entrez la commande suivante, par exemple :

  tar -rf archiv.tar exemple_extra.txt

Comment fonctionne une sauvegarde avec tar ?

Les webmasters aiment utiliser tar pour les sauvegardes : la structure des répertoires est conservée et l’étendue des fonctions du programme permet en outre des réglages précis, comme le montrent les nombreuses options. Dans ce qui suit, nous expliquerons comment créer une sauvegarde complète avec tar, et comment créer des sauvegardes incrémentales avec le programme.

Créer une sauvegarde avec tar simplement

Il est logique pour votre stratégie de sauvegarde de créer un script de sauvegarde pour l'archivage de votre système au lieu de simplement créer des archives manuellement. Cela vous permet d'archiver, de compresser et de transférer automatiquement plusieurs répertoires vers un stockage de données externe. Il est important que vous ayez accès à tout moment aux répertoires correspondants. Créez d'abord un répertoire bin dans votre répertoire personnel (si vous n'en avez pas déjà un) et créez le script à cet endroit. Bien entendu, vous devez adapter l’exemple de script suivant à vos besoins et à la structure des répertoires :

  #!/bin/bash
  DATE=$(date +%Y-%m-%d-%H%M%S)
  BACKUP_DIR="/registrecible/backup"
  SOURCE="$HOME/registresource"
  tar -cvzpf $BACKUP_DIR/backup-$DATE.tar.gz $SOURCE

Pour vous aider à comprendre exactement ce que fait ce script, nous allons l’expliquer ligne par ligne :

  1. La première ligne est ce qu'on appelle le shebang, qui indique au système d'exploitation quel programme d'interprétation utiliser. Dans ce cas, on utilise bash.
  2. Chaque sauvegarde avec tar est horodatée. Ceci est important pour que plusieurs sauvegardes puissent être séparées en toute sécurité. Par exemple, on donne à la variable le format suivant : année-mois-jour-heure-heure-minute-seconde, par exemple 2017-09-07-152833.
  3. Il s’agit ensuite de spécifier le répertoire dans lequel la sauvegarde sera créée. Ne terminez pas le dernier sous-répertoire par "/".
  4. Dans cette ligne, vous spécifiez les répertoires que vous voulez inclure dans l'archive. Ici, vous pouvez aussi lister plusieurs répertoires séparés par un seul espace : SOURCE="$HOME/source directory1 $HOME/source directory2 ". Ne notez pas non plus "/" à la fin des répertoires à ce stade. Dans tous les cas, veillez à insérer un espace avant le guillemet de clôture.
  5. La dernière ligne du script se termine avec la commande tar :
    • -cvzpf crée une archive (-c), les étapes sont affichées (-v), il est compressé avec gzip (-zip), les droits d'accès sont maintenus (-p) et tout est sorti dans le fichier suivant (-f). -v et -p en particulier sont optionnels, et il est possible d'ajouter d'autres options pour modifier votre sauvegarde.
    • $BACKUP_DIR/backup-$DATE.tar.gz nomme le répertoire ($BACKUP_DIR) et le fichier dans lequel la sauvegarde doit être enregistrée. Dans notre exemple, nous ouvrons cette sauvegarde, suivie de l'horodatage en cours. Le nom du fichier se termine par la spécification du format dans lequel le fichier est créé. Si vous souhaitez utiliser une compression différente, vous devez veiller à changer à la fois le format de fichier et l’option dans la commande.
    • Enfin, utilisez la variable $SOURCE pour indiquer à tar ce qu'il faut archiver. Il est également possible d'utiliser --exclude ou -X pour exclure des répertoires ou des fichiers qui ne devraient pas être inclus dans la sauvegarde.
Conseil

Pour Linux et Unix, l’extension que l’on donne au fichier script n'a pas d'importance. Les systèmes lisent le type de fichier en comparant la structure du fichier avec un fichier magic. Il s'agit d'une base de données qui est généralement située à l’emplacement /etc/magic. Cependant, il est courant de spécifier des extensions de fichiers pour faciliter le suivi de ces derniers en tant qu'utilisateur.

Sauvegardez ensuite le fichier nommé backup dans le répertoire bin et ajoutez son chemin d'accès à la variable PATH :

PATH=$PATH:$HOME/bin

Vous devez toujours rendre exécutable le script de sauvegarde que vous venez de créer :

chmod u+x $HOME/bin/backup

Ceci rend le fichier exécutable uniquement pour vous-même (u). Vous pouvez également attribuer les droits à un groupe (g), à d'autres (o) ou à tous (a). Maintenant que vous avez terminé, vous pouvez exécuter le script :

sudo backup

Si vous souhaitez restaurer la sauvegarde, c’est-à-dire extraire l’archive, une seule commande suffit :

tar -xzf backup.tar.gz -C /

Le script crée une sauvegarde complète. Cependant, ce n'est pas toujours le bon choix lors de la sauvegarde d'un serveur complet. Par conséquent, vous devriez considérer si une sauvegarde incrémentale avec tar n'est pas plus utile pour vos besoins.

Note

Lors de la création d'une archive avec des chemins absolus, tar retourne le message : "tar : Remove leading "/" from element names". Il ne s'agit pas d'un message d'erreur, mais d'une précaution de sécurité lors de la restauration : tar fait de /home/sousregistre le chemin home/ sousregistre. Si vous n'êtes pas dans le répertoire racine lors de l'extraction de l'archive, tar crée une nouvelle structure de répertoire, par exemple : /home/sousregistre/home/home/sousregistre. Cela réduit la probabilité que vous écrasiez accidentellement l'ensemble de votre système. Rappelez-vous en effet qu’Unix ne prévient pas lors de l’écrasement. Par conséquent, si vous souhaitez réellement remplacer le contenu existant, vous devez d'abord naviguer jusqu'au répertoire racine. Vous pouvez contourner ce problème avec l’option –P.

Qu’est-ce qu’une sauvegarde incrémentale ?

Les webmasters font des sauvegardes régulières pour éviter la perte de données. Si le système actuel ne fonctionne pas, est compromis ou supprimé, une version de travail peut être installée à partir de la sauvegarde. Plus vous réaliserez régulièrement des sauvegardes, moins vous aurez de pertes de données en cas d'urgence. Si vous réalisez une sauvegarde complète à chaque fois, c'est-à-dire archivez toutes les données du système, cela prend beaucoup de temps d'une part, et il est d'autre part nécessaire de disposer d’un stockage important. À la place, vous pouvez compter sur des sauvegardes incrémentales.

Une sauvegarde incrémentale nécessite toujours un stockage complet. Vous devez d'abord archiver complètement le système (ou au moins la partie que vous voulez sauvegarder). Ensuite, seuls les fichiers nouveaux ou modifiés sont enregistrés avec une sauvegarde incrémentale. Ceci permet de réduire considérablement le volume de données, mais nécessite plus d’efforts pour une récupération. Ainsi, lorsque vous restaurez la sauvegarde, vous avez besoin de la dernière sauvegarde complète et de toutes les sauvegardes incrémentielles que vous avez effectuées depuis. Si vous avez perdu un fichier (ce qui est moins probable aujourd'hui qu'au moment des bandes magnétiques), la sauvegarde est incomplète.

Créer une sauvegarde incrémentale avec tar

Avec tar, vous pouvez créer des sauvegardes incrémentales régulières. Ici aussi, vous écrivez votre propre script de sauvegarde. Par exemple, vous pouvez spécifier qu'une sauvegarde complète est créée une fois par mois, puis une sauvegarde incrémentale est créée quotidiennement. Le script suivant déplace aussi régulièrement les anciennes sauvegardes vers des dossiers triés par date. En plus de tar, vous avez aussi besoin de cron. Ce démon (un programme qui s'exécute en arrière-plan) permet l'exécution temporelle d'autres processus. Cron est par défaut inclus dans Ubuntu. Tout d'abord, ouvrez à nouveau un éditeur de texte et créez votre script :

#!/bin/bash
BACKUP_DIR="/registrecible/backup"
ROTATE_DIR="/registrecible/backup/rotate"
TIMESTAMP="timestamp.dat"
SOURCE="$HOME/registresource"
DATE=$(date +%Y-%m-%d-%H%M%S)
EXCLUDE="--exclude=/mnt/* --exclude=/proc/* --exclude=/sys/* --exclude=/tmp/*"
cd /
mkdir -p ${BACKUP_DIR}
set -- ${BACKUP_DIR}/backup-??.tar.gz
lastname=${!#}
backupnr=${lastname##*backup-}
backupnr=${backupnr%%.*}
backupnr=${backupnr//\?/0}
backupnr=$[10#${backupnr}]
if [ "$[backupnr++]" -ge 30 ]; then
mkdir -p ${ROTATE_DIR}/${DATE}
mv ${BACKUP_DIR}/b* ${ROTATE_DIR}/${DATE}
mv ${BACKUP_DIR}/t* ${ROTATE_DIR}/${DATE}
backupnr=1
fi
backupnr=0${backupnr}
backupnr=${backupnr: -2}
filename=backup-${backupnr}.tar.gz
tar -cpzf ${BACKUP_DIR}/${filename} -g ${BACKUP_DIR}/${TIMESTAMP} -X $EXCLUDE ${SOURCE]

Voici, pas à pas, les indications pour implémenter ce script de sauvegarde :

  • Commencez par définir à nouveau l'interpréteur.
     
  • Définissez ensuite les variables. Un répertoire pour la rotation des sauvegardes (une sorte d'archive des sauvegardes) et un fichier d’horodatage (timestamp) ont été ajoutés.
     
  • Dans cet exemple, nous montrons qu’il n'est pas toujours logique d’inclure tous les répertoires dans la sauvegarde. Dans ce cas, nous avons exclu le contenu des dossiers (et non les dossiers eux-mêmes, d'où le "*") mnt, proc, sys et tmp. C’est parce que les données de ces répertoires sont temporaires ou sont créées à chaque nouveau redémarrage du système.
     
  • Pour que tous les chemins soient interprétés correctement, le script change dans le répertoire racine avec cd /.
     
  • Avec mkdir, vous créez le répertoire de sauvegarde s’il n’existe pas déjà.
     
  • Toutes les variables sont déchiffrées. Puisque vous voulez numéroter vos sauvegardes de manière consécutive, le bloc de code détermine le numéro de la dernière sauvegarde. Ceci se fait en supprimant les autres parties du nom du fichier.
     
  • Il n’est possible de faire que 30 sauvegardes à la fois, après quoi le script déplace tous les fichiers d’archive dans le dossier de rotation. Il est d’abord créé, puis tous les fichiers commençant par b et t sont déplacés dans le nouveau dossier avec mv. La limitation des lettres s’explique par le fait que seuls les fichiers ainsi marqués avec lui devraient de toute façon se trouver dans le dossier, d’où les balises backup et timestamp. Enfin, le script réinitialise le numéro de sauvegarde à 1, et si votre script détecte qu’aucune des 30 sauvegardes n’a été créée, il augmente simplement le numéro de fichier de 1 (++).
     
  • Ensuite, le script annule virtuellement ce qu’il a fait au début : les commandes permettent de s'assurer que le nom du fichier est à nouveau complet, et désormais porteur du nouveau numéro.
     
  • Enfin, le script exécute la commande tar proprement dite : par rapport à la commande de la simple sauvegarde complète, une autre option a été ajoutée. Avec -g, la sauvegarde incrémentale est possible. Pour ce faire, tar lit l'horodatage de chaque fichier, le compare avec les données enregistrées dans timestamp.dat afin qu'il puisse décider quels changements se sont produits depuis la dernière sauvegarde. Seuls ces documents font partie des nouvelles archives.
Note

Le script déplace les fichiers de sauvegarde dans un nouveau dossier d'archives chaque mois (avec archivage quotidien) de sorte que le répertoire de sauvegarde ne contient que les données les plus récentes. Cependant, il n’y a pas de fonction intégrée qui limite le nombre de dossiers d'archives. Cela signifie que vous devez les supprimer manuellement.

Pour compléter le script de création d'une sauvegarde incrémentale avec tar, il faut enregistrer le fichier comme backup dans le répertoire bin. Là encore, vous devez exporter le chemin d'accès et rendre le script exécutable :

PATH=$PATH:$HOME/bin
chmod u+x $HOME/bin/backup

En théorie, vous pouvez maintenant démarrer votre script de sauvegarde avec sudo backup. L'idée derrière la sauvegarde incrémentale, toutefois, est que le processus est automatisé et exécuté quotidiennement. Pour ce faire, utilisez cron et modifiez ce que l'on appelle crontab. C'est la table que cron utilise pour effectuer des tâches. Elle comprend six champs :

Minutes (0-59) Heures (0-23) Jours (1-31) Mois (1-12) Jours de la semaine (0-7) Mission

Dans les champs, vous pouvez saisir des nombres selon la plage de valeurs (entre parenthèses) ou un astérisque (*). Ce dernier signifie toutes les valeurs possibles. La colonne jour de la semaine est une caractéristique spéciale. Ceci vous permet de spécifier qu'un ordre est exécuté tous les lundis (1) ou seulement les jours ouvrables (1-5), par exemple. Le dimanche peut être spécifié par deux valeurs différentes : 0 et 7 se réfèrent au dimanche, puisque pour certaines personnes, la semaine commence par ce jour et pour d'autres, elle se termine par ce jour.

Dans la ligne de commande, ouvrez le mode éditeur de cron avec :

sudo crontab –e

Entrez ensuite la ligne de code ci-dessous :

30 7 * * * /home/bin/backup

Cela signifie que la sauvegarde est effectuée tous les jours (et tous les mois, quel que soit le jour de la semaine) à 7h30. Sauvegardez vos modifications, puis votre sauvegarde incrémentale quotidienne est prête à démarrer.

Note

Cron ne fonctionne que lorsque votre système est en cours d'exécution. Ceci devrait être le cas avec tous les serveurs Web. Cependant, si vous prévoyez d'utiliser le script pour sauvegarder votre PC ou votre ordinateur portable, vous devez garantir que les appareils fonctionneront tous les jours à 7h30 du matin. Si l’appareil n’est pas allumé, la sauvegarde ne peut tout simplement pas avoir lieu. Une option pour contourner ce problème est offerte par anacron. Ce programme déplace l'exécution planifiée d'un système qui ne fonctionne pas à un moment où l'appareil est à nouveau actif.

Restauration d’un système à partir d’une sauvegarde

C’est évidemment une situation que l’on cherche à éviter, mais il peut se produire une urgence qui nécessite la restauration de votre système. Avec tar, c’est aussi relativement facile, et aucun script supplémentaire n’est nécessaire. Cependant, il n’est pas possible de procéder à une seule commande comme une simple sauvegarde complète : la nature même de la sauvegarde incrémentale implique que plusieurs fichiers doivent être décompressés. Entrez ces lignes de commande dans la console :

  BACKUP_DIR=/registrecible/backup
cd /
  for archiv in ${BACKUP_DIR}/backup-*.tar.gz; do
  tar -xpzf $archiv -C /
  done
Note

Lors de la restauration du système à partir de la sauvegarde, tous les répertoires, donc éventuellement aussi les fichiers importants, sont écrasés.

Pour éviter d'avoir à extraire chaque fichier d'archive individuellement, utilisez une boucle for :

  1. En premier lieu, commencez par définir le répertoire dans lequel se trouvera la sauvegarde.
  2. cd / bascule vers le répertoire racine pour s’assurer que l’archive est extraite à l'emplacement correct.
  3. Lancez maintenant une boucle for : cette commande répète toutes les actions à faire jusqu’à ce que toutes les possibilités aient été complétées. Pour spécifier la commande, spécifiez le chemin de vos sauvegardes avec un astérisque comme wildcard, car vous voulez décompresser tous les fichiers d'archive dans ce répertoire.
  4. Spécifiez la commande tar comme suit : il faut extraire (-x), tout en conservant les droits d'accès (-p), et décompresser (-z) l'archive (-f $archiv) dans le répertoire racine (-C /).
  5.  Done permet de terminer la boucle.

Comme vous avez numéroté les archives à la suite lors de leur création, les sauvegardes sont restaurées les unes après les autres, en commençant par les plus anciennes. Ceci est important, car les archives créées après la sauvegarde complète contiennent des versions plus récentes des fichiers. Cela signifie que pendant la boucle, l’ancienne version est d’abord extraite puis, pendant l’exécution suivante, écrasée par une version plus récente. À la fin, vous avez écrasé tout le système avec la sauvegarde et restauré la dernière version archivée de chaque fichier.

C'est le véritable but d'une sauvegarde incrémentale : la restauration complète du système. Avec un petit détour, il est même possible d'enregistrer un seul fichier et de récupérer la dernière version archivée. Pour ce faire, procédez en deux étapes :

  BACKUP_DIR=/registrecible/backup
  ls -l ${BACKUP_DIR}
  for archiv in ${BACKUP_DIR}/backup-*tar.gz; do
  tar -tzf $archiv | grep searched-file;
  done

Dans cette première étape, vous utilisez également une boucle, qui est utilisée pour la recherche et non pour l'extraction :

  1. Redéfinissez un répertoire de sauvegarde.
  2. Utilisez la commande ls pour afficher tous les fichiers et dossiers du répertoire de sauvegarde. L'option -l fournit des informations détaillées.
  3. Ouvrez une boucle comme lors de la restauration de l'archive complète.
  4. Le changement important se trouve dans les options de la commande tar : au lieu de créer une archive (c) ou d'extraire (x), affichez le contenu des archives (t). Cependant, comme vous ne voulez pas rechercher le fichier vous-même, transférez la sortie avec un tube (ligne verticale) à la commande grep. Cette fonction permet de rechercher le fichier souhaité dans la sortie (le contenu des archives).
  5. Fermez la boucle.

Maintenant, le terminal vous montrera le fichier que vous recherchez, et peut-être même plusieurs fois si vous l'avez édité régulièrement et qu'il apparaît dans chaque sauvegarde incrémentale. Ensuite, reprenez le chemin d'accès au fichier et créez une autre boucle qui restaurera la dernière version sauvegardée :

  for archiv in ${BACKUP_DIR}/backup-*.tar.gz; do
  tar –xzf $archiv -C /registrecible/backup/searched-file
  done

Maintenant, le fichier est restauré à son emplacement d'origine et écrase une éventuelle version plus récente.