Réalisation d’un script de sauvegarde sur bande.
Dans le cadre de l’administration des sytème, la sauvegarde des données est un passage primordial, vital pour l’entreprise. Voici une petite réalisation permettant de sauvegarder un ou plusieurs dossier sur une bande. Le lecteur de bande est en général /dev/st0.
Contenu du script :
#!/bin/sh
#
# sauve.sh
# Script de sauvegarde de dossiers passés en paramètres sur une bande
# L'archive générée est une archive cpio compressée en bzip2
# Important: Pour restaurer les fichiers, il faut executer la commande:
# bzip2 -cd /dev/st0 | cpio -mui -d -H newc --no-absolute-filename
# Cette commande a pour effet de des-archiver /dev/st0 dans le dossier courant.
#
unset NbArgs
NbArgs=$#
#...............................................................................
# Tester le nombre d'argument. Si < 1, on sort !
#...............................................................................
if [ ${NbArgs} -lt 2 ]
then
echo -e "Syntaxe incorrecte!\n$0 suffixe_log dossiers_a_sauvegarder"
exit 1
fi
unset LogFolder
LogFolder=/var/log/sauvegarde
unset LogFile
LogFile=${LogFolder}/log_$1_`date --iso-8601`.log
cd /
#...............................................................................
# On vient tester si le dossier des logs existe
#...............................................................................
if [ ! -d ${LogFolder} ]
then
mkdir ${LogFolder}
fi
#...............................................................................
# On vient tester si le second argument contient un dossier existant
# Sinon, on génère une erreur, et on sort du programme
#...............................................................................
if [ ! -d $2 ]
then
echo "ERREUR: Le dossier /$2 n'existe pas." >${LogFile}
exit 1
fi
#...............................................................................
# On teste si le fichier contenant la liste des fichiers à sauvegarder existe
# Si tel est le cas, on le supprime
#...............................................................................
if [ -f /tmp/liste_backup.$$ ]
then
rm -f /tmp/liste_backup.$$
fi
#...............................................................................
# On retire le premier argument de la liste des arguments, et pour chaque
# dossier, on vient constituer la liste des fichiers à sauvegarder
#...............................................................................
shift
unset Folder
for Folder in "$@"
do
if [ -d ${Folder} ]
then
find ${Folder} -depth -xdev -type f -print >>/tmp/liste_backup.$$
fi
done
#...............................................................................
# Debut de la sauvegarde
# On liste les fichiers trouvés, que l'on transmet à cpio
# La sortie standard de cpio est transmise à bzip2
# Le tout est sauvegardé sur le lecteur /dev/st0
#...............................................................................
echo "###############################################################################" >${LogFile}
echo "# Debut de la sauvegarde ($*): " `date +%d/%m/%Y\ %H:%M:%S` >>${LogFile}
echo "###############################################################################" >>${LogFile}
cat /tmp/liste_backup.$$ | nice -n 10 cpio -o -H newc 2>>${LogFile} | nice -n 10 bzip2 -c -s -q >/dev/st0
echo "###############################################################################" >>${LogFile}
echo "# Debut de la verification de la sauvegarde ($*): " `date +%d/%m/%Y\ %H:%M:%S` >>${LogFile}
echo "###############################################################################" >>${LogFile}
nice -n 10 bzcat -s -q /dev/st0 | nice -n 10 cpio -muit -H newc >/tmp/verif_backup.$$ 2>/dev/null
echo "###############################################################################" >>${LogFile}
echo "# Difference entre éléments à sauvegarder et éléments sauvegardés" >>${LogFile}
echo "# "`date +%d/%m/%Y\ %H:%M:%S` >>${LogFile}
echo "# < signifie Fichiers a sauvegarder et manquant sur la sauvegarde" >>${LogFile}
echo "###############################################################################" >>${LogFile}
diff /tmp/liste_backup.$$ /tmp/verif_backup.$$ >>${LogFile} 2>/dev/null
#...............................................................................
# Fin du script de sauvegarde + nettoyage
#...............................................................................
if [ $? -eq 0 ]
then
echo "Sauvegarde ok" >>${LogFile}
else
echo "probleme de sauvegarde" >>${LogFile}
fi
rm -f /tmp/liste_backup.$$
rm -f /tmp/verif_backup.$$
echo "###############################################################################" >>${LogFile}
echo "# Fin de la sauvegarde ($*): " `date +%d/%m/%Y\ %H:%M:%S` >>${LogFile}
echo "###############################################################################" >>${LogFile}

Copiez ce script dans /usr/local/bin/sauv_dat.sh

Editez votre crontab, et ajoutez la ligne suivante :
0 21 * * 1-6 /usr/local/bin/sauve_dat.sh cron etc opt home

Cela génèrera une sauvegarde sur bande des dossiers /etc, /opt, /home, et génèrera un log dans /var/log/sauvegarde/log_cron_YYYY-MM-DD.log
Bien entendu, ce script peut-être largement complété par d’autres automatismes, tels que prévenir l’administrateur par mail en cas de problème,etc.