Merge improvements from Benoit (part 2)

This commit is contained in:
Gregory Colpart 2014-06-19 02:43:36 +02:00
parent b7a5efa462
commit a27c2e79c2
6 changed files with 117 additions and 83 deletions

137
README
View file

@ -1,6 +1,32 @@
EvoBackup
=========
en :
EvoBackup is a bunch of shell scripts to create a backup server which will
handle the backup of many servers (clients). Licence is GPLv2.
The main principle uses SSH chroot (called "jails" in the FreeBSD
world) for each client to backup. Each client will upload his data every day
using rsync in his chroot (using root account).
Incrementals are stored outside of the chroot using hard links. (So incrementals
are not available for clients). Using this method we can keep tens of backup of
each client securely and not using too much space.
Backup server
************
Server 1 ------ SSH/rsync -------> * tcp/2222 *
* *
Server 2 ------ SSH/rsync -------> * tcp/2223 *
************
This method uses standard tools (ssh, rsync, cp -al). EvoBackup is used for
many years by Evolix for back up each day hundreds of servers which uses many
terabytes of data.
fr :
EvoBackup est un ensemble de scripts permettant de mettre en place
un service de backups gérant les sauvegardes de plusieurs machines.
Le principe est d'installer des prisons/chroot contenant un service
@ -11,7 +37,6 @@ prisons (donc inacccessible par les serveurs) de façon incrémentale
grâce à des "hard links". On peut ainsi conserver des dizaines de
sauvegardes de chaque serveur de façon sécurisé et avec peu de place.
**************************
Serveur 1 ------SSH/rsync -------> * tcp/2222 Serveur *
* de *
@ -23,12 +48,12 @@ standards. Elle est utilisée depuis plusieurs années par Evolix
pour sauvegarder chaque jour des centaines de serveurs représentant
plusieurs To de données incrémentales.
Serveur de sauvegardes
----------------------
Le serveur de sauvegardes doit être sous Debian Squeeze
(testé sous Etch/Lenny/Squeeze, les instructions sont pour Squeeze).
Le serveur de sauvegardes doit être sous Debian Wheezy (voire Ubuntu 13.04)
(testé aussi sous Etch/Lenny/Squeeze, mais les instructions sont pour Wheez
y).
Avec les logiciels suivants :
- OpenSSH
@ -45,30 +70,12 @@ On créera ensuite les répertoires suivants :
- /backup/incs : pour les copies incrémentales des prisons
- /etc/evobackup : config des fréquences des copies incrémentales
Pour la mise en place des backups incrémentaux sur le serveur :
- Mettre en place les scripts evobackup-inc.sh et evobackup-rm.sh dans /usr/share/scripts
- Mettre les droits d'exécution : chmod u+x /usr/share/scripts/evobackup-{inc,rm}.sh
- Activer le crontab suivant (ajuster éventuellement les heures) :
29 10 * * * pkill evobackup-rm.sh && echo "Kill evobackup-rm.sh done" | mail -s "[warn] EvoBackup - purge incs interrupted" root
30 10 * * * /usr/share/scripts/evobackup-inc.sh && /usr/share/scripts/evobackup-rm.sh
Note : si l'on ne veut *jamais* supprimer les backups incrémentaux, on pourra se contenter
de ne jamais lancer le script evobackup-rm.sh
Si le noyau du serveur est patché avec GRSEC, on évitera pas mal
de warnings en positionnant les paramètres Sysctl suivants :
# sysctl kernel.grsecurity.chroot_deny_chmod=0
# sysctl kernel.grsecurity.chroot_deny_mknod=0
Note : plus nécessaire avec un noyau récent a priori
Serveurs à sauvegarder
----------------------
On peut sauvegarder différents systèmes : Linux, BSD, Windows, MacOSX.
L'un des seuls prérequis est d'avoir rsync.
L'un des seuls réels prérequis est d'avoir rsync.
Installation d'une sauvegarde
@ -77,7 +84,34 @@ Installation d'une sauvegarde
Côté serveur de sauvegardes
~~~~~~~~~~~~~~~~~~~~~~~~~~~
1) On récupère les sources via http://git.evolix.org/git/evolinux/evobackup.git
0) On récupère les sources via http://git.evolix.org/git/evolinux/evobackup.git
# umask 007 && mkdir /etc/evobackup && cp -v evobackup /etc/init.d/evobackup
Et on mettra en place des backups incrémentaux sur le serveur :
- Mettre en place les scripts evobackup-inc.sh et evobackup-rm.sh dans /usr/share/scripts
- Mettre les droits d'exécution : chmod u+x /usr/share/scripts/evobackup-{inc,rm}.sh
- Activer le crontab suivant (ajuster éventuellement les heures) :
29 10 * * * pkill evobackup-rm.sh && echo "Kill evobackup-rm.sh done" | mail -s "[warn] EvoBackup - purge incs interrupted" root
30 10 * * * /usr/share/scripts/evobackup-inc.sh && /usr/share/scripts/evobackup-rm.sh
Note 1 : si l'on veut plusieurs backups dans la journée (1 par heure maximum),
on pourra lancer /usr/share/scripts/evobackup-inc.sh à plusieurs reprises...
ce qui fonctionnera sous réserve qu'entre temps les données ont bien changé !
Note 2 : si l'on ne veut *jamais* supprimer les backups incrémentaux, on pourra se contenter
de ne jamais lancer le script evobackup-rm.sh
Si le noyau du serveur est patché avec GRSEC, on évitera pas mal
de warnings en positionnant les paramètres Sysctl suivants :
# sysctl kernel.grsecurity.chroot_deny_chmod=0
# sysctl kernel.grsecurity.chroot_deny_mknod=0
Note : plus nécessaire avec un noyau récent a priori
1) Pour installer une "prison" :
- Exporter la variable $JAIL avec le nom d'hôte saisit dans la grille :
@ -86,51 +120,20 @@ Côté serveur de sauvegardes
- Se placer dans le bon répertoire (attention, ne pas déplacer le script car
il a besoin du répertoire etc/ !) puis exécuter :
# bash chroot-ssh.sh /backup/jails/$JAIL
# bash chroot-ssh.sh -n /backup/jails/$JAIL -i <ip> -p <port> -k <pub-key-path>
Note : Ignorer une éventuelle erreur avec ld-linux-x86-64.so.2 (32bits) ou ld-linux.so.2 (64bits)
Note 1 : Ignorer une éventuelle erreur avec ld-linux-x86-64.so.2 (32bits) ou ld-linux.so.2 (64bits)
Note 2 : -i <ip> et -p <port> sont optionnels, vous pouvez ajuster /backup/jails/$JAIL/etc/ssh/sshd_config
Note 3 : si une prison a déjà été crée, -p guess vous permettra de deviner le prochain port disponible
Note 4 : -k <pub-key-path> est optionnel, vous pouvez ajouter la clé publique du client ainsi :
- Editer le fichier /backup/jails/$JAIL/etc/ssh/sshd_config
et remplacer le port SSH utilisé par le prochain disponible
(ou garder celui assigné si c'est la première prison).
Ajouter également la restriction d'IP si possible via "AllowUsers" :
AllowUsers root@IP root@::ffff:IP
- Ajouter la clé publique du client à sauvegarder dans
/backup/jails/$JAIL/root/.ssh/authorized_keys
Puis corrigez les droits SSH :
# chmod -R 600 /backup/jails/$JAIL/root/.ssh/
# chown -R root:root /backup/jails/$JAIL/root/.ssh/
- Puis corrigez les droits SSH :
# chmod -R 600 /backup/jails/$JAIL/root/.ssh/
# chown -R root:root /backup/jails/$JAIL/root/.ssh/
2) Gestion du lancement des prisons en modifiant le fichier de démarrage
/etc/init.d/evobackup (on remplacera $JAIL par sa vraie valeur).
- Ajouter à start) :
mount -t proc proc-chroot /backup/jails/$JAIL/proc/
mount -t devtmpfs udev /backup/jails/$JAIL/dev/
mount -t devpts devpts /backup/jails/$JAIL/dev/pts
chroot /backup/jails/$JAIL /usr/sbin/sshd > /dev/null
- Ajouter à stop) :
umount /backup/jails/$JAIL/proc/
umount /backup/jails/$JAIL/dev/pts
umount /backup/jails/$JAIL/dev/
kill -9 `chroot /backup/jails/$JAIL cat /var/run/sshd.pid`
- Ajouter à reload|force-reload) :
kill -HUP `chroot /backup/jails/$JAIL cat /var/run/sshd.pid`
- Ajouter à restart) :
kill -9 `chroot /backup/jails/$JAIL cat /var/run/sshd.pid`
chroot /backup/jails/$JAIL /usr/sbin/sshd > /dev/null
3) On lance la prison :
2) On lance la prison :
# mount -t proc proc-chroot /backup/jails/$JAIL/proc/
# mount -t devtmpfs udev /backup/jails/$JAIL/dev/
@ -141,7 +144,7 @@ Côté serveur de sauvegardes
# /etc/init.d/evobackup reload
4) Gestion des sauvegardes incrémentales
3) Gestion des sauvegardes incrémentales
Pour activer les gestions des copies incrémentales,
créer le fichier /etc/evobackup/$JAIL contenant par
@ -179,6 +182,8 @@ Côté serveur de sauvegardes
Côté serveur à sauvegarder
~~~~~~~~~~~~~~~~~~~~~~~~~~
0) On récupère les sources via http://git.evolix.org/git/evolinux/evobackup.git
1) Générez une clé SSH pour l'utilisateur "root" :
# ssh-keygen
@ -200,6 +205,8 @@ Côté serveur à sauvegarder
ajouter/supprimer les lignes en dessous pour sauvegarder les bons répertoires.
($rep désigne les données systèmes). Vous pouvez donc choisir librement ce
que vous désirez sauvegarder.
Vous devez aussi décommenter les lignes spécifiques pour les services (MySQL, LDAP,
MongoDB, etc.) en les ajustant si nécessaire.
4) Une fois que tout en place au niveau du serveur de sauvegardes,
on doit initier la première connexion :

