Chapitre 10. Gestion des données

Table des matières

10.1. Partager, copier et archiver
10.1.1. Outils d’archivage et de compression
10.1.2. Outils de copie et de synchronisation
10.1.3. Idiomes pour les archives
10.1.4. Idiomes pour la copie
10.1.5. Idiomes pour la sélection de fichiers
10.1.6. Support d’archive
10.1.7. Périphériques d’enregistrement amovibles
10.1.8. Choix de système de fichiers pour les données partagées
10.1.9. Partage de données au travers du réseau
10.2. Sauvegarde et restauration
10.2.1. Suites d’utilitaires de sauvegarde
10.2.2. Script d’exemple pour la sauvegarde du système
10.2.3. Un script de copie pour la sauvegarde des données
10.3. Infrastructure de sécurité des données
10.3.1. Gestion de clés pour GnuPG
10.3.2. Utilisation de GnuPG sur des fichiers
10.3.3. Utiliser GnuPG avec Mutt
10.3.4. Utiliser GnuPG avec Vim
10.3.5. La somme de contrôle MD5
10.4. Outils pour fusionner le code source
10.4.1. Extraire des différences pour des fichiers sources
10.4.2. Fusionner les mises à jour des fichiers source
10.4.3. Mise à jour par fusion de 3 sources
10.5. Systèmes de contrôle de version
10.5.1. Comparaison de commandes VCS
10.6. Git
10.6.1. Configuration du client Git
10.6.2. Références de Git
10.6.3. Commandes de Git
10.6.4. Git pour le dépôt Subversion
10.6.5. Git pour l’enregistrement de l’historique de la configuration
10.7. CVS
10.7.1. Configuration du dépôt CVS
10.7.2. Accès local à CVS
10.7.3. Accès distant à CVS avec pserver
10.7.4. Accès distant à CVS avec ssh
10.7.5. Importer une nouvelle source dans CVS
10.7.6. Permissions des fichiers du dépôt CVS
10.7.7. Flux de travail avec CVS
10.7.8. Derniers fichiers venant du CVS
10.7.9. Administration de CVS
10.7.10. Bit d’exécution pour la vérification (« checkout ») du CVS
10.8. Subversion
10.8.1. Configuration du dépôt Subversion
10.8.2. Accès à Subversion par l’intermédiaire d’un serveur Apache2
10.8.3. Accès local à Subversion par un groupe
10.8.4. Accès distant à Subversion avec SSH
10.8.5. Structure de répertoires de Subversion
10.8.6. Importer une nouvelle source vers Subversion
10.8.7. Flux de travail avec Subversion

Des outils et astuces pour gérer les données binaires ou textuelles sur le système sont décrits.

[Avertissement] Avertissement

