Scripts shell

One of the simplest ways to backup a system is using a shell script. For example, a script can be used to configure which directories to backup, and pass those directories as arguments to the tar utility, which creates an archive file. The archive file can then be moved or copied to another location. The archive can also be created on a remote file system such as an NFS mount.

L'utilitaire tar crée un fichier d'archive de plusieurs fichiers ou répertoires. tar peut également filtrer les fichiers par le biais des utilitaires de compression, réduisant ainsi la taille du fichier d'archive.

Script shell simple

Le script shell suivant se sert de tar pour créer une archive sur un montage NFS. Le nom de l'archive est défini en se servant de divers utilitaires en ligne de commande.

#!/bin/bash
####################################
#
# Backup to NFS mount script.
#
####################################

# What to backup. 
backup_files="/home /var/spool/mail /etc /root /boot /opt"

# Where to backup to.
dest="/mnt/backup"

# Create archive filename.
day=$(date +%A)
hostname=$(hostname -s)
archive_file="$hostname-$day.tgz"

# Print start status message.
echo "Backing up $backup_files to $dest/$archive_file"
date
echo

# Backup the files using tar.
tar czf $dest/$archive_file $backup_files

# Print end status message.
echo
echo "Backup finished"
date

# Long listing of files in $dest to check file sizes.
ls -lh $dest
  • $backup_files : variable listant les répertoires que vous souhaitez sauvegarder. La liste doit être adaptée à vos besoins.

  • $day : une variable contenant le jour de la semaine (lundi, mardi, mercredi, etc.) Cette fonction est utilisée pour créer un fichier d'archive pour chaque jour de la semaine, ce qui donne un historique de sauvegarde de sept jours. Il y a d'autres façons d'accomplir cela, par exemple en utilisant l'utilitaire date.

  • $hostname : variable contenant le nom d'hôte de votre système en format court. Vous pourrez ainsi placer les archives quotidiennes de plusieurs hôtes dans un même répertoire.

  • $archive_file : le nom complet de l'archive.

  • $dest : destination du fichier d'archive. Le répertoire doit être créé et, dans ce cas monté avant d'exécuter le script de sauvegarde. Voir Network File System (NFS) pour des détails sur l'utilisation de NFS.

  • status messages : messages optionnels affichés dans la console lors de l'utilisation de la commande echo.

  • tar czf $dest/$archive_file $backup_files : la commande tar utilisée pour créer le fichier d'archive.

    • c : crée une archive.

    • z : compresser l'archive avec gzip.

    • f : sortie vers un fichier d'archive. Sinon, la sortie tar est envoyée vers STDOUT.

  • ls -lh $dest : instruction optionnelle affichant une liste du répertoire de destination détaillée -l et au format lisible par facilement -h. Ceci est utile pour vérifier rapidement la taille du fichier archive, mais ne devrait pas remplacer le test de celui-ci.

Voici un exemple simple de script shell de sauvegarde. Cependant, il y a beaucoup d'options qui peuvent être inclues dans un tel script. Voir Références pour avoir des liens vers des ressources fournissant des informations plus approfondies sur les scripts shell.

Exécution du script

Exécution à partir d'un terminal

The simplest way of executing the above backup script is to copy and paste the contents into a file. backup.sh for example. The file must be made executable:

chmod u+x backup.sh

Then from a terminal prompt:

sudo ./backup.sh

C'est une excellente manière de tester le script pour s'assurer que tout fonctionne comme prévu.

Exécution avec cron

L'exécution du script peut être automatisée avec l'utilitaire cron. Le démon cron permet d'exécuter des scripts ou des commandes, à une date et une heure déterminées.

cron est configuré au travers d'entrées dans un fichier crontab. Les fichiers crontab sont séparés en champs:

# m h dom mon dow   command
  • m: minute de l'exécution de la commande, entre 0 et 59.

  • h: heure de l'exécution de la commande, entre 0 et 23.

  • dom : jour du mois durant lequel la commande s'exécute.

  • mon: mois de l'exécution de la commande, entre 1 et 12.

  • dow : le jour de la semaine ("day of week") où la commande s'exécute (entre 0 et 7). Dimanche peut être spécifié à l'aide de 0 ou 7, les deux valeurs sont valides.

  • command : la commande à exécuter.

La commande crontab -e doit être utilisée pour ajouter ou modifier les entrées d'un fichier crontab. Le contenu d'un fichier crontab peut être affiché avec la commande crontab -l.

Afin d'exécuter le script backup.sh précédent en utilisant cron, saisissez dans une invite de terminal :

sudo crontab -e

L'utilisation de sudo avec la commande crontab -e modifie le fichier crontab de l'utilisateur root. Cela est nécessaire si vous sauvegardez des répertoires accessibles uniquement par l'utilisateur root.

Ajoutez l'entrée suivante au fichier crontab :

# m h dom mon dow   command
0 0 * * * bash /usr/local/bin/backup.sh

Le script backup.sh sera maintenant lancé tous les jours à 12h00.

Le script backup.sh devra être copié dans le répertoire /usr/local/bin/ pour que cette entrée s'exécute correctement. Le script peut se trouver n'importe où sur le système de fichiers, il suffira de changer le chemin d’accès du script en conséquence.

Pour des options crontab plus détaillées, consultez Références.

Restauration à partir d'une archive

Il est important de vérifier une archive après sa création. Une archive peut être testée en listant les fichiers qu'elle contient, mais le mieux est de restaurer un fichier depuis cette archive.

  • Pour voir une liste du contenu de l'archive. Saisissez à partir d'un terminal:

    tar -tzvf /mnt/backup/host-Monday.tgz
    
  • Pour restaurer un fichier à partir de l'archive dans un répertoire différent, tapez :

    tar -xzvf /mnt/backup/host-Monday.tgz -C /tmp etc/hosts
    

    L'option -C pour tar redirige les fichiers extraits vers le répertoire spécifié. L'exemple ci-dessus va extraire le fichier /etc/hosts vers /tmp/etc/hosts. tar recrée l'arborescence des dossiers qu'il contient.

    Notez également que le premier « / » est enlevé du chemin du fichier à restaurer.

  • Pour restaurer tous les fichiers de l'archive saisissez ceci :

    cd /
    sudo tar -xzvf /mnt/backup/host-Monday.tgz
    

Cela écrasera les fichiers actuellement sur le système de fichiers.

Références

  • Voir Advanced Bash-Scripting Guide pour de plus amples informations à propos de l'écriture de scripts shell.

  • Le livre Teach Yourself Shell Programming in 24 Hours est disponible en ligne et est une mine d'or pour l'écriture de scripts shell.

  • La Page Wiki CronHowto contient des détails sur l'utilisation des options avancées de cron.

  • Voir le Manuel GNU tar pour plus d'informations concernant les options de tar.

  • L'article anglais de Wikipédia Backup Rotation Scheme contient des informations à propos d'autres méthodes de sauvegarde. Une ébauche en français est disponible dans l'article Sauvegarde de la version francophone de Wikipedia.

  • Le script shell utilise la commande tar pour la création de l'archive, mais il existe bien d'autres utilitaires en ligne de commande qui peuvent être utilisés. Par exemple :

    • cpio : pour copier des fichiers depuis et vers des archives.

    • dd : fait partie du paquet coreutils. Un utilitaire de bas niveau qui peut copier les données d'un format à un autre.

    • rsnapshot: un utilitaire de capture instantanée du système de fichiers utilisé pour créer des copies d'un système de fichiers.

    • rsync: un utilitaire flexible utilisé pour créer des copies incrémentielles des fichiers.