View file

@ -7,6 +7,7 @@
# new version tested only on Debian Wheezy amd64
# Start :
# chroot /backup/jails/myserver mount -t proc proc-chroot /proc/
# chroot /backup/jails/myserver mount -t devtmpfs udev /dev/
# chroot /backup/jails/myserver mount -t devpts devpts-chroot /dev/pts/
# chroot /backup/jails/myserver /usr/sbin/sshd > /dev/null
# Reload: kill -HUP `chroot /backup/jails/myserver cat /var/run/sshd.pid`

View file

@ -6,24 +6,52 @@
# Required-Stop: $syslog
# Default-Start: 2
# Default-Stop: 1
# Short-Description: evobackup jails
# Short-Description: Backup manager using rsync and OpenSSH chroot.
### END INIT INFO
set -e
BACKUP_PATH=/backup
case "$1" in
start)
for jail in $(ls -1 ${BACKUP_PATH}/jails/* |grep -v \.bak); do
mount -t proc proc-chroot ${jail}/proc/
mount -t devtmpfs udev ${jail}/dev/
mount -t devpts devpts ${jail}/dev/pts
chroot ${jail} /usr/sbin/sshd > /dev/null
done
;;
stop)
for jail in $(ls -1 ${BACKUP_PATH}/jails/* |grep -v \.bak); do
kill $(chroot $jail cat /var/run/sshd.pid)
umount ${jail}/proc/
umount ${jail}/dev/pts/
# Need to wait a little time before unmounting /dev
sleep 0.2
umount ${jail}/dev
done
;;
reload|force-reload)
for jail in $(ls -1 ${BACKUP_PATH}/jails/* |grep -v \.bak); do
kill -HUP \
$(chroot $jail cat /var/run/sshd.pid)
done
;;
restart)
for jail in $(ls -1 ${BACKUP_PATH}/jails/* |grep -v \.bak); do
kill $(chroot $jail cat /var/run/sshd.pid)
chroot $jail /usr/sbin/sshd > /dev/null
done
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0

View file

@ -6,20 +6,17 @@
CONFDIR=/etc/evobackup/
DATE=$(date +"%Y-%m-%d-%H")
LOGFILE=/var/log/evobackup-incs.log
TMPDIR=/tmp/evobackup/
JAILDIR=/backup/jails/
INCDIR=/backup/incs/
MYMAIL=jdoe@example.com
mkdir -p $TMPDIR
for i in $( ls -1 $CONFDIR ); do
for i in $( ls $CONFDIR ); do
# hard copy everyday
# hard copy everyday
echo -n "hard copy $i begins at : " >> $LOGFILE
/bin/date +"%d-%m-%Y ; %H:%M" >> $LOGFILE
mkdir -p "$INCDIR"$i
cp -alx $JAILDIR$i $INCDIR$i/$DATE
mkdir -p "$INCDIR"$i
cp -alx $JAILDIR$i $INCDIR$i/$DATE
echo -n "hard copy $i ends at : " >> $LOGFILE
/bin/date +"%d-%m-%Y ; %H:%M" >> $LOGFILE

View file

@ -6,14 +6,14 @@
CONFDIR=/etc/evobackup/
DATE=$(date +"%Y-%m-%d")
LOGFILE=/var/log/evobackup-sync.log
TMPDIR=/tmp/evobackup/
JAILDIR=/backup/jails/
INCDIR=/backup/incs/
MYMAIL=jdoe@example.com
mkdir -p $TMPDIR
TMPDIR=$(mktemp --tmpdir=/tmp -d evobackup.tmpdir.XXX)
EMPTYDIR=$(mktemp --tmpdir=/tmp -d evobackup.empty.XXX)
for i in $( ls $CONFDIR ); do
for i in $( ls -1 $CONFDIR ); do
# list actual inc backups
for j in $( ls $INCDIR$i ); do
@ -31,11 +31,12 @@ for i in $( ls $CONFDIR ); do
for j in $( grep -v -f "$TMPDIR"$i.keep "$TMPDIR"$i.files ); do
echo -n "Delete $i/$j begins at : " >> $LOGFILE
/bin/date +"%d-%m-%Y ; %H:%M" >> $LOGFILE
cd $INCDIR$i
[ -n "$j" ] && rm -rf $j*
cd $INCDIR$i
[ -n "$j" ] && rsync -a --delete $EMPTYDIR/ $j*
[ -n "$j" ] && rmdir $j* && touch /tmp/evobackup-rm.txt
echo -n "Delete $i/$j ends at : " >> $LOGFILE
/bin/date +"%d-%m-%Y ; %H:%M" >> $LOGFILE
done
done | tee -a $LOGFILE | ( [ -e "/tmp/evobackup-rm.txt" ] && mail -s "[info] EvoBackup - purge incs" $MYMAIL && rm /tmp/evobackup-rm.txt )
done | tee -a $LOGFILE | mail -s "[info] EvoBackup - purge incs" $MYMAIL
rm -rf $TMPDIR $EMPTYDIR

View file

@ -142,7 +142,7 @@ else
rep="/bsd /bin /boot /sbin /usr"
fi
rsync -av --delete --force --ignore-errors --partial \
rsync -avzh --stats --delete --delete-excluded --force --ignore-errors --partial \
--exclude "lost+found" \
--exclude ".nfs.*" \
--exclude "/var/log" \
@ -176,7 +176,7 @@ rsync -av --delete --force --ignore-errors --partial \
/srv \
-e "ssh -p $SSH_PORT" \
root@node$NODE.backup.example.com:/var/backup/ \
| tail -20 >> /var/log/evobackup.log
| tail -30 >> /var/log/evobackup.log
FIN=$(/bin/date +"%d-%m-%Y ; %H:%M")