Tar et cpio

De UnixManiax
Aller à la navigation Aller à la recherche


Introduction

Tar et cpio sont deux commandes qui permettent d'archiver de simples fichiers ou toute une arborescence. Leur syntaxe et leur fonctionnement sont différents. Ce qui les différencie surtout, c'est que tar travaille sur des fichiers, alors que cpio travaille sur les entrées/sorties standard, et que tar ne conserve pas les droits ni les propriétaires des fichiers, alors que cpio le fait (en réalité, tar peut le faire avec l'option '-p', mais ça n'est pas son fonctionnement par défaut).

On va donc plutôt utiliser tar quand on veut archiver des données qui pourront être utilisables par tout le monde. C'est le cas la plupart du temps ; c'est utilisé notemment par les développeurs quand ils donnent leurs codes source (ces archives sont souvant compressées et portent l'extention .tgz).

Cpio servira plutôt pour faire des sauvegardes de son système, pour pouvoir restaurer des données à l'identique.

Tar et cpio possèdent énormément d'options qui permettent, par exemple, de faire du multi-volumes sur plusieurs bandes, et bien d'autres choses encore. Mon but ici n'est pas de détailler tout ce qu'ils sont capables de faire (pour celà, je vous conseille de lire les pages man qui sont très bien faites), mais de vous donner les commandes principales qui suffisent largement la plupart du temps, et vous permettront déjà de créer, lister et extraire des archives.


tar

présentation

A l'origine, tar a été créé pour faire des archives de fichiers sur bande magnétique. Mais l'utilisation la plus courante de tar à l'heure actuelle est pour archiver et compresser des fichiers dans un fichier unique, qui est ensuite facilement transportable sur une clé USB ou par mail.

créer une archive

Pour archiver le répertoire "documents" (qui se trouve dans "/home/fred/") dans le fichier docs.tar, il faut se placer dans /home/fred/ et taper :

tar -cvf docs.tar documents

Remarque : l'option 'v' est facultative. Elle permet simplement de visualiser le nom des fichiers au fur et à mesure qu'ils sont ajoutés à l'archive. L'option "c" sert à indiquer qu'on crée une archive, et "f" sert à préciser le nom du fichier (docs.tar).

On peut également compresser l'archive dès sa création en rajoutant l'option 'z'. Dans ce cas, on va nommer l'archive ".tgz" (ou ".tar.gz") pour indiquer qu'elle est compressée avec gzip

tar -czvf docs.tgz documents

On peut aussi compresser avec bzip2 (meilleur taux de compression, mais plus lent) en remplaçant 'z' par 'j'. L'archive aura cette fois l'extention ".tbz2" (ou ".tar.bz2") :

tar -cjvf docs.tbz2 documents

Quand on crée une archive, on peut lui passer plusieurs fichiers et répertoires se ,situant à des endroits différents :

tar -czvf archive.tgz fichier1 fichier2 /home/fred/fichier3 repertoire1 /tmp/repertoire2

Il est important de remarquer que c'est le répertoire "documents" et son contenu, qui sont archivés. Donc quand on va restaurer l'archive, un répertoire "documents" sera créé (s'il n'existe pas) depuis l'endroit où on se trouve et les fichiers seront copiés dedans. Si on avait créé l'archive en indiquant le répertoire "/home/fred/documents", alors c'est un répertoire "home/fred/documents" qui sera créé quand on va restaurer l'archive. C'est un point auquel il faut faire attention lorsqu'on crée l'archive.

Il faut également noter que le premier "/" du répertoire qu'on archive, si on en met un, est systématiquement ignoré à la restauration de l'archive. C'est normal, c'est pour éviter qu'un utilisateur créé des fichiers à la racine du système.

Pour ne prendre en compte qu'une partie des fichiers, on peut utiliser des caractères joker (voir l'option "--wildcards" dans le tableau des options utiles ci-dessous).

créer une archive via un tunnel ssh

Il peut être très pratique de pouvoir créer une archive tar via ssh, par exemple si on a plus assez de place sur la machine source.

tar czf - /source/ | ssh user@host "cat - > /rep_dest/fichier.tgz"

ajouter un fichier à une archive

On peut ajouter un fichier à une archive existante :

tar rvf archive.tar fichier_a_ajouter

Par contre, ça ne fonctionne pas sur une archive compressée. La solution est alors de décompresser l'archive, d'ajouter le fichier, et de recompresser :

