4. Sauvegarde et restauration

4.1. Une liste de rappels/conseils

  • Choisir sa stratégie de sauvegarde (et les utilitaires pour effectuer ces opérations).

    • Complète,

    • Incrémentale,

    • Différentielle.

  • Choisir soigneusement les partitions à sauvegarder.

  • Choisir un intervalle de sauvegarde raisonnable.

  • Choisir un/des support(s) de sauvegarde adapté(s).

    • Cassettes, disques ...

  • Faire en sorte que les sauvegardes quotidiennes tiennent sur un seul support de sauvegarde.

    • La taile des systèmes de fichiers doit être inférieure à la taille du support de sauvegarde.

    • Sinon un opérateur doit être présent, pour changer les cassettes par exemple !

  • Etiqueter correctement les supports de sauvegarde, pour retrouver rapidement ce qu'il faut restaurer !

  • Déclencher les sauvegardes depuis une seule machine (scripts utilisant rdump/ssh par exemple).

  • Protéger les sauvegardes.

    • Elles sont forcément précieuses.

    • Conserver un jeu de sauvegarde hors site !

  • Limiter l'activité système pendant la sauvegarde, pour limiter les interférences.

  • Contrôler régulièrement l'état des supports de sauvegardes.

  • Se préparer au pire, pour tester la validité du scénario retenu.

4.2. Stratégies et types de sauvegardes

Il existe principalement trois types de sauvegardes :

  • Sauvegarde complète [SC] : tous les fichiers sont systématiquement sauvegardés.

  • Sauvegarde incrémentale [SI] :

    • Réalisable plusieurs fois depuis la dernière SC.

    • Seuls les fichiers changés ou crées depuis la dernière SC ou SI font l'objet d'une sauvegarde.

  • Sauvegarde différentielle [SD] :

    • Réalisable plusieurs fois depuis la dernière SC.

    • Sauvegarde tous les fichiers changés ou crées depuis la dernière SC indépendamment de ce qui a été sauvegardé depuis la dernière SD.

Chacune de ses stratégies a ses avantages/inconvénients.

  • La SC permet de n'avoir qu'une seule source de restauration.

    • Mais elle consomme beaucoup d'espace.

  • La SI est plus rapide et moins coûteuse en espace.

    • Mais la restauration est plus compliquée...

    • Partir de la dernière SC, puis appliquer dans l'ordre (de la plus ancienne à la plus récente) les SI.

  • La SD est un compromis entre les deux stratégies précédentes.

    • La restauration consiste à partir de la dernière SC, puis appliquer la dernière SD.

    • Mais, les SD tendent à prendre de l'espace.

4.3. Logiciels et utilitaires de sauvegardes

4.3.1. flexbackup

Il s'agit d'un paquetage disponible à la fois pour GNU/Linux et FreeBSD. Il contient un script Perl et un fichier de configuration pour définir ces sauvegardes (Mise en œuvre dans la partie Section 4.4, « Exercices » ).

4.3.2. Utilitaires

Utilitaire tar

Création d'une archive, ici /etc, en tant qu'utilisateur « standard », il y aura donc des problèmes d'accès !

EXEMPLE : sauvegarde de /etc

