Skip to Content

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 :

  •  http://www.coagul.org/article.php3 ?id_article=158

    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 :

  •  Que le serveur de sauvegarde dispose d’un serveur ssh opérationnel
  •  Que la clé publique du serveur à sauvegarder soit placée sur le serveur de sauvegarde pour éviter la saisie des mots de passe.

    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 lecture seule (Partition NTFS partagée en réseau) était activé
  •  le propriétaire de ce dossier n’existait plus.

    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 :

  •  Être sur que le disque dure amovible est reconnu comme « /dev/sda » et non pas « /dev/sdb » ou autre chose.

    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