diff --git a/README b/README index 9b92f52..a8ee704 100644 --- a/README +++ b/README @@ -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 -p -k - 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 et -p 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 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 : diff --git a/chroot-ssh.sh b/chroot-ssh.sh index 35570d3..5888dec 100644 --- a/chroot-ssh.sh +++ b/chroot-ssh.sh @@ -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` diff --git a/evobackup b/evobackup index 3a7dff5..c790c54 100755 --- a/evobackup +++ b/evobackup @@ -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 - diff --git a/evobackup-inc.sh b/evobackup-inc.sh index 40b9b65..98511b8 100644 --- a/evobackup-inc.sh +++ b/evobackup-inc.sh @@ -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 diff --git a/evobackup-rm.sh b/evobackup-rm.sh index 0ca9747..7b1d35d 100644 --- a/evobackup-rm.sh +++ b/evobackup-rm.sh @@ -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 diff --git a/zzz_evobackup b/zzz_evobackup index e687b29..b8c8272 100644 --- a/zzz_evobackup +++ b/zzz_evobackup @@ -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")