chuck:backup > tar -cvpf etc-`date "+%Y-%m-%d_%H-%M-%S"`.tar /etc/*             
...
tar: /etc/skeykeys: Cannot open: Permission denied
tar: /etc/spwd.db: Cannot open: Permission denied
etc/ssh/
etc/ssh/ssh_config
etc/ssh/sshd_config
etc/ssh/moduli
tar: /etc/ssh/ssh_host_key: Cannot open: Permission denied
etc/ssh/ssh_host_key.pub
tar: /etc/ssh/ssh_host_rsa_key: Cannot open: Permission denied
etc/ssh/ssh_host_rsa_key.pub
tar: /etc/ssh/ssh_host_dsa_key: Cannot open: Permission denied
etc/ssh/ssh_host_dsa_key.pub
etc/ssl/
etc/ssl/openssl.cnf
etc/sysctl.conf
etc/syslog.conf
etc/termcap
etc/ttys
etc/usbd.conf
tar: /etc/uucp: Cannot savedir: Permission denied
etc/wall_cmos_clock
tar: Error exit delayed from previous errors
chuck:backup > ls -l
total 1280
-rw-------  1 pascal  gnu  1280000 Oct  2 20:59 etc-2003-10-02_20-59-51.tar

EXEMPLE : lister le contenu de l'archive :

chuck:backup > tar -tvf etc-2003-10-02_20-59-51.tar
...
-rw-r--r-- root/wheel     1233 Oct  9 16:46 2002 etc/ssh/ssh_config
-rw-r--r-- root/wheel     2393 Mar  5 13:42 2003 etc/ssh/sshd_config
-rw-r--r-- root/wheel    88110 Oct  9 16:46 2002 etc/ssh/moduli
-rw-r--r-- root/wheel      340 Jan 13 11:06 2003 etc/ssh/ssh_host_key.pub
-rw-r--r-- root/wheel      231 Jan 13 11:06 2003 etc/ssh/ssh_host_rsa_key.pub   
-rw-r--r-- root/wheel      607 Jan 13 11:06 2003 etc/ssh/ssh_host_dsa_key.pub
drwxr-xr-x root/wheel        0 Sep 30 07:23 2003 etc/ssl/
-rw-r--r-- root/wheel     7241 Oct  9 16:46 2002 etc/ssl/openssl.cnf
-rw-r--r-- root/wheel      591 Jan 13 11:47 2003 etc/sysctl.conf
-rw-r--r-- root/wheel     1259 Oct  9 16:46 2002 etc/syslog.conf
-rw-r--r-- root/wheel     7462 Jan 13 14:33 2003 etc/ttys
-rw-r--r-- root/wheel     1568 Oct  9 16:46 2002 etc/usbd.conf
-r--r--r-- root/wheel        0 Jan 13 14:59 2003 etc/wall_cmos_clock
...

EXEMPLE : extraire le contenu de l'archive :

chuck:restore > tar -xpvf ../backup/etc-2003-10-02_20-59-51.tar                 
...
etc/ssh/ssh_host_key.pub
etc/ssh/ssh_host_rsa_key.pub
etc/ssh/ssh_host_dsa_key.pub
etc/ssl/
etc/ssl/openssl.cnf
etc/sysctl.conf
etc/syslog.conf
etc/termcap
etc/ttys
etc/usbd.conf
etc/wall_cmos_clock
...

Pour ne pas avoir de problèmes avec les droits d'accès, il vaut mieux avoir des droits étendus (via la commande sudo, par exemple). Un autre exemple :

EXEMPLE : créer/lister et extraire une archive compressée :

chuck:backup > sudo tar -cjvpf etc-`date "+%Y-%m-%d_%H-%M-%S"`.tar.bz2 /etc/*   

...

chuck:backup > ls -l
total 184
-rw-r--r--  1 root  gnu  188406 Oct  2 21:19 etc-2003-10-02_21-18-46.tar.bz2

...

chuck:backup > cat etc-2003-10-02_21-18-46.tar.bz2 | bzip2 -d | tar -tvf -

...

drwxrwx--- uucp/uucp         0 Sep 30 07:23 2003 etc/uucp/
-r--r--r-- root/wheel      927 Oct  9 16:46 2002 etc/uucp/call.sample
-r--r--r-- root/wheel     4244 Oct  9 16:46 2002 etc/uucp/config.sample
-r--r--r-- root/wheel     1637 Oct  9 16:46 2002 etc/uucp/dial.sample
-r--r--r-- root/wheel      838 Oct  9 16:46 2002 etc/uucp/dialcode.sample
-r--r--r-- root/wheel      918 Oct  9 16:46 2002 etc/uucp/passwd.sample
-r--r--r-- root/wheel     1522 Oct  9 16:46 2002 etc/uucp/port.sample
-r--r--r-- root/wheel     1517 Oct  9 16:46 2002 etc/uucp/sys1.sample
-r--r--r-- root/wheel     1535 Oct  9 16:46 2002 etc/uucp/sys2.sample
-r--r--r-- root/wheel        0 Jan 13 14:59 2003 etc/wall_cmos_clock

...

chuck:backup > cd ../restore
chuck:restore > sudo tar -xvpjf ../restore/etc-2003-10-02_21-18-46.tar.bz2      

...

Un autre exemple (sous FreeBSD, qui fonctionne aussi sous GNU/Linux), déplacer une arborescence complète vers une nouvelle partition montée temporairement dans le répertoire /mnt/tmp :

EXEMPLE : lister le contenu de l'archive :

chuck# ( cd /usr/src && tar cf - . ) | ( cd /mnt/tmp && tar xvpf - )            

[Note]Note

Les fichiers existent toujours dans l'arborescence source, i.e. ils ne sont pas supprimés.

Utilitaire dump & restore

Cette commande « comprend » la structure d'inode du SGF [filesystem] Unix et décide quels fichiers sauvegarder. Cela lui permet d'être très efficace, mais :

  • Tout opérateur autorisé à faire les sauvegardes peut lire tous les fichiers (avec peu d'effort).

  • Chaque partition doit être sauvegardée individuellement.

  • Seules les partitions locales peuvent être sauvegardées → pas de dump sur une partition NFS (mais rdump/ssh possible).

  • A chaque sauvegarde, la commande dump assigne un niveau de sauvegarde (entier compris entre 0 et 9).Un niveau N permet la sauvegarde des fichiers ayant changés ou crées depuis la dernière sauvegarde de niveau < à N.

    Le niveau 0 permet la sauvegarde complète (SC) de la partition.

Cette commande supporte les hiérarchies de fichiers quel que soit le niveau de profondeur et la longueur des noms de fichiers.

Exemple : sauvegarde complète de la partition /home sur une partition (2e disque dur) monté sous /mnt/backup :

EXEMPLE : sauvegarde

tux:/mnt/backup# /sbin/dump -0u -f /mnt/backup/home-`date "+%F"`.dump /home     
  DUMP: Date of this level 0 dump: Sun Jun 22 15:51:55 2003
  DUMP: Dumping /dev/hda9 (/home) to /mnt/backup/home-2003-06-22.dump
  DUMP: Excluding inode 8 (journal inode) from dump
  DUMP: Excluding inode 7 (resize inode) from dump
  DUMP: Label: none
  DUMP: mapping (Pass I) [regular files]
  DUMP: mapping (Pass II) [directories]
  DUMP: estimated 436425 tape blocks.
  DUMP: Volume 1 started with block 1 at: Sun Jun 22 15:51:59 2003
  DUMP: dumping (Pass III) [directories]
  DUMP: dumping (Pass IV) [regular files]
  DUMP: Closing /mnt/backup/home-2003-06-22.dump
  DUMP: Volume 1 completed at: Sun Jun 22 15:53:29 2003
  DUMP: Volume 1 455460 tape blocks (444.79MB)
  DUMP: Volume 1 took 0:01:30
  DUMP: Volume 1 transfer rate: 5060 kB/s
  DUMP: 455460 tape blocks (444.79MB) on 1 volume(s)
  DUMP: finished in 90 seconds, throughput 5060 kBytes/sec
  DUMP: Date of this level 0 dump: Sun Jun 22 15:51:55 2003
  DUMP: Date this dump completed:  Sun Jun 22 15:53:29 2003
  DUMP: Average transfer rate: 5060 kB/s
  DUMP: DUMP IS DONE

La restauration se fait avec la commande symétrique restore.

Restauration individuelle : 

  • Créer un répertoire de restauration sous un point de montage possédant suffisamment d'espace (pour recréer une hiérarchie importante).

  • La commande restore doit recréer tous les répertoires conduisant au fichier particulier que l'on veut restaurer.

EXEMPLE : restauration individuelle

tux:/home/restore# restore -i -f /mnt/backup/home-2003-06-22.dump               
restore > ls
.:
chroot/     lost+found/ pascal/

restore > add pascal
restore > ls
.:
 chroot/      lost+found/ *pascal/

restore >  extract
You have not read any volumes yet.
Unless you know which volume your file(s) are on you should start
with the last volume and work towards the first.
Specify next volume # (none if no more volumes): 1
...
restoring ./pascal/enseignement/NeoTechIII/V2L-PRAI/debian/install_DEBIAN.xml
restoring ./pascal/enseignement/NeoTechIII/V2L-PRAI/history/Makefile
restoring ./pascal/enseignement/NeoTechIII/V2L-PRAI/history/_mystyle.css
restoring ./pascal/enseignement/NeoTechIII/V2L-PRAI/history/_mystyle.xsl
...
set owner/mode for '.'? [yn] y
restore > quit
tux:/home/restore#
t*ux:/home/restore# ls pascal/
GNUstep  Mail  bin  conf  enseignement  log  tmp
tux:/home/restore# cp -Rpv pascal/ /home
...
`pascal/.Xdefaults' -> `/home/pascal/.Xdefaults'
`pascal/.emacs-places' -> `/home/pascal/.emacs-places'
`pascal/.emacs' -> `/home/pascal/.emacs'
`pascal/.Xauthority' -> `/home/pascal/.Xauthority'
`pascal/.exit.log' -> `/home/pascal/.exit.log'
`pascal/.wm_style' -> `/home/pascal/.wm_style'
`pascal/.bash_profile' -> `/home/pascal/.bash_profile'
`pascal/.xscreensaver' -> `/home/pascal/.xscreensaver'
`pascal/.bash_logout' -> `/home/pascal/.bash_logout'
`pascal/.bashrc' -> `/home/pascal/.bashrc'
...
tux:/home/restore# cd ..
tux:/home# rm -rf restore/

Restauration d'une partition complète :  Préalable : comprendre le problème qui a conduit à la perte de la partition. Monter la partition cible à restaurer, puis aller dans sa racine. L'algorithme de principe utilisé par restore est le suivant :

  1. Restaurer la dernière SC de niveau 0.

  2. Restaurer la dernière SI de plus petit niveau depuis la dernière sauvegarde utilisée par le restore précédent, s'il en existe plusieurs de même niveau, prendre la plus récente.

  3. Si c'était la dernière sauvegarde, alors le processus est terminé, sinon retourner à l'étape (ii).

Exemple :

  • Séquence 1 : 0 0 0 0 (en gras le niveau à restaurer).

  • Séquence 2 : 0 3 4 4 5 5 4 5

  • Séquence 3 : 0 9 9 4 9 9 3 9 9 4 9 9

  • Séquence 4 : 0 2 4 7 2 4 7

EXEMPLE : restauration individuelle de la partition /home :

tux:/ # mount /home                                                             
tux:/ # cd /home
tux:/home # restore -r
...
...

4.4. Exercices

Exercice 1 (**)

[FreeBSD, accès root pour l'installation] travail à faire :

  1. [Installation] - Installer le port flexbackup en optant pour les dépendances (ports) buffer, afio, bzip2 ;

    [Avertissement]Avertissement

    Prendre le temps de lire les instructions s'affichant à l'installation du port (avant le make clean).

  2. [Configuration/Sauvegarde] - Configurer flexbackup (i.e. /usr/local/etc/flexbackup.conf) afin de sauvegarder de manière incrémentale les répertoires /etc, /var, /usr/local/etc, /home sur la première partition de la slice destinée à la sauvegarde/restauration (préparée dans les cours précédent).

    [Avertissement]Avertissement

    Penser à monter la partition de sauvegarde, sinon il y aura saturation de la partition racine !

    Tester la sauvegarde complète, puis faire quelques modifications (au sein même du répertoire sysop, effacer par exemple tous les fichiers inutiles), puis tester la sauvegarde incrémentale. La commande sudo doit-elle être utilisée (justifier votre réponse) ?

  3. [Restauration] - Créer un répertoire restore sur la deuxième partition de la slice destinée à la sauvegarde/restauration (propriétaire sysop/bsd).

    Dans ce répertoire, restaurer, en un minimum d'opérations, uniquement les fichiers suffixés .conf du répertoire /etc, les sous répertoires (complet) /etc/ssh et /var/db. La commande sudo doit-elle être utilisée (justifier votre réponse) ?

  4. [Automatisation] - Créer un ensemble de tâches périodiques pour le compte sysop permettant de réaliser la sauvegarde incrémentale des répertoires spécifiés plus haut, tous les jours de la semaine à 11h30 (la sauvegarde complète est prévue tous les vendredi(s)).

    Que faire pour que l'opération soit non interactive (i.e. aucune intervention de sysop requise) ? Modifier en conséquence le/les fichier(s) de configuration.

    Que faire pour garder au plus 2 semaines complètes de sauvegarde ? Le mettre en œuvre.

  5. [Rédaction] - A partir des notes et de l'expérience acquise, rédiger une note technique (au format texte ou docbook/xml) sur l'ensemble du travail réalisé (installation, configuration, mise en œuvre de la stratégie de sauvegarde, restauration et automatisation).

Exercice 2 (**)

Utilisation du port rsync

--- T O D O : Script shell de sauvegarde d'une arborescence sur un poste distant (via un tunnel ssh/passphrase + ssh-agent).

Exercice 3 (***)

Ecrire un script complet permettant de recopier (utilisant rsync et ssh) la slice FreeBSD sur un autre disque. Quel sont les pré-requis pour le disque cible ?