Le système d'exploitation GNU-Linux/Le backup : tar et gzip
Régulièrement, il vous faudra archiver des informations, en particulier des données utilisateurs.
Pour cela, le système GNU/Linux intègre 2 outils: TAR et GZIP.
Comme vous allez le voir, ces 2 outils sont complémentaires dans le procéssus d'archivage des données, ou backup.
Archiver des données avec tar
modifierLe nom de cette commande vient du système de sauvegarde sur bande : Tape ARchive. Le principe est simple : prendre un grand nombre de fichiers (et/ou de répertoires) et les regrouper en un seul gros. tar est une commande récursive. Elle va archiver toute l'arborescence en partant du répertoire que vous lui spécifiez.
Archivage
modifierSyntaxe :
$ tar cf <nom du fichier tar> <nom du répertoire à archiver>
Si vous rajoutez v après c, la commande va afficher à l'écran toutes ses actions.
Exemple :
# tar cvf etc.tar /etc tar: Removing leading `/' from member names /etc # ls -l etc.tar -rw-r--r-- 1 root root 2829320 Nov 12 18:41 etc.tar
Note: Comme vous le voyez sur notre exemple, la commande tar retire le / du répertoire parent. En faisant cela, elle évite les écrasements de fichiers dans le cas ou vous restituez votre fichier au même endroit.
Test de l'archive
modifierUne fois l'archivage effectué, vous pouvez vérifier votre archive avec la commande :
$ tar tf ''<nom du fichier tar>''
Restitution
modifier# tar xf ''<nom du fichier tar>''
De même, si vous rajoutez v après x, la commande affichera les informations.
Exemple :
# tar xvf etc.tar etc/ etc/GNUstep/ etc/GNUstep/Defaults/ etc/GNUstep/Defaults/WMGLOBAL etc/GNUstep/Defaults/WMRootMenu etc/GNUstep/Defaults/WMState ...
gzip
modifierLa commande gzip est un compresseur de données. Il va partir d'un fichier et compresser l'information pour en diminuer la taille.
Compresser un fichier
modifier$ gzip ''<nom du fichier à compresser>''
Exemple :
# ls -l images.tar* -rw-r--r-- 1 root root 10240 Nov 8 20:00 images.tar # gzip images.tar # ls -l images.tar* -rw-r--r-- 1 root root 4662 Nov 8 20:00 images.tar.gz
En utilisant ls -l , on voit très bien la taille du fichier images non compressé, qui est passé de 10240 octets à 4662 octets.
Pour compresser chaque fichier d'un dossier, utiliser l'option "recursive" : gzip -r
. Par contre gzip ne permet pas de compresser tout le dossier dans un seul fichier .gz (d'où l’intérêt de le combiner avec tar
).
Pour compresser sous un autre nom, deux solutions :
- -S (suffixe)
- -c (sortie standard). Ex :
gzip -c test.log > $(date +"%y_%m_%d")_test.log.gz
Décompresser un fichier
modifier$ gzip -d ''<nom du fichier gzip>''
Exemple :
# ls -l images.tar* -rw-r--r-- 1 root root 4662 Nov 8 20:00 images.tar.gz # gzip -d images.tar.gz # ls -l images.tar* -rw-r--r-- 1 root root 10240 Nov 8 20:00 images.tar
gunzip
.Lire un .gz
modifierIl existe la commande zgrep
pour filtrer le contenu des fichiers gzippés, évitant ainsi de les décompresser, grepper, puis recompresser. Ex :
zgrep 'ma chaine' *.gz
Combiner tar et gzip
modifierOn peut combiner tar et gzip pour archiver et compresser en une action (option z) :
# tar cvzf <nom du fichier archivé compressé>.tar.gz <nom du répertoire à archiver et compresser>
Les alternatives à gzip
modifierbzip2
modifierbzip2 est un autre algorithme de compression. Il est plus performant mais beaucoup moins rapide que gzip.
Pour compresser un fichier avec bzip2 :
# bzip2 unfichier
Pour le décompresser :
# bzip2 -d unfichier.bz2
Tout comme gzip, on peut indiquer à tar d'utiliser bzip2 pour compresser l'archive (option j):
# tar cjf cible.tar.bz2 /repasauver
Comparaison des logiciels de compression
modifierUn shell script de sauvegarde journalière de /etc
modifierVoici un shell script qui permet de sauvegarder quotidiennement le répertoire /etc :
#!/bin/bash # # Ne pas oublier : # - de creer le repertoire /backup : mkdir /backup # - de rendre ce script executable : chmod +x backup_etc # # Tester le script une fois manuellement : ./backup_etc # # Le rajouter dans la crontab DATEJOUR=$(date +"%Y-%m-%d-%H-%M-%S") REPABACKUPER="/etc" REPBACKUP="/backup" NOMFIC=$REPBACKUP/etc-$DATEJOUR.tgz tar czf $NOMFIC $REPABACKUPER
Les sauvegardes incrémentales
modifierLa commande find permet de trouver des fichiers correspondants à des critères donnés. On peut par exemple connaître la liste des fichiers modifiés depuis 1 jour :
# find / -mtime -1 -type f
En combinant la commande find et la commande tar, on peut ainsi facilement sauvegarder les fichiers modifiés depuis la veille, et ainsi réaliser une sauvegarde incrémentale.
La commande suivante retourne la liste de tous les fichiers du système modifiés depuis hier (en excluant les fichiers contenus dans /proc, /dev et /sys), et stocke la liste de ces fichiers dans le fichier /tmp/fic_du_jour:
# find / \( -path /proc -o -path /dev -o -path /sys -o -path /run \) -prune -o -mtime -1 -type f -print > /tmp/fic_du_jour
On peut ensuite appeler la commande tar avec l'option -T qui permet d'indiquer la liste des fichiers à archiver :
# tar cz -T /tmp/fic_du_jour -f backup.tgz
Grâce aux tubes (pipe), on peut s'affranchir de passer par un fichier temporaire et directement enchaîner les deux commandes :
# find / \( -path /proc -o -path /dev -o -path /sys \) -prune -o -mtime -1 -type f -print | tar cz -T - -f backup.tgz
Toujours grâce aux tubes, on peut découper le fichier obtenu en plusieurs fichiers d'une taille donnée :
# find / \( -path /proc -o -path /dev -o -path /sys \) -prune -o -mtime -1 -type f -print | tar cz -T - | split - -b 5m backup_ # ls -lh backup_* -rw-r--r-- 1 root root 5,0M 2007-12-06 14:30 backup_aa -rw-r--r-- 1 root root 5,0M 2007-12-06 14:30 backup_ab -rw-r--r-- 1 root root 5,0M 2007-12-06 14:30 backup_ac -rw-r--r-- 1 root root 3,5M 2007-12-06 14:30 backup_ad
Pour re-assembler les fichiers découpés, on utilise la commande cat :
# cat backup_* > backup.tgz