BackupPC : Un outil complet de backup

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Si vous cherchez un bel outil pour faire des sauvegardes et restaurations, ne cherchez plus, BackupPC est fait pour vous.

2 Configuration

2.1 Hote Windows via smb

Vous pouvez sauvegarder via des partages réseau. Pour celà sous windows, faites votre partage, et pour la machine voici un exemple :

#============================================================= -*-perl-*-
#
# Configuration file for Windows hosts.
# Note the slashes instead of backslashes
#
 
###########################################################################
# What to backup and when to do it
###########################################################################
#Tableau des répertoires à sauvegarder 
$Conf{BackupFilesOnly} = ['/Documents and Settings', 'Travail'];
#Tableau des répertoires exclus de la sauvegarde
$Conf{BackupFilesExclude} = '/Documents and Setings/user1/Local Settings/Temp';            
 
###########################################################################
# General per-PC configuration settings
###########################################################################
#Nom NetBios de la machine
$Conf{ClientNameAlias} = 'netbiosname';
#Méthode de sauvegarde utilisée
$Conf{XferMethod} = 'smb';
#Niveau de verbosité des fichiers de log
$Conf{XferLogLevel} = 1;
#Nom des partages à sauvegarder
$Conf{SmbShareName} = ['C$'];
#Nom de l'utilisateur réseau
$Conf{SmbShareUserName} = 'Administrateur';
#Mot de passe de l'utilisateur réseau
$Conf{SmbSharePasswd} = 'secret';
#Méthode de compression de la sauvegarde
$Conf{ArchiveComp} = 'bzip2';

2.2 Hote Windows via rsync

Nous allons utiliser la méthode avec laquelle nous allons nous passer de Cygwin. Vous pouvez utiliser la méthode avec Cygwin, mais pas installer les 2 simultanément.

Pour commencer, téléchargez cwrsync et installez le sur la machine windows. Durant l'installation, il va créer un utilisateur avec un mot de passe généré aléatoirement, laissez comme c'est. Cet utilisateur est dédié au lancement du service rsyncd.

Ensuite, allez dans le dossier "C:\Program Files (x86)\ICW", puis editez le fichier de configuration :

Configuration File C:\Program Files (x86)\ICW\rsyncd.conf
use chroot = false
strict modes = false
hosts allow = *
log file = rsyncd.log
 
# Module definitions
# Remember cygwin naming conventions : c:\work becomes /cygwin/c/work
#
[share]
path = /cygdrive/c/share
comment = share rsync
read only = yes
transfer logging = yes
hosts allow = 192.168.0.14
secrets file = rsyncd.secrets
auth users = backuppc

Adaptez les lignes suivantes :

  • path : /cygdrive/ est obligatoire. Utilisez la lettre ensuite du lecteur qui vous intéresse (ici 'c'), puis le dossier en question (ici 'share') (ce qui donne '/cygdrive/c/share' pour 'C:\share').
  • comment : une petite ligne de commentaire
  • read only : on le passe à yes, car seul backuppc doit y accéder et il n'a pas besoin de droits spécifique en écriture
  • hosts allow : spécifier l'ip du serveur backuppc
  • secret file : contient un fichier avec les logins et mots de passe des utilisateurs étant autorisés à se connecter
  • auth users : spécifie quel utilisateur est autoriser à se connecter.

J'ai donc créerun utilisateur spécifique appellé backuppc sur la machine et lui ai accordé des droits spécifique (onglet sécurité) au dossier "C:\share"

Maintenant, nous allons créer un fichier rsyncd.secrets contenant les utilisateurs et mots de passe. Il va donc falloir autoriser l'utilisateur backuppc à se connecter au service rsyncd :

Configuration File C:\Program Files (x86)\ICW\rsyncd.secrets
user:password

La configuration est assez simple, ce qui me donnerait par exemple : backuppc:mot_de_passe
Une fois que c'est fait, redémarrez le service 'RsyncServer' dans la liste des services.

Sur le serveur backuppc, la configuration du serveur en question ressemble à ceci :

Configuration File /etc/backuppc/windows.pl
$Conf{XferMethod} = 'rsyncd';
$Conf{RsyncShareName} = [
  'factory'
];
$Conf{RsyncdPasswd} = 'mot_de_passe';
$Conf{RsyncdUserName} = 'backuppc';

Reloadez backuppc et c'est bon.

3 Sauvegarder des bases SQL

3.1 MySQL

Pour sauvegarder des bases SQL (MySQL par exemple), il est préférable de créer un compte sql dédié aux backups (backuppc par exemple) et de lui assigné les droits de select et de lock sur toutes les bases :

Command mysql
$ mysql -uroot -p
CREATE USER 'backuppc'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT , LOCK TABLES ON * . * TO 'backuppc'@'localhost' IDENTIFIED BY 'password' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
FLUSH PRIVILEGES ;