gunzip archive.tar.gz
tar rvf archive.tar ficher_a_ajouter
gzip archive.tar

lister le contenu d'une archive

Pour lister le contenu d'une archive, on remplace l'option "c" par "t" (comme "Type") :

tar -tvf archive.tar

Il faudra penser à rajouter l'option "z" ou "j", si on a une archive ".tgz" ou ".tbz2".

restaurer une archive

Pour restaurer une archive, il faut remplacer l'option "c" ou "t" par "x" (comme "eXtract"). Il faut bien faire attention au fait que l'archive se restaure à l'endroit d'où on tape la commande de restauration, et pas à son emplacement d'origine.

tar -xvf archive.tar

les options utiles

Voici un tableau qui recense quelques autres options qui peuvent être utiles :

option description
-A concatenate : ajoute le contenu d'une archive tar à une autre
-u update : met à jour une archive en ajoutant seulement les fichiers plus récents
-g incrémental (-G idem, mais GNU ancienne version)
-h ne sauvegarde pas les liens, mais les fichiers vers lesquels ils pointent
-M multivolume
-C repertoire_dest restaure les données dans "repertoire_dest", plutôt que dans le répertoire courant
-L ou --tape-length valeur demande le changement de cassette après avoir écrit 'valeur x 1024 octets'
-p conserve les droits et propriétaires des fichiers
-P ou --absolute-name n'enlève pas le '/' au début des noms de fichiers
--acls (ou --no-acls) préserve les acls (ou pas)
--selinux (ou --no-selinux) préserve le contexte selinux (ou pas)
--xattrs (ou --no-xattrs) = --acls + --selinux
-V nom_volume crée l'archive avec le nom de volume "nom_volume"
-W ou --verify vérifie l'archive après l'écriture
--exclude PATTERN exclue les fichiers basés sur l'expression régulière PATTERN

Exemple : tar czvf home.tgz /home/* --exclude "*toto*" --exclude "*titi*"

-X ou --exclude-from fichier exclue les fichiers listés dans "fichier"
--wildcards "*texte*" ne tient compte que des fichiers dont le nom (avec le chemin) contient "texte". Cette option est inutile sur les distributions basées sur RedHat, mais doit être mise sur les debian/ubuntu.


cpio

présentation

Cpio permet d'archiver une liste de fichiers en conservant les propriétaires, groupes, dates et droits d'origine.

Cpio récupère les noms de fichiers sur l'entrée standard et les sauvegarde sur la sortie standard. Donc la méthode habituelle consiste à récupérer la liste des fichiers avec find, et à faire une redirection dans un fichier, après avoir compressé à travers un pipe (voir exemples ci-dessous).

créer une archive

find repertoire -name *.log | cpio -o | gzip > archive.cpio.gz

Il est conseillé de nommer le fichier archive *.cpio.gz (ou *.cpio.bz2 si on utilise bzip2) pour savoir que c'est une archive cpio compresse. Sinon, on risque de ne pas s'en rappeler plus tard, et donc ne pas pouvoir récupérer les fichiers

lister le contenu d'une archive

gunzip -c archive.cpio.gz | cpio -t

On voit souvent des documents qui disent qu'il faut utiliser les options "-it" (ou "--extract --list") en même temps. C'est utile pour d'anciennes versions de cpio (notamment sous Solaris), mais maintenant, seule l'option "-t" (ou "--list") suffit.

restaurer tout ou partie d'une archive

1/ restaurer tout en écrasant tous les fichiers existants, sans poser de question :

gunzip archive.cpio.gz | cpio -ivud

2/ ne restaurer que les fichiers qui ont été perdus ou qui sont plus ancien que ceux de l'archive :

gunzip archive.cpio.gz | cpio -iv

3/ ne restaurer que certains fichiers :

a) créer une liste des fichiers dans un fichier liste.txt (un fichier par ligne)

b) lancer la restauration avec la commande suivante :

gunzip archive.cpio.gz | cpio -ivu -E liste.txt

les options utiles

Voici un tableau qui recense quelques autres options qui peuvent être utiles :

option version longue description
-o --create créer une archive
-i --extract extraire une archive
-t --list liste le contenu d'une archive
-d reconstruit les répertoires qui n'existent plus
-u restaure les fichiers sur le disque, même si une version plus récente existe
-c utilise l'ancien format ascii, pour une meilleure portabilité
-v "verbose", mode bavard