Rotation des archives

The shell script in Scripts shell only allows for seven different archives. For a server whose data doesn't change often, this may be enough. If the server has a large amount of data, a more complex rotation scheme should be used.

Rotation des archives NFS

Dans cette section, le script shell sera légèrement modifié pour mettre en œuvre un système de rotation grand père-père-fils (mensuel, hebdomadaire, quotidien):

  • La rotation va effectuer une sauvegarde journalière du dimanche au vendredi.

  • Le samedi une sauvegarde hebdomadaire est effectuée donnant 4 sauvegardes hebdomadaires par mois.

  • La sauvegarde mensuelle est effectuée le premier du mois avec une rotation bi-mensuelle en fonction de la parité du mois.

Voici le nouveau script:

#!/bin/bash
####################################
#
# Sauvegarde vers un point de montage NFS en utilisant
# une rotation grand-parent - parent - enfant
#
####################################

# Ce qu'il faut sauvegarder 
backup_files="/home /var/spool/mail /etc /root /boot /opt"

# Où le sauvegarder
dest="/mnt/backup"

# Initialisation des variables utilisées dans le nom de l'archive
day=$(date +%A)
hostname=$(hostname -s)

# Déterminer le numéro de semaine (1-4) du mois en cours
day_num=$(date +%d)
if (( $day_num <= 7 )); then
        week_file="$hostname-week1.tgz"
elif (( $day_num > 7 && $day_num <= 14 )); then
        week_file="$hostname-week2.tgz"
elif (( $day_num > 14 && $day_num <= 21 )); then
        week_file="$hostname-week3.tgz"
elif (( $day_num > 21 && $day_num < 32 )); then
        week_file="$hostname-week4.tgz"
fi

# Déterminer si le mois est pair ou impair
month_num=$(date +%m)
month=$(expr $month_num % 2)
if [ $month -eq 0 ]; then
        month_file="$hostname-month2.tgz"
else
        month_file="$hostname-month1.tgz"
fi

# Création du nom de l'archive
if [ $day_num == 1 ]; then
	archive_file=$month_file
elif [ $day != "Saturday" ]; then
        archive_file="$hostname-$day.tgz"
else 
	archive_file=$week_file
fi

# Affichage du commencement des opérations
echo "Sauvegarde de $backup_files vers $dest/$archive_file"
date
echo

# Sauvegarde des fichiers à l'aide de tar.
tar czf $dest/$archive_file $backup_files

# Affichage de la fin des opérations
echo
echo "Sauvegarde terminée"
date

# Listing détaillé des fichiers de $dest pour vérifier leur poids
ls -lh $dest/

Le script peut être exécuté en utilisant les mêmes méthodes que dans Exécution du script.

Il est conseillé de prendre des supports de sauvegarde hors site en cas de catastrophe. Dans l'exemple de ce script shell le support de sauvegarde est un autre serveur fournissant un partage NFS. Selon toute vraisemblance, prendre le serveur NFS vers un autre emplacement ne serait pas pratique. Selon les vitesses de connexion, une option possible est de copier le fichier d'archive via une liaison WAN à un serveur à un autre endroit.

Une autre option est de copier le fichier d'archive vers un disque dur externe qui peut ensuite être retiré du site. Comme le prix des disques durs externes continue de diminuer, il peut être rentable d'utiliser deux lecteurs pour chaque niveau d'archive. Cela vous permettra d'avoir un disque dur externe connecté au serveur de sauvegarde et un dans un autre emplacement.

Lecteurs de bande

Un lecteur de bande connecté au serveur peut être utilisé au lieu d'un partage NFS. L'utilisation d'un lecteur de bande simplifie la rotation des archives, et permet également de prendre les médias hors du site plus facilement.

Lors de l'utilisation d'un lecteur de bandes, les parties de nom de fichier du script ne sont pas nécessaires parce que les données sont envoyées directement au périphérique à bande. Certaines commandes de manipulation de la bande sont nécessaires. Ceci est accompli en utilisant mt, un utilitaire de contrôle de bandes magnétiques faisant parti du paquet cpio.

Voici le script shell modifié pour l'utilisation d'un lecteur de bande:

#!/bin/bash
####################################
#
# Sauvegarde vers une cassette
#
####################################

# Ce qu'il faut sauvegarder 
backup_files="/home /var/spool/mail /etc /root /boot /opt"

# Où le sauvegarder
dest="/dev/st0"

# Affichage du commencement des opérations
echo "Backing up $backup_files to $dest"
date
echo

# S'assurer que la cassette est rembobinée
mt -f $dest rewind

# Sauvegarde à l'aide de tar.
tar czf $dest $backup_files

# Rembobinage et ejection de la cassette
mt -f $dest rewoffl

# Affichage de la fin des opérations
echo
echo "Sauvegarde terminée"
date

Le nom de périphérique par défaut pour un lecteur de bandes SCSI est /dev/st0. Employez le chemin correspondant à votre système.

La restauration à partir d'un lecteur de bandes est essentiellement équivalente à la restauration à partir d'un fichier. Il suffit de rembobiner la bande et remplacer le chemin du fichier par celui du périphérique. Par exemple, pour restaurer le fichier /etc/hosts vers /tmp/etc/hosts :

mt -f /dev/st0 rewind
tar -xzf /dev/st0 -C /tmp etc/hosts