Il ne faut pas accéder de manière non coordonnée en écriture à des périphériques et des fichiers à haut trafic depuis différents processus pour éviter une compétition d’accès (« race condition ». Pour l’éviter, on peut utiliser les mécanismes de verrouillage de fichier (« File locking » en utilisant flock(1).

La sécurité des données et leur partage contrôlé présentent plusieurs aspects.

  • La création d’une archive des données

  • L’accès à un stockage distant

  • La duplication

  • Le suivi de l’historique des modifications

  • La facilité de partage des données

  • La prévention de l’accès non autorisé aux données

  • La détection des modifications de fichier non autorisées

Cela peut être réalisé avec certaines combinaisons d’outils.

  • Outils d’archivage et de compression

  • Outils de copie et de synchronisation

  • Systèmes de fichiers par le réseau

  • Supports d’enregistrement amovibles

  • L’interpréteur de commandes sécurisé

  • Le système d’authentification

  • Outils de système de contrôle de version

  • Outils de hachage et de chiffrement

Voici un résumé des outils d’archivage et de compression disponible sur le système Debian :

Tableau 10.1. Liste des outils d’archivage et de compression

paquet popcon taille extension commande commentaire
tar V:532, I:999 2516 .tar tar(1) archiveur standard (standard de fait)
cpio V:384, I:999 844 .cpio cpio(1) archiveur de style UNIX System V, utiliser avec find(1)
binutils V:364, I:738 18832 .ar ar(1) archiveur pour la création de bibliothèques statiques
fastjar V:10, I:100 191 .jar fastjar(1) archiveur pour Java (semblable à zip)
pax V:20, I:71 181 .pax pax(1) nouvel archiveur standard POSIX, compromis entre tar et cpio
gzip V:862, I:999 235 .gz gzip(1), zcat(1), … utilitaire de compression GNU LZ77 (standard de fait)
bzip2 V:420, I:874 119 .bz2 bzip2(1), bzcat(1), … utilitaire de transformée par tri de blocs de Burrows-Wheeler permettant un taux de compression plus élevé que gzip(1) (plus lent que gzip avec une syntaxe similaire)
lzma V:13, I:177 144 .lzma lzma(1) utilitaire de compression LZMA avec un plus haut taux de compression que gzip(1) (obsolète)
xz-utils V:249, I:916 472 .xz xz(1), xzdec(1), … utilitaire de compression XZ avec un plus haut taux de compression que bzip2(1) (plus lent que gzip mais plus rapide que bzip2; le remplaçant de LZMA utilitaire de compression)
p7zip V:10, I:90 986 .7z 7zr(1), p7zip(1) archiveur de fichiers 7-Zip avec un haut taux de compression (compression LZMA)
p7zip-full V:241, I:515 3895 .7z 7z(1), 7za(1) archiveur de fichiers 7-Zip avec un haut taux de compression (compression LZMA et autres)
lzop V:4, I:37 112 .lzo lzop(1) utilitaire de compression LZO avec de plus hautes vitesses de compression et de décompression que gzip(1) (plus faible taux de compression que gzip avec une syntaxe similaire)
zip V:56, I:357 593 .zip zip(1) InfoZIP : outil d’archive et de compression DOS
unzip V:278, I:775 377 .zip unzip(1) InfoZIP : outil de désarchivage et de décompression DOS

[Avertissement] Avertissement

Ne positionnez par la variable « $TAPE » à moins que vous ne sachiez à quoi vous attendre. Elle modifie le comportement de tar(1).

[Note] Note

L’archive tar(1) utilise l’extension de fichier « .tgz » ou « .tar.gz ».

[Note] Note

L’archive tar(1) avec compression xz utilise l’extension de fichier « .txz » ou « .tar.xz ».

[Note] Note

La méthode de compression habituelle des outils FOSS tels que tar(1) a été modifiée de la manière suivante : gzipbzip2xz

[Note] Note

cp(1), scp(1) et tar(1) peuvent avoir certaines limitations pour des fichiers spéciaux. cpio(1) est plus souple.

[Note] Note

cpio(1) est conçu pour être utilisé avec find(1) et d’autres commandes et est adapté à la création de scripts de sauvegarde car la partie correspondant à la sélection de fichier du script peut être testée indépendamment.

[Note] Note

La structure interne des fichiers de données d’OpenOffice sont des fichiers « .jar ».

Voici une liste d’outils simples de copie et de sauvegarde sur le système Debian :


Copier des fichiers avec rsync(8) offres des fonctionnalités plus riches que les autres méthodes.

  • algorithme de transfert delta qui n’envoie que la différence entre les fichiers source et les fichiers existants sur la destination

  • algorithme de vérification rapide (par défaut) recherchant les fichiers dont la taille ou l’heure de dernière modification a été modifiée

  • Les options « --exclude » et « --exclude-from » sont semblables à celles de tar(1)

  • La syntaxe « un slash en fin de répertoire source » qui évite la création d’un niveau de répertoire supplémentaire à la destination.

[Astuce] Astuce

L’exécution du script bkup mentionné dans Section 10.2.3, « Un script de copie pour la sauvegarde des données » avec l’option « -gl » sous cron(8) fournira une fonctionnalité très semblable à dumpfs de Plan9 pour l’archivage des données statiques.

[Astuce] Astuce

Les outils de système de contrôle de version (VCS) de Tableau 10.11, « Liste d’outils pour les systèmes de contrôle de version » peuvent fonctionner comme outils de synchronisation et de copie multi-voies.

Voici quelques manières d’archiver et de désarchiver le contenu entier du répertoire « ./source » en utilisant différents outils.

  • Copie locale du répertoire « ./source » → répertoire « /dest »

  • Faire le copie distante du répertoire « ./source » de la machine locale → répertoire « /dest » situé sur la machine « user@host.dom »

rsync(8):

# cd ./source; rsync -aHAXSv . /dest
# cd ./source; rsync -aHAXSv . user@host.dom:/dest

Vous pouvez, en remplacement, utiliser la syntaxe « un slash en fin du répertoire source ».

# rsync -aHAXSv ./source/ /dest
# rsync -aHAXSv ./source/ user@host.dom:/dest

ou encore, comme suit :

# cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . /dest
# cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . user@host.dom:/dest

GNU cp(1) et openSSH scp(1) :

# cd ./source; cp -a . /dest
# cd ./source; scp -pr . user@host.dom:/dest

GNU tar(1) :

# (cd ./source && tar cf - . ) | (cd /dest && tar xvfp - )
# (cd ./source && tar cf - . ) | ssh user@host.dom '(cd /dest && tar xvfp - )'

cpio(1) :

# cd ./source; find . -print0 | cpio -pvdm --null --sparse /dest

Vous pouvez remplacer « . » par « truc » dans tous les exemples comportant « . » pour copier les fichiers du répertoire « ./source/truc » vers le répertoire « /dest/truc ».

Vous pouvez remplacer « . » par le chemin absolu « /chemin/vers/source/truc » dans tous les exemples comportant « . » pour éviter « cd ./source; ». Cela permet de copier les fichiers vers différents emplacements selon les outils utilisés de la manière suivante :

  • « /dest/truc » : rsync(8), GNU cp(1) et scp(1)

  • « /dest/chemin/vers/source/truc »: GNU tar(1) et cpio(1)

[Astuce] Astuce

rsync(8) et GNU cp(1) possèdent l’option « -u » pour sauter les fichiers qui sont plus récents sur la destination.

find(1) est utilisé pour la sélection de fichiers pour les commandes d’archive et de copie (consultez Section 10.1.3, « Idiomes pour les archives » et Section 10.1.4, « Idiomes pour la copie ») ou pour xargs(1) (consultez Section 9.3.9, « Répéter une commande en bouclant entre des fichiers »). Cela peut être amélioré en utilisant ces paramètres de commande.

La syntaxe de base de find(1) peut être résumée comme suit :

  • Ses paramètres conditionnels sont évalués de gauche à droite.

  • L’évaluation s’arrête lors que son résultat est déterminé.

  • Le « OU logique » (indiqué par « -o » entre les éléments conditionnels) a une plus faible priorité que le « ET logique » (indiqué par « -a » ou rien entre éléments conditionnels).

  • Le « NON logique » (indiqué par « ! » avant un élément conditionnel) a une priorité plus élevée que le « ET logique ».

  • « -prune » retourne toujours un VRAI logique et, si c’est un répertoire, la recherche de fichier est arrêtée au-delà de ce point.

  • « -name » correspond à la base du nom de fichier avec les motifs génériques de l’interpréteur de commandes (voir Section 1.5.6, « Motifs génériques (« glob ») de l’interpréteur de commandes ») mais il correspond aussi à son « . » de début avec des métacaractères comme « * » et « ? » (nouvelle fonctionnalité POSIX).

  • « -regex » correspond au chemin complet par défaut dans le style BRE Emacs (consultez Section 1.6.2, « Expressions rationnelles »).

  • « -size » correspond au fichier en se basant sur la taille du fichier (valeur précédée de « + » pour plus grand et précédée de « - » pour plus petit)

  • « -newer » correspond au fichier plus récent que celui indiqué comme paramètre.

  • « -print0 » retourne toujours la valeur logique VRAI et affiche sur la sortie standard le nom de fichier en entier (terminé par le caractère null).

find(1) est souvent utilisé dans un style idiomatique comme ce qui suit :

# find /chemin/vers/ \
    -xdev -regextype posix-extended \
    -type f -regex ".*\.cpio|.*~" -prune -o \
    -type d -regex ".*/\.git" -prune -o \
    -type f -size +99M -prune -o \
    -type f -newer /chemin/vers/horodatage -print0

Cela signifie que les actions suivantes doivent être effectuées :

  1. rechercher tous les fichiers en partant de « /chemin/vers » ;

  2. limiter globalement sa recherche à l’intérieur du système de fichiers et utiliser ERE (consultez Section 1.6.2, « Expressions rationnelles ») ;

  3. exclure les fichiers correspondant à l’expression rationnelle de « .*\.cpio » ou « .*~ » de la recherche en arrêtant le traitement ;

  4. exclure les répertoires qui correspondent à l’expression rationnelle de « .*/\.git » de la recherche en arrêtant le traitement ;

  5. exclure les fichiers plus gros que 99 Megaoctets (unités de 1048576 octets) de la recherche en arrêtant le traitement ;

  6. afficher les noms de fichiers qui satisfont aux conditions de recherche précédents et plus récents que « /chemin/vers/horodatage ».

Remarquez l’utilisation idiomatique de « -prune -o » pour exclure les fichiers dans l’exemple ci-dessus.

[Note] Note

Pour les systèmes UNIX-like autre que Debian, certaines options peuvent ne pas être prises en compte par find(1). Dans un tel cas, essayez d’adapter la méthode de correspondance et remplacez « -print0 » par « -print ». Vous devrez aussi ajuster les commandes associées.

Lors du choix d’un support d’enregistrement de données informatiques destiné à l’archivage de données importantes, il faut faire attention à leurs limitations. Pour des petites sauvegardes de données personnelles, j’utilise des CD-R et des DVD-R provenant d’une grande marque et je les range dans un endroit frais, à l’ombre, sec et propre. (Les supports d’archive sur bande semblent être populaires pour les utilisations professionnelles).

[Note] Note

Un coffre-fort anti-feu est destiné aux documents sur papier. La plupart des supports de stockage de données informatiques ont une tolérance en température inférieure à celle du papier. J’utilise en général plusieurs copies chiffrées stockées dans différents endroits sûrs.

Durées de vie optimistes des moyens d’archivage trouvées sur le net (la plupart à partir d’informations des constructeurs).

  • 100 ans et plus : papier non acide et encre

  • 100 ans : stockage optique (CD/DVD, CD/DVD-R)

  • 30 ans : supports magnétiques (bande, disquette)

  • 20 ans : disque optique à changement de phase (CD-RW)

Cela ne prend pas en compte les défaillances mécaniques dues aux manipulations, etc.

Nombre de cycles d’écriture optimistes des moyens d’archivage trouvées sur le net (la plupart à partir d’informations des constructeurs).

  • plus de 250 000 : disque dur

  • plus de 10 000 cycles : mémoires Flash

  • 1000 cycles : CD/DVD-RW

  • 1 cycle : CD/DVD-R, papier

[Attention] Attention

Ces chiffres de durée de vie et de nombre de cycles ne devront pas être utilisés pour des décisions concernant l’enregistrement de données critiques. Veuillez consulter les informations spécifiques au produit fournies par le constructeur.

[Astuce] Astuce

Comme les CD/DVD-R et le papier n’ont qu’un cycle d’écriture de 1, ils évitent de manière inhérente le risque de perte de données par écrasement. C’est un avantage :!

[Astuce] Astuce

Si vous devez faire des sauvegardes fréquentes et rapides d’un gros volume de données, un disque dur sur une liaison réseau à haute vitesse peut être la seule option réaliste.

Les périphériques d’enregistrement amovibles possibles sont les suivants.

Ils peuvent être connectés à l’aide de n’importe quel moyen suivant.

Les environnements de bureau modernes comme GNOME et KDE peuvent monter ces périphériques amovibles automatiquement sans entrée correspondante dans « /etc/fstab »

  • Le paquet udisks fournit un démon et les utilitaires associés pour monter et démonter ces périphériques.

  • D-bus crée les événements pour initialiser les processus automatiques.

  • PolicyKit fournit les droits nécessaires.

[Astuce] Astuce

Les périphériques montés automatiquement pourraient avoir l’option de montage « uhelper= » qui est utilisée par umount(8).

[Astuce] Astuce

Le montage automatique sous les environnements de bureau modernes ne se produit que lorsque ces périphériques amovibles ne se trouvent pas dans « /etc/fstab ».

Le point de montage sous les environnements de bureau modernes est choisi avec le nom « /media/<étiquette_disque> », il peut être personnalisé avec les outils suivants :

  • mlabel(1) pour le système de fichiers FAT ;

  • genisoimage(1) avec l’option « -V » pour le système de fichiers ISO9660 ;

  • tune2fs(1) avec l’option « -L » pour le système de fichiers ext2, ext3 ou ext4.

[Astuce] Astuce

Le choix du codage doit être fourni comme option de montage (consultez Section 8.3.6, « Coder les noms de fichiers »).

Lors du partage de données avec d’autres systèmes à l’aide de périphériques de stockage amovibles, vous devez les formatez avec un système de fichiers pris en charge par les deux systèmes. Voici une liste de choix de systèmes de fichiers :


[Astuce] Astuce

Consultez Section 9.8.1, « Chiffrement des disques amovibles à l’aide de dm-crypt/LUKS » pour le partage de données entre plateformes en utilisant le chiffrement au niveau du périphérique.

Le système de fichiers FAT est pris en charge par la plupart des systèmes d’exploitation modernes et est assez utile pour l'échange des données par l’intermédiaire de supports du type disque dur amovible.

Pour le formatage de périphériques de type disque dur amovible pour l’échange de données entre plateformes avec un système de fichiers FAT, ce qui suit peut être un choix sûr :

Lors de l’utilisation des systèmes de fichiers FAT ou ISO9660 pour le partage de données ce qui suit sera une précaution sûre :

  • Archiver d’abord les fichiers dans un fichier d’archive en utilisant tar(1) ou cpio(1) afin de conserver les noms de fichiers longs, les permissions de fichiers d’origine d’UNIX et les informations de propriétaire.

  • Découper le fichier d’archive en éléments de moins de 2 Gio à l’aide de la commande split(1) afin de le protéger contre les limitations de taille de fichier.

  • Chiffrer le fichier d’archive afin de sécuriser son contenu contre un accès non autorisé.

[Note] Note

La taille maximum d’un fichier FAT, par conception, est de (2^32 - 1) octets = (4GiB - 1 octet). Pour certaines applications sur le système 32 bits plus ancien, la taille maximum était même plus faible (2^31 - 1) octets = (2Gio - 1 octet). Debian ne souffre pas de ce dernier problème.

[Note] Note

Microsoft lui-même ne recommande pas l’utilisation de FAT pour des disques ou des partitions de plus de 200 Mo. Microsoft met en avant ces limitations comme une utilisation inefficace de l’espace disque dans ses « Informations générales sur les systèmes de fichiers FAT, HPFS et NTFS ». Bien sûr, on peut normalement utiliser le système de fichiers ext4 pour Linux.

[Astuce] Astuce

Pour davantage d’informations sur les systèmes de fichiers et les accès aux systèmes de fichiers, veuillez consulter « Filesystems HOWTO ».

Lors du partage de données avec d’autres systèmes au travers du réseau, vous devrez utiliser un service commun. Voici quelques éléments :


Bien que ces systèmes de fichiers montés au travers du réseau et les méthodes de transfert au travers du réseau soient assez pratiques pour partager des données, elles peuvent être non sûres. Leur connexion réseau doit être sécurisée par ce qui suit :

consultez aussi Section 6.10, « Autres serveurs d’applications réseau » et Section 6.11, « Autres clients d’applications réseau ».

Nous savons tous que les ordinateurs sont parfois victimes de pannes ou que des erreurs humaines provoquent des dommages au système et aux données. Les opérations de sauvegarde et de restauration sont les parties essentielles d’une administration système réussie. Vous serez victime, un jour ou l’autre, de tous les modes de défaillance possibles.

[Astuce] Astuce

Mettez en place un système de sauvegardes simple et faites une sauvegarde fréquente de votre système. Avoir des données de sauvegarde est plus important que la qualité technique de votre méthode de sauvegarde.

Il y a 3 facteurs-clé qui permettent de définir une méthode pratique de sauvegarde et de restauration.

  1. Ce qu’il faut sauvegarder et restaurer :

    • les fichiers que vous avez directement créés : données de « ~/ » ;

    • les fichiers de données créés par les applications que vous utilisez : données de « /var/ » (sauf « /var/cache/ », « /var/run/ » et « /var/tmp/ ») :

    • les fichiers de configuration du système : fichiers de « /etc/ » ;

    • logiciels locaux : données se trouvant dans « /usr/local/ » ou « /opt/ » ;

    • informations concernant l’installation du système : un mémo en texte concernant les étapes-clés ((partition, …) ;

    • un jeu de données testé : confirmé par des opérations de restauration expérimentales réalisées à l’avance.

  2. Comment sauvegarder et restaurer :

    • entreposer les données de manière sûre : protection des données contre la réécriture et les défaillances du système ;

    • sauvegardes fréquentes ! sauvegardes planifiées ;

    • sauvegardes redondantes : duplication (miroir) des données ;

    • processus indéréglable : sauvegarde facile en une seule commande.

  3. Risques et coûts :

    • valeur des données perdues ;

    • ressources nécessaires pour effectuer les sauvegardes : humaines, matérielles, logicielles, …

    • mode de défaillance avec leur probabilité.

[Note] Note

Ne sauvegardez pas le contenu des pseudo systèmes de fichiers se trouvant dans /proc, /sys, /tmp, et /run (voir Section 1.2.12, « procfs et sysfs » et Section 1.2.13, « tmpfs »). À moins que vous ne sachiez exactement ce que vous faites, ce ne sont que d’énormes quantités de données inutiles.

Comme pour l’enregistrement sécurisé de données, les données doivent se trouver de préférences sur différentes partitions de disque ou sur des disques différents ou des machines différentes afin de résister à une corruption du système de fichiers. Les données importantes seront, de préférence écrites sur des supports à écriture unique tels que les CD/DVD-R afin de prévenir l’écrasement accidentel des données (consultez Section 9.7, « Les données binaires » pour la manière d’écrire sur le support d’enregistrement depuis la ligne de commandes de l’interpréteur. L’interface graphique de l’environnement de bureau GNOME vous donne un accès facile depuis le menu : « Places→CD/DVD Creator :»).

[Note] Note

Il faudra peut-être arrêter certains démons d’applications comme le MTA (consultez Section 6.3, « Agent de transport de courrier électronique (« MTA ») ») lors de la sauvegarde des données.

[Note] Note

Vous devez prendre des précautions supplémentaires lors de la sauvegarde et de la restauration des fichiers de données relatifs à l’identité comme « /etc/ssh/ssh_host_dsa_key », « /etc/ssh/ssh_host_rsa_key », « ~/.gnupg/* », « ~/.ssh/* », « /etc/passwd », « /etc/shadow », « /etc/fetchmailrc », « popularity-contest.conf », « /etc/ppp/pap-secrets » et « /etc/exim4/passwd.client ». Certaines de ces données ne peuvent pas être recréées en entrant la même chaîne de caractères d’entrée sur le système.

[Note] Note

Si vous faites tourner une tâche programmée (« cron » en tant que processus d’utilisateur, vous devrez restaurer les fichiers de « /var/spool/cron/crontabs » et redémarrer cron(8). Consultez Section 9.3.14, « Planifier des tâches qui s’exécutent régulièrement  » pour cron(8) et crontab(1).

Voici une liste d’utilitaires de sauvegarde notables disponibles sur le système Debian :

Tableau 10.5. Liste de suites d’utilitaires de sauvegarde

paquet popcon taille description
dump V:2, I:9 490 BSD 4.4 dump(8) et restore(8) pour les systèmes de fichiers ext2/ext3/ext4.
xfsdump V:1, I:16 787 sauvegarder et restaurer avec xfsdump(8) et xfsrestore(8) pour le système de fichiers XFS sous GNU/Linux et IRIX
backupninja V:4, I:5 277 système de sauvegarde meta-backup léger et extensible
sbackup V:0, I:0 488 suite de sauvegarde simple pour le bureau GNOME
bacula-common V:10, I:21 1042 Bacula : sauvegarde, restauration et vérification par le réseau - fichiers communs
bacula-client I:6 114 Bacula : sauvegarde, restauration et vérification par le réseau - métapaquet du client
bacula-console V:2, I:9 153 Bacula : sauvegarde, restauration et vérification par le réseau - console en mode texte
bacula-server I:3 114 Bacula : sauvegarde, restauration et vérification par le réseau - métapaquet du serveur
amanda-common V:3, I:5 6926 Amanda : Advanced Maryland Automatic Network Disk Archiver (Libs). (Archiveur de disque par le réseau de Maryland avancé et automatique.
amanda-client V:2, I:5 724 Amanda : Advanced Maryland Automatic Network Disk Archiver (Client)
amanda-server V:0, I:1 829 Amanda : Advanced Maryland Automatic Network Disk Archiver (Serveur)
backuppc V:6, I:7 2043 BackupPC est un système de hautes performances pour effectuer la sauvegarde de PC au niveau de l’entreprise (basé sur disques)
backup-manager V:2, I:3 615 outil de sauvegarde en ligne de commandes
backup2l V:1, I:1 86 outil de sauvegarde et restauration de faible maintenance pour des supports pouvant être montés (basé sur disque)

Les outils de sauvegarde ont chacun des objectifs particuliers.

  • Mondo Rescue est un système de sauvegarde qui facilite la restauration rapide d’un système complet depuis de CD/DVD etc. sans passer par le processus normal d’installation d’un système.

  • sbackup et keep fournissent une interface graphique facile pour les utilisateurs de bureau afin d’effectuer des sauvegardes régulières des données de l’utilisateur. Une fonction équivalente peut être réalisée par un simple script (Section 10.2.2, « Script d’exemple pour la sauvegarde du système ») et cron(8).

  • Bacula, Amanda et BackupPC sont des suites de sauvegardes ayant des fonctionnalités avancées qui sont orientées vers les sauvegardes fréquentes au travers du réseau.

Les outils de base décrits dans Section 10.1.1, « Outils d’archivage et de compression » et Section 10.1.2, « Outils de copie et de synchronisation » peuvent être utilisés pour faciliter la sauvegarde du système au moyen de scripts personnalisés. De tels scripts peuvent être améliorés comme suit :

  • le paquet obnam permet les sauvegardes incrémentales (distantes) ;

  • le paquet rdiff-backup permet les sauvegardes incrémentales (distantes) ;

  • le paquet dump facilite l’archivage et la restauration d’un système de fichiers entier de manière incrémentielle et efficace.

[Astuce] Astuce

Consultez les fichiers dans « /usr/share/doc/dump/ » et « « Est-ce que dump est vraiment obsolète ? » pour en savoir plus sur le paquet dump.

Pour un système de bureau personnel Debian sur lequel tourne la version unstable, je n’ai besoin de protéger que les données personnelles et les données critiques. Je réinstalle cependant le système une fois par an. Je ne vois donc aucune raison de sauvegarder l’ensemble du système ou d’installer un utilitaire de sauvegarde ayant des fonctionnalités avancées.

J’utilise un simple script pour réaliser des archives de sauvegarde et les graver sur CD/DVD en utilisant une interface graphique. Voici un exemple de script pour ce faire :

#!/bin/sh -e
# Copyright (C) 2007-2008 Osamu Aoki <osamu@debian.org>, Public Domain
BUUID=1000; USER=osamu # UID and name of a user who accesses backup files
BUDIR="/var/backups"
XDIR0=".+/Mail|.+/Desktop"
XDIR1=".+/\.thumbnails|.+/\.?Trash|.+/\.?[cC]ache|.+/\.gvfs|.+/sessions"
XDIR2=".+/CVS|.+/\.git|.+/\.svn|.+/Downloads|.+/Archive|.+/Checkout|.+/tmp"
XSFX=".+\.iso|.+\.tgz|.+\.tar\.gz|.+\.tar\.bz2|.+\.cpio|.+\.tmp|.+\.swp|.+~"
SIZE="+99M"
DATE=$(date --utc +"%Y%m%d-%H%M")
[ -d "$BUDIR" ] || mkdir -p "BUDIR"
umask 077
dpkg --get-selections \* > /var/lib/dpkg/dpkg-selections.list
debconf-get-selections > /var/cache/debconf/debconf-selections

{
find /etc /usr/local /opt /var/lib/dpkg/dpkg-selections.list \
     /var/cache/debconf/debconf-selections -xdev -print0
find /home/$USER /root -xdev -regextype posix-extended \
  -type d -regex "$XDIR0|$XDIR1" -prune -o -type f -regex "$XSFX" -prune -o \
  -type f -size  "$SIZE" -prune -o -print0
find /home/$USER/Mail/Inbox /home/$USER/Mail/Outbox -print0
find /home/$USER/Desktop  -xdev -regextype posix-extended \
  -type d -regex "$XDIR2" -prune -o -type f -regex "$XSFX" -prune -o \
  -type f -size  "$SIZE" -prune -o -print0
} | cpio -ov --null -O $BUDIR/BU$DATE.cpio
chown $BUUID $BUDIR/BU$DATE.cpio
touch $BUDIR/backup.stamp

C’est destiné à être un script d’exemple exécuté avec le compte de l’administrateur.

Vous devrez le modifier et l’exécuter comme suit :

Faites simple !

[Astuce] Astuce

Vous pouvez récupérer les données de configuration de debconf avec « debconf-set-selections debconf-selections » et les données de sélection de dpkg avec « dpkg --set-selection <dpkg-selections.list".

Pour les données se trouvant sous l’arborescence d’un répertoire, une copie avec « cp -a » permet une sauvegarde normale.

Pour un gros ensemble de données statiques ne devant pas être réécrites se trouvant dans une arborescence de répertoires telle que celle se trouvant sous le répertoire « /var/cache/apt/packages/ », les liens physiques avec « cp -al » fournissent une alternative à la sauvegarde normale avec une utilisation efficace de l’espace disque.

Voici un script de copie, que j’ai appelé bkup, destiné à la sauvegarde de données. Ce script copie tous les fichiers (non-VCS) du répertoire actuel vers le répertoire daté du répertoire parent ou sur une machine distante.

#!/bin/sh -e
# Copyright (C) 2007-2008 Osamu Aoki <osamu@debian.org>, Public Domain
fdot(){ find . -type d \( -iname ".?*" -o -iname "CVS" \) -prune -o -print0;}
fall(){ find . -print0;}
mkdircd(){ mkdir -p "$1";chmod 700 "$1";cd "$1">/dev/null;}
FIND="fdot";OPT="-a";MODE="CPIOP";HOST="localhost";EXTP="$(hostname -f)"
BKUP="$(basename $(pwd)).bkup";TIME="$(date  +%Y%m%d-%H%M%S)";BU="$BKUP/$TIME"
while getopts gcCsStrlLaAxe:h:T f; do case $f in
g)  MODE="GNUCP";; # cp (GNU)
c)  MODE="CPIOP";; # cpio -p
C)  MODE="CPIOI";; # cpio -i
s)  MODE="CPIOSSH";; # cpio/ssh
t)  MODE="TARSSH";; # tar/ssh
r)  MODE="RSYNCSSH";; # rsync/ssh
l)  OPT="-alv";; # lien physique (GNU cp)
L)  OPT="-av";;  # copier (GNU cp)
a)  FIND="fall";; # tout rechercher
A)  FIND="fdot";; # rechercher ce qui n'est pas CVS/ .???/
x)  set -x;; # trace
e)  EXTP="${OPTARG}";; # hostname -f
h)  HOST="${OPTARG}";; # utilisateur@remotehost.example.com
T)  MODE="TEST";; # tester le mode de recherche
\?) echo "utiliser -x pour une trace."
esac; done
shift $(expr $OPTIND - 1)
if [ $# -gt 0 ]; then
  for x in $@; do cp $OPT $x $x.$TIME; done
elif [ $MODE = GNUCP ]; then
  mkdir -p "../$BU";chmod 700 "../$BU";cp $OPT . "../$BU/"
elif [ $MODE = CPIOP ]; then
  mkdir -p "../$BU";chmod 700 "../$BU"
  $FIND|cpio --null --sparse -pvd ../$BU
elif [ $MODE = CPIOI ]; then
  $FIND|cpio -ov --null | ( mkdircd "../$BU"&&cpio -i )
elif [ $MODE = CPIOSSH ]; then
  $FIND|cpio -ov --null|ssh -C $HOST "( mkdircd \"$EXTP/$BU\"&&cpio -i )"
elif [ $MODE = TARSSH ]; then
  (tar cvf - . )|ssh -C $HOST "( mkdircd \"$EXTP/$BU\"&& tar xvfp - )"
elif [ $MODE = RSYNCSSH ]; then
  rsync -aHAXSv ./ "${HOST}:${EXTP}-${BKUP}-${TIME}"
else
  echo "Une autre idée à sauvegarder ?"
  $FIND |xargs -0 -n 1 echo
fi

C’est destiné à être un exemple de commandes. Veuillez lire le script et le modifier vous-même avant de l’utiliser.

[Astuce] Astuce

J’ai installé ce bkup dans mon répertoire « /usr/local/bin/ ». J’utilise cette commande bkup, sans aucune option, depuis mon répertoire de travail lorsque j’ai besoin d’un instantané temporaire de sauvegarde.

[Astuce] Astuce

Pour faire un instantané historique d’une arborescence de fichiers sources ou d’une arborescence de fichiers de configuration, il est plus facile et efficace d’utiliser git(7) (consultez Section 10.6.5, « Git pour l’enregistrement de l’historique de la configuration »).

L’infrastructure de sécurité des données est fournie par la combinaison d’un outil de chiffrement des données, d’un outil de condensé de messages et d’un outil de signature.


Consultez la Section 9.8, « Astuces de chiffrement des données » sur dm-crypto et ecryptfs qui implémente l’infrastructure de chiffrement automatique des données par l’intermédiaire de modules du noyau de Linux.

Voici les commandes de GNU Privacy Guard pour la gestion de base des clés :


Voici la signification du code de confiance


Ce qui suit permet d’envoyer ma clé « 1DD8D791 » vers le serveur de clé populaire « hkp://keys.gnupg.net » :

$ gpg --keyserver hkp://keys.gnupg.net --send-keys 1DD8D791

Une bonne configuration de serveur de clés dans « ~/.gnupg/gpg.conf » (ou à l’ancien emplacement « ~/.gnupg/options ») contient ce qui suit :

keyserver hkp://keys.gnupg.net

Ce qui suit obtient les clés inconnues du serveur de clés :

$ gpg --list-sigs --with-colons | grep '^sig.*\[User ID not found\]' |\
  cut -d ':' -f 5| sort | uniq | xargs gpg --recv-keys

Il y avait un bogue dans OpenPGP Public Key Server (pre version 0.9.6) qui corrompait les clés ayant plus de 2 sous-clés. Le paquet du serveur gnupg (>1.2.1-2) peut gérer ces sous-clés corrompues. Consultez gpg(1) sous l’option « --repair-pks-subkey-bug ».

Voici des exemples d’utilisation des commandes de GNU Privacy Guard sur des fichiers :

Tableau 10.9. Liste des commandes de GNU Privacy Guard sur des fichiers

commande description
gpg -a -s fichier signer « fichier » dans un fichier ASCII blindé fichier.asc
gpg --armor --sign fichier , ,
gpg --clearsign fichier signer un fichier en clair
gpg --clearsign fichier|mail truc@example.org envoyer un message signé en clair à truc@example.org
gpg --clearsign --not-dash-escaped fichier_rustine signer en clair un fichier_rustine
gpg --verify fichier vérifier fichier signé en texte clair
gpg -o fichier.sig -b fichier créer une signature détachée
gpg -o fichier.sig --detach-sig fichier , ,
gpg --verify fichier.sig fichier vérifier un fichier avec fichier.sig
gpg -o fichier_chiffré.gpg -r nom -e fichier chiffrement par clé publique destiné au « nom » depuis le « fichier » vers « fichier_chiffré.gpg » binaire
gpg -o fichier_chiffré.gpg --recipient nom --encrypt fichier , ,
gpg -o fichier_chiffré.asc -a -r nom -e fichier chiffrement par clé publique destiné au « nom » depuis le « fichier » vers le fichier ASCII blindé « fichier_chiffré.asc »
gpg -o fichier_chiffré.gpg -c fichier chiffrement symétrique depuis « fichier » vers « fichier_chiffré.gpg »
gpg -o fichier_chiffré.gpg --symmetric fichier , ,
gpg -o fichier_chiffré.asc -a -c fichier chiffrement symétrique prévu destiné au « nom » depuis le « fichier » vers le fichier ASCII blindé « fichier_chiffré.asc »
gpg -o fichier -d fichier_crypt.gpg -r nom déchiffrement
gpg -o fichier --decrypt fichier_chiffré.gpg , ,

md5sum(1) fournit un utilitaire permettant de créer un fichier de résumé en utilisant la méthode se trouvant dans rfc1321 et en l’utilisant pour vérifier chaque fichier qu’il contient.

$ md5sum toto titi >tutu.md5
$ cat tut.md5
d3b07384d113edec49eaa6238ad5ff00  toto
c157a79031e1c40f85931829bc5fc552  titi
$ md5sum -c tutu.md5
toto: OK
titi: OK
[Note] Note

Le calcule de somme de contrôle MD5 consomme moins de ressources processeur que celles utilisées pour le chiffrement des signatures en utilisant GNU Privacy Guard (GnuPG). Habituellement, pour s’assurer de l’intégrité des données, seul le résumé de plus haut niveau est signé par chiffrement.

Il existe de nombreux outils pour fusionner du code source. Les commandes qui suivent ont attiré mon attention :

Tableau 10.10. Liste d’outils destinés à fusionner du code source

paquet popcon taille commande description
diffutils V:779, I:913 1229 diff(1) comparer des fichiers ligne à ligne
diffutils V:779, I:913 1229 diff3(1) comparer et fusionner trois fichiers ligne par ligne
vim V:150, I:378 2006 vimdiff(1) comparer deux fichiers côte à côte dans vim
patch V:144, I:952 172 patch(1) appliquer un fichier de différences (« diff ») à un original
dpatch V:3, I:47 237 dpatch(1) gérer une série de rustines (patch) pour les paquets Debian
diffstat V:17, I:136 49 diffstat(1) afficher un histogramme des modifications apportées par le fichier de différences
patchutils V:15, I:121 185 combinediff(1) créer une rustine (patch) cumulative à partir de deux rustines incrémentales
patchutils V:15, I:121 185 dehtmldiff(1) extraire un fichier de différences d’une page HTML
patchutils V:15, I:121 185 filterdiff(1) extraire ou exclure des différences d’un fichier de différences
patchutils V:15, I:121 185 fixcvsdiff(1) corriger les fichiers de différences créés par CVS que patch(1) interprète mal
patchutils V:15, I:121 185 flipdiff(1) échanger l’ordre de deux rustines
patchutils V:15, I:121 185 grepdiff(1) afficher quels sont les fichiers modifiés par une rustine correspondant un une expression rationnelle
patchutils V:15, I:121 185 interdiff(1) afficher les différences entre deux fichiers de différence unifiés
patchutils V:15, I:121 185 lsdiff(1) afficher quels sont les fichiers modifiés par une rustine
patchutils V:15, I:121 185 recountdiff(1) recalculer les nombres et les décalages dans un contexte unifié de fichiers de différences
patchutils V:15, I:121 185 rediff(1) corriger les décalages et les nombres d’un fichier de différences édité manuellement
patchutils V:15, I:121 185 splitdiff(1) séparer les rustines incrémentales
patchutils V:15, I:121 185 unwrapdiff(1) réparer les correctifs dont les mots ont été coupés
wiggle V:0, I:0 167 wiggle(1) appliquer les rustines rejetées
quilt V:8, I:67 822 quilt(1) gérer une série de rustines
meld V:9, I:42 1825 meld(1) comparer et fusionner des fichiers (GTK)
dirdiff V:0, I:5 224 dirdiff(1) afficher les différences et fusionner les modifications entre deux arbres de répertoires
docdiff V:0, I:0 543 docdiff(1) comparer deux fichiers mot par mot ou caractère par caractère
imediff2 V:0, I:0 58 imediff2(1) outil en plein écran pour fusionner dans les deux sens
makepatch V:0, I:0 148 makepatch(1) créer des fichiers de rustines étendus
makepatch V:0, I:0 148 applypatch(1) appliquer des fichiers de rustines étendus
wdiff V:12, I:136 821 wdiff(1) afficher les différences de mots entre deux fichiers texte

Voici un résumé des systèmes de contrôle de version (VCS) sur le système Debian.

[Note] Note

Si vous débutez avec les systèmes VCS, vous devriez commencer votre apprentissage avec Git, dont la popularité croît rapidement.


VCS est parfois appelé système de contrôle de révision (RCS), ou gestion de configuration logicielle (SCM).

Un VCS distribué comme Git est, de nos jours, l’outil de choix. CVS et Subversion peuvent continuer à être utiles pour se joindre à certaines activités existantes sur les logiciels libres.

Debian fournit des services de VCS libres avec le service Debian Alioth. Il prend en charge pratiquement tous les VCS. Sa documentation se trouve sur http://wiki.debian.org/fr/Alioth .

Il existe quelques bases pour la création d’un accès à une archive VCS.

Voici une comparaison très simplifiée des commandes natives de VCS destinées à donner une vue d’ensemble. La séquence de commandes typique peut demander des options et des paramètres.


[Attention] Attention

L’appel d’une sous-commande git directement avec « git-xyz » depuis la ligne de commandes est devenu obsolète depuis début 2006.

[Astuce] Astuce

Des outils avec interface graphique comme tkcvs(1) et gitk(1) vous seront d’une aide appréciable pour le suivi de l’historique de révision des fichiers. L’interface Web fournie par de nombreuses archives publiques pour parcourir leurs dépôts est assez utile aussi.

[Astuce] Astuce

Git peut travailler directement avec différents dépôts VCS tels que ceux proposés par CVS et Subversion et il fournit un dépôt local pour les modifications locales à l’aide des paquets git-cvs et git-svn. Consultez git pour les utilisateurs de CVS et Section 10.6.4, « Git pour le dépôt Subversion ».

[Astuce] Astuce

Git possède des commandes qui n’ont pas d’équivalent dans CVS ni Subversion : « fetch », « rebase », « cherry-pick », …

Git peut tout faire pour la gestion du code source soit local ou distant. Cela signifie que vous pouvez enregistrer les modifications de code source sans avoir besoin d’une connexion réseau avec le dépôt distant.

Consultez ce qui suit :

Les commandes git-gui(1) et gitk(1) rendent très facile l’utilisation de Git.

[Avertissement] Avertissement

Ne pas utiliser d’espaces dans la chaîne de balise même si certains outils comme gitk(1) vous permettent de le faire. Cela peut perturber d’autres commandes de git.

Même si votre source amont utilise un VCS différent, c’est une bonne idée d’utiliser git(1) pour l’activité locale parce qu’il vous permet de gérer votre copie locale de l’arborescence des sources sans connexion réseau amont. Voici quelques paquets et commandes utilisés avec git(1).


[Astuce] Astuce

Avec git(1), vous travaillez sur une branche locale avec de nombreuses commit et vous utilisez quelque chose comme « git rebase -i master » pour réorganiser plus tard l’historique des modifications. Cela vous permet de faire des modifications propres de l’historique. Consultez git-rebase(1) et git-cherry-pick(1).

[Astuce] Astuce

Si vous désirez retrouver un répertoire propre sans perdre l’état actuel du répertoire de travail, vous pouvez utiliser « git stash ». Consultez git-stash(1).

Vous pouvez enregistrer vous-même un historique chronologique de la configuration en utilisant les outils Git. Voici un exemple simple, pour vous exercer, d’enregistrement du contenu de « /etc/apt/ ».

$ cd /etc/apt/
$ sudo git init
$ sudo chmod 700 .git
$ sudo git add .
$ sudo git commit -a

Dépôt (« commit ») d’une configuration avec sa description

Effectuez les modifications dans les fichiers de configuration.

$ cd /etc/apt/
$ sudo git commit -a

Déposez (« commit ») la configuration avec sa description et retournez à vos occupations habituelles.

$ cd /etc/apt/
$ sudo gitk --all

Vous avez avec vous l’historique complet de la configuration.

[Note] Note

sudo(8) est nécessaire pour travailler avec n’importe quelles permissions sur les données de configuration. Pour les données de configuration de l’utilisateur, sudo peut être omis.

[Note] Note

La commande « chmod 700 .git » de l’exemple ci-dessus est nécessaire pour protéger les données de l’archive d’un accès en écriture non autorisé.

[Astuce] Astuce

Pour une configuration plus complète de l’enregistrement de l’historique de configuration, voyez le paquet etckeeper package : Section 9.2.10, « Enregistrer les modifications dans des fichiers de configuration ».

Consultez ce qui suit :

  • cvs(1)

  • « /usr/share/doc/cvs/html-cvsclient »

  • « /usr/share/doc/cvs/html-info »

  • « /usr/share/doc/cvsbook »

  • « info cvs »

De nombreux serveurs CVS d’accès public fournissent un accès distant en lecture avec le nom de compte « anonymous » par l’intermédiaire du service pserver. Par exemple, le contenu du site web Debian est maintenu par l’intermédiaire du projet webwml sous le CVS du service alioth de Debian. Ce qui suit permet de configurer « $CVSROOT » pour un accès distant à ce dépôt CVS :

$ export CVSROOT=:pserver:anonymous@cvs.alioth.debian.org:/cvsroot/webwml
$ cvs login
[Note] Note

Comme pserver est sujet à des attaques d’espionnage et peu sûr, l’accès en écriture est habituellement désactivé par les administrateurs du serveur.

Ce qui suit définit « $CVS_RSH » et » $CVSROOT » pour l’accès distant avec SSH au dépôt CVS du projet webwml :

$ export CVS_RSH=ssh
$ export CVSROOT=:ext:account@cvs.alioth.debian.org:/cvs/webwml

Vous pouvez aussi utiliser une clé publique d’authentification pour SSH, ce qui élimine l’invite à distance pour l’entrée du mot de passe.

Voici un exemple de flux de travail typique utilisant CVS.

Vérifiez tous les modules disponibles du projet CVS pointé par « $CVSROOT » comme suit :

$ cvs rls
CVSROOT
module1
module2
...

Récupérez le « module1 » depuis son répertoire par défaut « ./module1 » de la manière suivante :

$ cd ~/path/to
$ cvs co module1
$ cd module1

Effectuez les modifications de contenu au besoin.

Vérifiez les modifications par un équivalent de « diff -u [repository] [local] » de la manière suivante :

$ cvs diff -u

Vous-vous apercevez que vous avez cassé sévèrement un fichier appelé « fichier_à_restaurer » mais que les autres fichiers sont corrects.

Écrasez le fichier « fichier_à_restaurer » avec une copie propre venant du CVS de la manière suivante :

$ cvs up -C fichier_à_restaurer

Enregistrez l’arborescence source locale vers le CVS comme suit :

$ cvs ci -m "Décrire les modifications"

Créez et ajoutez le fichier « fichier_à_ajouter » au CVS comme suit :

$ vi fichier_à_ajouter
$ cvs add fichier_à_ajouter
$ cvs ci -m "Ajout de fichier_à_ajouter"

Fusionnez la dernière version depuis le CVS comme suit :

$ cvs up -d

Recherchez les lignes commençant par « C filename » qui indiquent des modifications en conflit.

Recherchez du code non modifié dans « .#nom_fichier.version ».

Recherchez « <<<<<<< » et « >>>>>>> » dans les fichiers qui indiquent des conflits de modifications.

Au besoin, éditez les fichiers pour résoudre les conflits.

Ajoutez l’étiquette de version (« release tag« ») « Version-1 » comme suit :

$ cvs ci -m "dernière proposition pour Version-1"
$ cvs tag Version-1

Poursuivez l’édition.

Supprimez l’étiquette de version « Version-1  » comme suit :

$ cvs tag -d Version-1

Vérifiez les modifications du CVS comme suit :

$ cvs ci -m "vraiment la dernière proposition pour Version-1"

Ajoutez de nouveau, de la manière suivante, l’étiquette « Version-1 » à HEAD de « main » du CVS mis à jour :

$ cvs tag Version-1

Créez une branche avec une étiquette de branche « collante » Version-initiale-corrections-de-bogues » depuis la version d’origine pointée par l’étiquette « Version-initiale » et exportez-la vers le répertoire ~/chemin/vers/ancien » comme suit :

$ cvs rtag -b -r Version-initiale Version-initiale-corrections-de-bogues module1
$ cd ~/chemin/vers
$ cvs co -r Version-initiale-corrections-de-bogues -d ancien module1
$ cd ancien
[Astuce] Astuce

Utilisez  -D 2005-12-20 » (format de date ISO 8601) plutôt que « -r Version-initiale » pour indiquer une date particulière comme point de branche.

Travaillez sur cette arborescence locale possédant l’étiquette « collante » « Version-initiale-corrections-de-bogues » qui est basée sur la version d’origine.

Travaillez vous-même sur cette branche… jusqu’à ce que quelqu’un d’autre rejoigne cette branche « Version-initiale-corrections-de-bogues ».

Synchronisez les fichiers modifiés par d’autres sur cette branche, en créant de nouveaux répertoires si nécessaire, de la manière suivante :

$ cvs up -d

Au besoin, éditez les fichiers pour résoudre les conflits.

Vérifiez les modifications du CVS comme suit :

$ cvs ci -m "checked into this branch"

Mettez à jour l’arborescence locale depuis HEAD de main en supprimant l’étiquette collante (« sticky tag ») (« -A ») et sans expansion de mots-clés (« -kk ») comme suit :

$ cvs up -d -kk -A

Mettez à jour l’arborescence locale (contenu = HEAD de main) en fusionnant depuis la branche « Version-initiale-corrections-de-bogues » et sans expansion des mots-clés en faisant ce qui suit :

$ cvs up -d -kk -j Version-initiale-corrections-de-bogues

Corrigez les conflits avec l’éditeur.

Vérifiez les modifications du CVS comme suit :

$ cvs ci -m "Version-initiale-corrections-de-bogues fusionnée"

Réalisez une archive de la manière suivante :

$ cd ..
$ mv ancien ancien-module1-corrections_bogues
$ tar -cvzf ancien-module1-corrections_bogues.tar.gz ancien-module1-corrections_bogues
$ rm -rf ancien-module1-corrections_bogues
[Astuce] Astuce

La commande « cvs up » peut prendre l’option « -d » pour créer de nouveaux répertoires et l’option « -P » pour supprimer les répertoires vides.

[Astuce] Astuce

Vous pouvez ne vérifier qu’un sous-répertoire de « module1 » en indiquant son nom comme, par exemple, « cvs co module1/sous-répertoire ».


Subversion est un système de contrôle de version de génération récente qui remplace l’ancien CVS. Il en possède la plupart des fonctionnalités à l’exception des étiquettes et des branches.

Vous devrez installer les paquets subversion, libapache2-svn et subversion-tools pour mettre en place un serveur Subversion.

Voici un exemple typique de flux de travail utilisant Subversion avec son client natif.

[Astuce] Astuce

Les commandes du client proposées par le paquet git-svn peuvent proposer un mode d’utilisation de remplacement pour Subversion en utilisant la commande git. Consultez Section 10.6.4, « Git pour le dépôt Subversion ».

Vérifiez de la manière suivante tous les modules disponibles depuis le projet pointé par l’URL « file:///srv/svn/projet » :

$ svn list file:///srv/svn/projet
module1
module2
...

Récupérez « module1/trunk » dans un répertoire « module1 » comme suit :

$ cd ~/chemin/vers
$ svn co file:///srv/svn/projet/module1/trunk module1
$ cd module1

Effectuez les modifications de contenu au besoin.

Vérifiez les modifications par un équivalent de « diff -u [repository] [local] » de la manière suivante :

$ svn diff

Vous-vous apercevez que vous avez cassé sévèrement un fichier appelé « fichier_à_restaurer » mais que les autres fichiers sont corrects.

Écrasez le fichier « fichier_a_annuler » avec une nouvelle copie propre depuis Subversion comme suit :

$ svn revert fichier_a_annuler

Enregistrez l’arbre local des sources mis à jour vers Subversion comme suit :

$ svn ci -m "Décrire les modifications"

Créez et ajoutez le fichier « fichier_a_ajouter » dans Subversion comme suit :

$ vi fichier_a_ajouter
$ svn add fichier_a_ajouter
$ svn ci -m "fichier_a_ajouter ajouté"

Fusionnez la dernière version depuis Subversion comme suit :

$ svn up

Recherchez les lignes commençant par « C filename » qui indiquent des modifications en conflit.

Recherchez le code non modifié, par exemple « nom_fichier.r6 », « nom_fichier.r9 » et « nom_fichier.mien ».

Recherchez « <<<<<<< » et « >>>>>>> » dans les fichiers qui indiquent des conflits de modifications.

Au besoin, éditez les fichiers pour résoudre les conflits.

Ajoutez l’étiquette de version (« release tag« ») « Version-1 » comme suit :

$ svn ci -m "dernier « commit » pour la Release-1"
$ svn cp file:///srv/svn/projet/module1/trunk file:///srv/svn/projet/module1/tags/Release-1

Poursuivez l’édition.

Supprimez l’étiquette de version « Version-1  » comme suit :

$ svn rm file:///srv/svn/projet/module1/tags/Release-1

Récupérez les modifications depuis Subversion comme suit :

$ svn ci -m "vraiment le dernier commit pour Release-1"

Ajoutez de nouveau la balise « Version-1 » depuis la version mise à jour de HEAD de trunk de Subversion comme suit :

$ svn cp file:///srv/svn/projet/module1/trunk file:///srv/svn/projet/module1/tags/Version-1

Créez une branche dont le chemin est « module1/branches/Release-initial-bugfixes » depuis la version initiale pointée par le chemin « module1/tags/Release-initial » et récupérez-le vers le répertoire « ~/chemin/vers/ancien » comme suit :

$ svn cp file:///srv/svn/projet/module1/tags/Version-initiale file:///srv/svn/projet/module1/branches/Version-initale-corrections-de-bogues
$ cd ~/chemin/vers
$ svn co file:///srv/svn/projet/module1/branches/Version-initiale-corrections-de-bogues ancien
$ cd ancien
[Astuce] Astuce

Utilisez « module1/trunk@{2005-12-20} » (format de date ISO 8601) plutôt que « module1/tags/Release-initial » pour indiquer une date particulière comme point de branche.

Travaillez sur cet arbre de sources local pointant vers la branche « Version-initiale-corrections-de-bogues » qui est basée sur la version initiale.

Travaillez vous-même sur cette branche… jusqu’à ce que quelqu’un d’autre rejoigne cette branche « Version-initiale-corrections-de-bogues ».

Effectuez la synchronisation avec les fichiers de cette branche modifiés par d’autres comme suit :

$ svn up

Au besoin, éditez les fichiers pour résoudre les conflits.

Récupérez les modifications depuis Subversion comme suit :

$ svn ci -m "récupérés dans cette branche"

Mettez à jour l’arborescence local avec HEAD de trunk de la manière suivante :

$ svn switch file:///srv/svn/projet/module1/trunk

Mettez à jour l’arborescence locale (contenu = HEAD de trunk) en fusionnant depuis la branche « Version-initiale-corrections-de-bogues » par ce qui suit :

$ svn merge file:///srv/svn/projet/module1/branches/Version-initiale-corrections-de-bogues

Corrigez les conflits avec l’éditeur.

Récupérez les modifications depuis Subversion comme suit :

$ svn ci -m "Version-initiale-corrections-de-bogues fusionnée"

Réalisez une archive de la manière suivante :

$ cd ..
$ mv ancien ancien-module1-corrections_bogues
$ tar -cvzf ancien-module1-corrections_bogues.tar.gz ancien-module1-corrections_bogues
$ rm -rf ancien-module1-corrections_bogues
[Astuce] Astuce

Vous pouvez remplacer des formats d’URL comme « file:///… » par d’autres formats d’URL comme «  http://… » et « svn+ssh://… ».

[Astuce] Astuce

Vous pouvez ne vérifier (« checkout ») qu’un sous-répertoire de « module1 » en indiquant son nom comme, par exemple, « svn co file:///srv/svn/projet/module1/trunk/sous-répertoire module1/sous-répertoire », etc.