Installer un serveur de sauvegardes sous Linux
But de ce document
Ce document me sert de mémo pour installer et configurer un serveur de sauvegardes. Les sauvegardes seront effectuées sur des disques durs externes connectés en usb2. Chaque jour, le disque dur sera déconnecté, mis au coffre ignifugé et remplacé par un autre disque usb.
Installation d’une Debian Testing (Etch) de Base
J’ai choisi une Debian Testing (Etch) pour avoir une gestion des périphériques amovibles plus récente que celle actuellement disponible sous Debian Sarge.
J’ai donc commencé par installer ma Debian Testing en suivant ce mémo :
Montage du disque dur usb
J’ai commencé par vérifier que mon disque dur était correctement reconnu par le système en regardant les messages lors de la connexion et déconnexion du disque dur. De plus, la lecture de ces messages permet de connaître le nom du périphérique qui est dans mon cas « /dev/sda » :
# tail -f /var/log/syslog
Cette commande permet de connaître les différentes partitions et le système de fichier utilisé :
# fdisk -l /dev/sda
Comme la partition « sda1 » était formatée en ntfs, j’ai commencé par la reformater en ext2
# mke2fs /dev/sda1
Remarque 1 : Je ne pense pas qu’un système de fichier journalisé comme ext3 soit nécessaire pour ce type d’utilisation :
Remarque 2 : Le formatage d’un disque de 500Go prend plusieurs minutes.
Ensuite, j’ai créé un dossier pour recevoir le montage de la partition :
# mkdir /mnt/sda1
Et j’ai monté la partition :
# mount /dev/sda1 /mnt/sda1
Pour des raisons de sécurité, je souhaite laisser l’accès à cette partition uniquement au seul utilisateur du serveur (ex : tony). Pour cela, il faut définir les droits sur la partition une fois celle-ci montée :
# chown tony /mnt/sda1
# chmod 700 /mnt/sda1
Remarque : Les commandes précédentes ne fonctionnent pas si le système de fichiers est de type « fat »
Montage automatique du disque dur au démarrage de l’ordinateur
Pour des raisons de sécurité, je ne souhaite pas que le montage automatique se fasse au moment de la connexion du disque, mais au moment du redémarrage de l’ordinateur. J’ai donc ajouté cette ligne dans le fichier « /etc/fstab » :
/dev/sda1 /mnt/sda1 ext2 rw,auto 0 0
Remarque : J’ai volontairement précisé le type de système de fichiers (ext2) pour que le montage échoue en cas d’utilisation d’un disque non formaté en ext2.
Ensuite avant de lancer les sauvegardes, je lance un redémarrage de l’ordinateur automatique avec la crontab de root (crontab -e) pour être sur que tout est dans un fonctionnement optimum :
50 17 * * * /sbin/reboot
Installation du serveur SSH
La sauvegarde des différents serveurs se fera uniquement en passant par ssh. De plus étant donné que ce serveur sera administré à distance, l’installation d’un serveur SSH est donc obligatoire :
Installation du serveur ssh :
# aptitude install openssh-server
Remarque : Lors de la mise au point de ce serveur de sauvegarde, j’ai comparé le temps de sauvegarde en passant par un partage Samba par rapport à l’envoi de fichiers via ssh et il s’est avéré que l’envoi via ssh était deux fois plus rapide. De plus, cette méthode est mieux sécurisée et est plus fiable, car j’ai rencontré quelques soucis de compatibilité entre les différentes versions de Samba de mes serveurs.
Mise en place des clés publiques ssh sur le serveur de sauvegarde
Pour pouvoir automatiser la sauvegarde via ssh, il faut éviter la saisie du mot de passe lors de la connexion. Pour cela, il faut mettre en place une clé privée sur le serveur à sauvegarder et la clé publique correspondante sur le serveur de sauvegarde.
Création d’une clé privée et d’une clé publique sur le serveur à sauvegarder :
# ssh-keygen -t dsa
Mise en place de la clé publique sur le serveur de sauvegardes depuis le serveur à sauvegarder :
# ssh-copy-id -i /root/.ssh/id_dsa.pub root@ServeurSauvegarde
Ensuite, il est possible de tester que la connexion au serveur de sauvegarde se fasse désormais sans la saisie du mot de passe :
# ssh root@ServeurSauvegarde
Script de sauvegarde
Voici le script que j’utilise pour sauvegarder les différents répertoires de mes serveurs. Dans cet exemple, je ne sauvegarde que les répertoires « /etc », « /home » et « /root » :
#!/bin/bash
function Save() {
Heure=`date +"%H:%M:%S"`
Taille=`du -sh $1 | cut -f1` #Taille du dossier à sauvegarder
echo "$Heure : Sauvegarde $1 ($Taille)"
J=`date +%w`
Serveur=`hostname`
Destination="/mnt/sda1/$J/$Serveur"
ssh tony@pglinux01 mkdir -p "$Destination"
tar czf - "$1" 2>>err.log | ssh tony@pglinux01 "cat >
$Destination/$2.tgz"
}
rm err.log
Heure=`date +"%H:%M:%S"`
echo "$Heure : DEBUT DE LA SAUVEGARDE DU SERVEUR **********************"
Save "/etc" "etc"
Save "/home" "home"
Save "/root" "root"
Heure=`date +"%H:%M:%S"`
echo "$Heure : FIN DE LA SAUVEGARDE DU SERVEUR ************************"
echo "** Détail des erreurs pendant la sauvegarde **"
cat err.log
Sauvegarde en automatique
Pour automatiser la sauvegarde, j’ajoute simplement dans la crontab de root, la ligne suivante :
30 20 * * 1-5 /root/MesDocuments/save_serveur_ssh.sh | mail -s "[`hostname`]
Sauvegarde serveur" tg@monserveur
Cette ligne lance le programme de sauvegarde à 20H30 du lundi au vendredi et envoie par mail le résultat de celle-ci
Sauvegarde et archivage des fichiers avec RSYNC
Les sauvegardes précédentes ne concernaient que les fichiers systèmes. Pour les fichiers utilisateurs, il est préférable de garder un historique plus long que 5 jours.
Le programme « rsync » est tout approprié pour cette opération, car il permet de synchroniser un dossier source avec un dossier de destination tout en créant des backup des fichiers modifiés.
L’installation consiste à installer ce programme sur le serveur à sauvegarder (la source) et sur le serveur de sauvegarde (la destination) :
# aptitude install rsync
Ensuite comme précédemment, il faut :
Voici un exemple de script de sauvegardes utilisant rsync :
#!/bin/bash
Serveur=$1
if [ "$Serveur" == "" ]
then
echo "Serveur à sauvegarder obligatoire en paramètre"
exit
fi
Date=`date +%Y-%m-%d`
Heure=`date +"%H:%M:%S"`
echo "$Heure : Début de la sauvegarde des fichiers de $Serveur *********"
Source=/mnt/Reseau/$Serveur/
Destination=/mnt/sda1/0/$Serveur/Fichiersµ
DestinationBackup=/mnt/sda1/0/$Serveur/Backup/$Date-$Heure
# ** Montage et test que la source est correctment montée ***************
mount $Source
Test=`df -h | grep $Serveur | wc -l`
if [ $Test = 0 ]
then
echo | mail -s "[$Serveur] Sauvegarde impossible " tony@mondomaine.com
exit
fi
# ***********************************************************************
# Si le serveur est innacessible, un message est envoyé *****************
ssh tony@pglinux01 mkdir -p "$Destination" 2>/dev/null
ssh tony@pglinux01 mkdir -p "$DestinationBackup" 2>/dev/null
if [ "$?" == "1" ]
then
echo | mail -s "[$Serveur] Impossible de sauvegarder" tony@mondomaine.com
else
rsync -rt --delete --backup --backup-dir=$DestinationBackup $Source
tony@pglinux01:$Destination 2>/tmp/$Serveur.log
fi
cat /tmp/$Serveur.log
Problèmes rencontrés avec rsync
Rsync refusait de me faire un backup d’un dossier particulier alors que tout fonctionnait pour les autres dossiers. Après recherche, il s’est avéré que :
L’attribut « a » est déconseillé en cas de sauvegarde sur un autre système de fichiers (ex ext3 vers fat), car rsync n’arrivera pas à sauvegarder tous les attributs et renverra des messages d’erreurs et en plus il fera un backup de tous les fichiers. Dans ce cas, il faut simplement utiliser « -rt »
En cas de sauvegarde d’un système ext3 sur un système fat, il faut également ajouter l’option « —modify-window=1 » pour laisser une tolérance d’une seconde entre la date du fichier source et la date du fichier sauvegardé, car un système FAT a une tolérance dans l’heure de deux secondes et un système ext3 d’une seconde.
Toujours dans le cas d’une sauvegarde d’un système « ext3 » sur un système « fat », certains caractères dans le nom des fichiers ne sont pas reconnus (ex : le signe ’ :’). dans ce cas, une solution consiste à renommer les fichiers avant de les sauvegarder avec par exemple cette commande :
find . -name "*:*" -print -exec rename 's/:/_/g' {} \;
Il est important que le poste original et le poste de destination soient synchronisés sur la même heure, car en cas de différence, cela peut poser des problèmes.
Redémarrage du serveur avant de lancer les sauvegardes
Par mesure de sécurité, je préfère redémarrer automatiquement le serveur avant de lancer les sauvegardes pour au moins une raison :
Sauvegarde de MySQL
Pour la sauvegarde d’une base de données, il est conseillé de ne pas sauvegarder les fichiers directement mais d’utiliser les outils spécifiques à la base de données. Il est même conseillé (mais pas obligatoire) d’arrêter la base de données pendant la sauvegarde.
Voici un exemple de script permettant de sauvegarder dans un fichier chaque table de chaque base de données. Et par mesure de sécurité supplémentaire, j’ai même un fichier contenant chaque base de données complète :
for LaBase in $(echo 'SHOW DATABASES;' | mysql)
do
if [ "$LaBase" != "Database" ]; then
Heure=`date +"%H:%M:%S"`
echo "$Heure : Sauvegarde de $LaBase"
mysqldump -Q -c -C --add-drop-table --add-locks --quick $LaBase > /
nt/sdb1/Sauvegardes/mysql/$LaBase.sql
for LaTable in $(echo "USE $LaBase; SHOW TABLES;" | mysql)
do
if [ "$LaTable" != "Tables_in_$LaBase" ]; then
#echo "-> Sauvegarde de $LaBase-$LaTable"
mysqldump -Q -c -C --add-drop-table --add-locks -quick
$LaBase$LaTable > /mnt/sdb1/Sauvegardes/mysql/$LaBase-$LaTable.sql
fi
done
fi
done
Remarque : Il aurait été beaucoup plus simple de sauvegarder toutes les bases de données dans un seul fichier avec le paramètre « —all-databases », mais comme mes bases de données sont très importantes, j’ai préféré avoir un fichier séparé pour chaque table.
Sauvegarde d’OpenLDAP
La commande suivante permet d’exporter dans un fichier texte le contenu de la base de données LDAP pour être sur de faire une sauvegarde dans de bonnes conditions :
# slapcat > /mnt/sdb1/Sauvegardes/openldap/openldap.ldif
Test d’écriture de gros fichiers
La taille maximum qu’un fichier peut avoir, dépend de beaucoup de choses (version du noyau Linux, système de fichiers utilisés,..). Le mieux pour être sûr que le système accepte de gros fichiers (ex : 10Go) est de créer un fichier de test avec la commande suivante :
# dd if=/dev/zero of=testfile2 bs=1024k count=10000
10000+0 records in
10000+0 records out
10485760000 bytes (10 GB) copied, 526.987 seconds, 19.9 MB/s
Remarque : Cette commande permet également de connaître la vitesse d’enregistrement.
Historique des modifications
Version | Date | Commentaire |
---|---|---|
0.2 | 01/09/06 | Création par Tony GALMICHE |
0.5 | 03/04/07 | Mise à jour suite à mise en place disque de 500Go + Mise en ligne |
Commentaires
> Installer un serveur de sauvegardes sous Linux
Si tu parles de la sauvegarde système avec tar, comme je fais une sauvegarde sur 5 jours et que la compréhension divise la taille par deux, il me faut environ le double de place sur le disque dur que la taille totales de mes serveurs à sauvegarder.
Concernant rsync, il ne sauvegarde que la différence (c’est donc une sauvegarde incrémentale) et cela me permet de tenir plusieurs mois avant que le disque ne soit saturé. Donc je conserve un historique sur plusieurs mois de tous les fichiers supprimé ou modifiés.
Avec le disque de 500Go que je viens de mettre en place, je sauvegarde 5 serveurs qui représente environ au total entre 100 et 200Go de données.
> Installer un serveur de sauvegardes sous Linux
Ca doit te prendre une place énorme sur le disque ca.
Soit tu n’as pas beaucoup d’historique, soit tu n’as pas beaucoup de donné. Mais faire une sauvegarde complète tous les soirs.
Pourquoi tu ne fais pas une sauvegarde complete par semaine + incrémentale ?
> Installer un serveur de sauvegardes sous Linux
Bonjour,
Oui mais non, car dans ce cas tu ne change pas les droits des fichiers en eux même mais seulement le droit affecté au montage ce qui n’est pas tout à fait pareil.
> Installer un serveur de sauvegardes sous Linux
Salut, c’est un bon article ! Ca remplit bien le rôle de mémo, comme les petits ’precis&concis’ :D
En ce qui concerne le chown sur la partition FAT, c’est possible, il suffit d’indiquer les options uid= et gid= lors du montage.
Pour connaître l’id de ton usager, il suffit de faire
id -u tony