3.1.1 Backupper toutes les bases d'un coup

L'avantage de cette méthode est d'être simple, mais elle ne permet pas de restaurer base par base.

Dans la configuration de votre host sur backuppc, ajoutez cette ligne puis adaptez là à vos besoin :

Configuration File /etc/backuppc/myhost.pl
...
$Conf{DumpPreUserCmd} = '$sshPath -q -x -l root $host /usr/bin/mysqldump -ubackuppc -ppassword -e --single-transaction --opt --all-databases > /tmp/dump.sql';
...

L'idéal est ensuite qu'à la fin du backup, vous puissiez effacer ce dump (par soucis de sécurité) :

Configuration File /etc/backuppc/myhost.pl
...
$Conf{DumpPostUserCmd} = '$sshPath -q -x -l root $host rm -f /tmp/dump.sql';
...

3.1.2 Backupper base par base

Cette méthode plus fastidieuse à pour avantage la sauvegarde base par base qui permet de restaurer que la base qui vous intéresse en cas de problème.

De plus, elle comprends de la compression à la volée de votre base. Il faudra cependant installer 7zip au préalable (j'ai fais le choix de 7zip pour avoir une meilleure compression).

Nous allons créer un script que nous allons placer dans /etc/scripts par exemple :

Configuration File /etc/scripts/backup_mysql_databases.sh
#!/bin/bash
user='root'
password='password'
destination='/tmp/backups_sql'
mail='my@mail.com'
 
mkdir -p $destination
for i in `echo "show databases;" | mysql -u$user -p$password | grep -v Database`; do
       mysqldump -u$user -p$password --opt --add-drop-table --routines --triggers --events --single-transaction --master-data=2 -B $i | 7z a -t7z -mx=9 -si $destination/$i.sql.7z
done
 
problem_text=''
problem=0
for i in `ls $destination/*` ; do
    size=`du -sk $i | awk '{ print $1 }'`
    if [ $size -le 4 ] ; then
        problem_text="$problem_text- $i database. Backupped database size is equal or under 4k ($size)\n"
        problem=1
    fi  
done
 
if [ $problem -ne 0 ] ; then
    echo -e "Backups problem detected on :\n\n$problem_text" | mail -s "$HOSTNAME - MySQL backup problem" $mail
fi

Le problème ici est le mot de passe en clair. Vérifiez donc à bien restreindre à l'utilisateur qui va backuper :

Command
chmod 700 /etc/scripts/backup_mysql_databases.sh

Dans la configuration de votre host sur backuppc, ajoutez cette ligne puis adaptez là à vos besoin :

Configuration File /etc/backuppc/myhost.pl
...
$Conf{DumpPreUserCmd} = '$sshPath -q -x -l root $host /etc/scripts/backup_mysql_databases.sh';
...

L'idéal est ensuite qu'à la fin du backup, vous puissiez effacer ce dump (par soucis de sécurité) :

Configuration File /etc/backuppc/myhost.pl
...
$Conf{DumpPostUserCmd} = '$sshPath -q -x -l root $host rm -Rf /tmp/backups_sql';
...

3.2 PostgreSQL

Pour sauvegarder des bases Postgres, il nous faut faire comme d'habitude, un transfert de clef SSH mais pour l'utilisateur postgres.

3.2.1 Backupper toutes les bases d'un coup

L'avantage de cette méthode est d'être simple, mais elle ne permet pas de restaurer base par base.

Dans la configuration de votre host sur backuppc, ajoutez cette ligne puis adaptez là à vos besoin :

Configuration File /etc/backuppc/myhost.pl
...
$Conf{DumpPreUserCmd} = '$sshPath -q -x -l postgres $host /usr/bin/pg_dump > /tmp/dump.sql';
...

L'idéal est ensuite qu'à la fin du backup, vous puissiez effacer ce dump (par soucis de sécurité) :

Configuration File /etc/backuppc/myhost.pl
...
$Conf{DumpPostUserCmd} = '$sshPath -q -x -l root $host rm -f /tmp/dump.sql';
...

3.2.2 Backupper base par base

Cette méthode plus fastidieuse à pour avantage la sauvegarde base par base qui permet de restaurer que la base qui vous intéresse en cas de problème.

De plus, elle comprends de la compression à la volée de votre base. Il faudra cependant installer 7zip au préalable (j'ai fais le choix de 7zip pour avoir une meilleure compression).

Nous allons créer un script que nous allons placer dans /etc/scripts par exemple :

Configuration File /etc/scripts/backup_postgres_databases.sh
#!/bin/bash
destination='/tmp/backups_pgsql'
mail='my@mail.fr'
 
mkdir -p $destination || echo -e "Backups problem detected on :\n\n$problem_text" | mail -s "Can't create $destination folder" $mail
for i in `psql -l | grep "^\ [a-zA-Z0-9]" | grep -v 'template[0|1]' | cut -d\| -f1`; do
       /usr/bin/pg_dump $i | 7z a -t7z -mx=9 -si $destination/$i.sql.7z
done
 
problem_text=''
problem=0
for i in `ls $destination/*` ; do
    size=`du -sk $i | awk '{ print $1 }'`
    if [ $size -le 4 ] ; then
        problem_text="$problem_text- $i database. Backupped database size is equal or under 4k ($size)\n"
        problem=1
    fi
done
 
if [ $problem -ne 0 ] ; then
    echo -e "Backups problem detected on :\n\n$problem_text" | mail -s "$HOSTNAME - Postgres backup problem" $mail
fi

Un peu de sécurité ne fait pas de mal :

Command
chmod 744 /etc/scripts/backup_postgres_databases.sh
chown postgres /etc/scripts/backup_postgres_databases.sh

Dans la configuration de votre host sur backuppc, ajoutez cette ligne puis adaptez là à vos besoin :

Configuration File /etc/backuppc/myhost.pl
...
$Conf{DumpPreUserCmd} = '$sshPath -q -x -l postgres $host /etc/scripts/backup_postgres_databases.sh';
...

L'idéal est ensuite qu'à la fin du backup, vous puissiez effacer ce dump (par soucis de sécurité) :

Configuration File /etc/backuppc/myhost.pl
...
 $Conf{DumpPostUserCmd} = '$sshPath -q -x -l root $host rm -Rf /tmp/backups_sql';
...

4 Restauration par script

Voici un script qui permet de faire de la restauration :

#!/bin/bash
 
# Script for restoring hosts (last full backup) from command line.
# The restored backups can be found in $RESTOREDIR (defined below),
# and are to be written on tape.
 
BACKUPPCDIR=/srv/backuppc-data
HOSTSDIR=$BACKUPPCDIR/pc
RESTOREDIR=$HOSTSDIR/restore/restore
 
# put the hosts/directories you do not want to restore into egrep...
HOSTS=$(ls $HOSTSDIR | egrep -v '(HOST_CONFIG_FILES|restore)' | tr / " ")
# or use:
# HOSTS="HOST1 HOST2 REMOTE3"
 
 
# no need to change anything below...
 
DATE=$(date +%F)
mkdir -p $RESTOREDIR/$DATE
 
for HOST in $HOSTS
do
# find the last full backup
NUMBER=$(grep full $HOSTSDIR/$HOST/backups| tail -1 | cut -f1)
 
if [ "$NUMBER" ]
then
 
# do the backup for the host
$BACKUPPCDIR/bin/BackupPC_archiveHost $BACKUPPCDIR/bin/BackupPC_tarCreate /usr/bin/split /usr/bin/par2 \
            "$HOST" "$NUMBER" /usr/bin/gzip .gz 0000000 $RESTOREDIR/$DATE 0 \*
fi
 
done

5 FAQ

5.1 Problème de création de lien au démarrage du service

Si vous rencontrez ce type de message d'erreur :

2008-04-20 17:55:46 Can't create a test hardlink between a file in /var/lib/backuppc/pc and /var/lib/backuppc/cpool.  Either these are different file systems, or this file system doesn't 
support hardlinks, or these directories don't exist, or there is a permissions problem, or the file system is out of inodes or full.  Use df, df -i, and ls -ld to check each of these possibilities. Quitting...

Vérifiez bien les droits etc... sinon, si vous utilisez la cryptologie encfs, alors cela vient de ça et je vous invite a suivre ce lien

5.2 J'ai perdu les numéros de sauvegardes quand je souhaites restaurer des données

Si vous avez toujours vos données mais que vos fichier backups et backups.old sont corrompus, il reste un moyen de recréer l'indexation des sauvegardes afin de pouvoir récupérer les données. Si vous souhaitez tout réindexer, exécutez ceci :

Command BackupPC_fixupBackupSummary
/usr/share/backuppc/bin/BackupPC_fixupBackupSummary

Sinon, si vous voulez faire simplement une machine, ajoutez ceci à la fin :

Command BackupPC_fixupBackupSummary
$ /usr/share/backuppc/bin/BackupPC_fixupBackupSummary -l localhost
Doing host localhost
   Reading /var/lib/backuppc/pc/localhost/0/backupInfo
   Reading /var/lib/backuppc/pc/localhost/1/backupInfo
   Reading /var/lib/backuppc/pc/localhost/2/backupInfo
   Reading /var/lib/backuppc/pc/localhost/204/backupInfo
   Reading /var/lib/backuppc/pc/localhost/206/backupInfo
   Reading /var/lib/backuppc/pc/localhost/207/backupInfo



Si vous avez une erreur Perl, c'est qu'il vous manque surement le paquage Perl "Time::ParseDate", faites ceci :

Command apt-get
apt-get install libtime-modules-perl

6 Ressources

Documentation BackupPC
Documentation on Backuppc on Debian