Académique Documents
Professionnel Documents
Culture Documents
Pierre.Lafaye-de-Micheaux@upmf-grenoble.Fr
ddelseny@yahoo.fr
Dans cet article, nous allons vous apprendre comment mettre en place un
serveur de sauvegardes incrmental pour les donnes d'un petit rseau
htrogne.
1. LE BUT
Avez-vous dj effac par mgarde un fichier qui vous tait cher? Ou pire, lanc la commande rm
-rf * la place de la commande rm -rf *temp en voulant par exemple effacer tous les dossiers dont
le nom se termine par temp (notez la proximit de la touche * et de la touche [ENTREE]!)? H bien,
plus d'inquitudes. Nous allons vous montrer comment prvenir vaut mieux que gurir!
Remarque: au cas o le mal serait dj fait, le petit utilitaire recover
(http://recover.sourceforge.net/linux/recover/) pourrait vous tre utile.
Nous allons donc vous montrer comment mettre en place votre propre serveur de sauvegardes. Cela
peut par exemple tre trs intressant pour une petite structure contenant une dizaine d'ordinateurs
(ou plus).
Pour cela, vous devez disposer d'un ordinateur (le serveur) quip d'un systme d'exploitation Linux
que nous nommerons par la suite BACKUP. Vous devez aussi avoir dans votre rseau d'autres
ordinateurs (les clients) qui contiendront les donnes sauvegarder.
Idalement, et pour des raisons de scurit, le serveur contiendra deux disques durs: un disque de
faible capacit (disque 1) sur lequel un systme Linux minimal sera install, et un second disque de
grande capacit (disque 2) qui contiendra les sauvegardes des donnes des usagers du rseau. La
capacit de ce disque devrait tre lgrement suprieure la taille totale de toutes les donnes que
vous voulez sauvegarder. Notez que l'on trouve maintenant des disques durs de capacit suprieure
300Go pour un prix d'environ 300 euros, soit approximativement 1 euro par Go.
Le premier disque dur contiendra un systme d'exploitation Linux minimal sans gestionnaire de
fentres graphiques tel KDE ou Gnome, mais fonctionnera uniquement en mode console.
2. LES INGREDIENTS
rsync:
petit logiciel permettant de transfrer des fichiers sur une machine distante, en synchronisant
la cible avec la source.
ssh:
permet d'obtenir un shell sur une machine distante de faon scurise, peut interagir avec rsync
pour scuriser les transferts de fichiers.
cron:
dmon permettant d'automatiser des tches effectuer des intervalles de temps rguliers.
-al):
3. LES PRINCIPES
On parle de sauvegarde incrmentale lorsqu'on ne prend en compte, chaque nouvelle sauvegarde,
que les diffrences avec celle qui la prcde. Le serveur de sauvegarde sera une machine ddie qui
contiendra une copie de l'ensemble des fichiers prsents sur les diffrents clients du rseau (en tout
cas des fichiers que l'on dsire sauvegarder).
Chaque client disposera, sur le serveur, d'un dossier nomm sauvegardes dans lequel il copiera, tous
les jours, ses donnes (en fait cela pourra mme tre fait de manire automatise, sans aucune
intervention de l'utilisateur). Le serveur effectuera alors, de faon programme, un roulement sur ces
fichiers afin d'en conserver des versions journalires, hebdomadaires et mensuelles.
En cas de ppin sur l'une des machines clientes, l'utilsateur de cette machine pourra alors se
connecter au serveur (sans avoir besoin de contacter l'administrateur rseau!) pour rcuprer le
fichier accidentellement effac tel qu'il tait la veille, la semaine dernire ou mme le mois dernier.
4.LA PRATIQUE
4.1 Mise en place du serveur
Par la suite, je me baserai sur la distribution Gentoo (http://www.gentoo.org/), mais tout ceci est bien
entendu possible sur toute autre distribution Linux. Utiliser rpm ou apt-get la place de emerge sur
une Fedora ou une Debian par exemple. De mme, rc-update et /etc/init.d/commande start sont
spcifiques Gentoo (l'quivalent est, je crois, service sur Fedora).
Premire chose faire: il faut passer en mode super utilisateur dans une fentre terminal ou une
console.
Puis vous devez commencer par installer ssh et faire en sorte que le dmon ssh soit lanc chaque
dmarrage de l'ordinateur:
# emerge openssh; emerge ssh
# rc-update add sshd default
# /etc/init.d/sshd start
Puis, il vout faut installer un gestionnaire de tches automatises comme fcron par exemple:
#
#
#
#
emerge fcron
rc-update add fcron default
/etc/init.d/fcron start
crontab /etc/crontab
Maintenant que les logiciels ncessaires notre entreprise sont installs, il reste configurer le
disque dur de grande capacit pour qu'il soit en mesure de recevoir toutes les donnes des
sauvegardes.
On commence par crer une partition primaire de type ext2 (83) sur le disque 2 (hdb pour hard drive
b) l'aide de l'utilitaire fdisk. Pour cela, tapez les instructions suivantes:
# fdisk /dev/hdb
Command (m for help):
n
p
1
[ENTREE]
[ENTREE]
t
83
w
Remarque: Eventuellement, il vous faudra remplacer le b de hdb par une autre lettre. Pour cela,
utiliser l'instruction suivante et reprez votre deuxime disque dur:
# dmesg | grep DISK | grep hd
Cela dpend de la faon dont vous avez branch les cables plats et configur les disques (en esclave
ou en master) dans la tour de votre PC.
Maintenant, on formate cette nouvelle partition.
# mke2fs /dev/hdb1
Notre disque est maintenant prt accueillir tous les dossiers et sous dossiers ncessaires la
sauvegarde incrmentale des donnes de votre rseau. Toutes les donnes sauvegardes se
trouveront dans des sous-rpertoires de /mnt/backup:
# mkdir /mnt/backup
Utiliser aussi votre diteur de texte favori (vi par exemple) pour rajouter la ligne suivante au fichier
/etc/fstab:
/dev/hdb1
/mnt/backup
ext2
auto,noexec,nouser,rw
0 0
On peut maintenant crer l'ensemble des couples groupe/utilisateur qui auront accs ce systme de
sauvegardes. Je vais vous montrer comment faire pour un seul groupe/utilisateur. Il vous sera alors
trs facile d'adapter la procdure pour un nombre plus important de personnes (quitte faire un petit
script bash pour automatiser tout cela!).
On cre un groupe nomm guser1:
# groupadd guser1
On met ensuite en place un ensemble de rpertoires, ainsi que les droits et propritaires y associer
pour assurer une scurit optimale, c'est--dire pour que seul l'intress (et root bien entendu)
puisse accder aux donnes qui sont les siennes sans voir celles des autres. Notons qu'il est mme
possible de crypter ses donnes pour que le superutilisateur soit lui aussi incapable de voir vos
donnes, mais ce sera pour une autre fois! Pour ceux qui sont un peu perdus dans ce qui va suivre,
merci de lire l'article sur la gestion des permissions des fichiers crit par Fleur Brosseau dans le
LP31.
#
#
#
#
#
#
#
#
#
#
chgrp
chown
chmod
mkdir
mkdir
mkdir
mkdir
chmod
chgrp
chmod
guser1 /mnt/backup/user1
root /mnt/backup/user1
o-rwx /mnt/backup/user1
/mnt/backup/user1/sauvegardes
/mnt/backup/user1/jour
/mnt/backup/user1/semaine
/mnt/backup/user1/mois
-R o-rwx /mnt/backup/user1/
-R guser1 /mnt/backup/user1/
g+w /mnt/backup/user1/sauvegardes
On cre aussi un dossier nomm .ssh qui nous servira par la suite ( nous passer du password):
#
#
#
#
mkdir
chmod
chgrp
chmod
/mnt/backup/user1/.ssh
o+rx /mnt/backup/user1
-R guser1 /mnt/backup/user1/.ssh
g+w /mnt/backup/user1/.ssh
Maintenant, on automatise tout le processus de faon incrmentale. Nous allons faire en sorte,
qu'une fois par mois (resp. semaine, resp. jour) le contenu de chaque dossier chonologique
infrieur soit remont d'un cran. Vous noterez l'utilisation de la commande cp -al qui permet de
crer ce que l'on appelle des liens durs (hard links en anglais). Crer un lien hard vers un fichier
consiste en quelque sorte en crer une copie (sorte de lien symbolique) qui n'utilisera aucune place
supplmentaire sur le disque. Il est alors impossible de dire lequel, du fichier ou de sa copie, est
l'original. On peut crer plusieurs liens hards vers un mme fichier. Le fichier en question existera
tant que l'un des liens hards subsistera.
On cre le fichier /etc/cron.monthly/user1m.cron qui contient les lignes suivantes:
#!
rm
mv
mv
cp
/bin/bash
-rf /mnt/backup/user1/mois
/mnt/backup/user1/semaine /mnt/backup/user1/mois
/mnt/backup/user1/jour /mnt/backup/user1/semaine
-al /mnt/backup/user1/sauvegardes /mnt/backup/user1/jour
u+x /etc/cron.monthly/user1m.cron
/bin/bash
-rf /mnt/backup/user1/semaine
/mnt/backup/user1/jour /mnt/backup/user1/semaine
-al /mnt/backup/user1/sauvegardes /mnt/backup/user1/jour
u+x /etc/cron.weekly/user1w.cron
u+x /etc/cron.daily/user1d.cron
Attention: il faut que l'heure de la sauvegarde soit antrieure celle de la semaine, qui doit elle
mme tre antrieure celle du jour. Il pourrait en effet se produire le problme suivant. Admettons
que la sauvegarde du mois se fasse tous les 1er cinq heures du matin, celle de la semaine tous les
lundis quatre heures et celle du jour trois heures. Supposons maintenant que l'on modifie par
mgarde (sur le PC client) le contenu d'un fichier toto le dimanche 31 dans la journe et que le
client le sauvegarde (de faon automatique ou non) le soir mme sur le serveur dans le dossier
sauvegardes. Alors, le lendemain, qui est un lundi 1er, le fichier toto va d'abord tre transfr dans
le dossier jour trois heures, puis dans le dossier semaine quatre heures et enfin dans le dossier
mois cinq heures. Au bout du compte, le mauvais fichier toto se retrouve dans tous les dossiers!
Pour parer cette ventualit, vous pouvez utiliser le fichier /etc/crontab suivant:
# Le format de chaque entre est:
# minute(1 60) heure(1 24)
jour(1 31)
mois(1 12) joursemaine(1 7) commande
# La commande run-crons, excute toutes les 60/15=4 secondes) regarde s'il y a des
# scripts lancer dans /etc/cron.[hourly|daily|weekly|monthly]
# Les informations sur le dernier lancement d'un programme sont enregistres dans le
# dossier /var/spool/cron/lastrun afin qu'un nouveau lancement du mme programme
# ne se produise pas avant la fin du prcdent.
*/15 * * * *
test -x /usr/sbin/run-crons && /usr/sbin/run-crons
0 * * * *
rm -f /var/spool/cron/lastrun/cron.hourly
0 5 * * *
rm -f /var/spool/cron/lastrun/cron.daily
0 4 * * 1
rm -f /var/spool/cron/lastrun/cron.weekly
# La ligne suivante signifie ainsi que les tches mensuelles seront excutes tous les
# jours portant le numro 1 (c'est--dire chaque 1er du mois) 3 heures (du matin)
# et 0 minutes.
0 3 1 * *
rm -f /var/spool/cron/lastrun/cron.monthly
Remarque: Vous pouvez changer le degr de finesse de vos sauvegardes en rajoutant par exemple
un dossier pour chaque jour de la semaine et pour chaque mois de l'anne. Il pourrait aussi tre
judicieux d'ajouter des quotas disque pour chacun des utilisateurs afin qu'ils ne grignottent pas votre
disque de sauvegarde en quelques jours avec leurs photos et leurs vidos!
Taper enfin l'instruction:
# crontab /etc/crontab
A partir de maintenant, vous copierez toutes les donnes (du poste client) que vous voulez
sauvegarder dans /home/backup.
Crer dans /usr/sbin le fichier nomm sauvegardes.cron qui contient les deux lignes:
date > /home/user1/rsync.log
rsync -e ssh -av --delete --hard-links --progress "/home/backup/"
user1@BACKUP.domaine.com:./sauvegardes/ >> rsync.log
Attention, placer sur une mme ligne l'instruction qui commence par rsync et qui finit par
rsync.log.
Remplacer bien entendu BACKUP.domaine.com par le nom de votre machine BACKUP (ou par son
adresse IP donne par la commande ifconfig | grep inet).
Ensuite, on rend ce fichier excutable par l'utilisateur user1:
Ainsi, chaque fois que l'on voudra sauvegarder ses donnes, il suffira de lancer la commande
/usr/sbin/sauvegardes.cron dans une fentre terminal.
Enfin, pour que la sauvegarde des fichiers de user1 se fasse automatiquement, sans intervention de
sa part:
#
#
#
#
#
#
#
emerge fcron
rc-update add fcron default
/etc/init.d/fcron start
/usr/sbin/sauvegardes.cron
Il reste toutefois une dernire chose faire. En effet, vous pouvez noter que le mot de passe pour se
connecter par SSH la machine BACKUP n'est pas prsent dans le fichier sauvegardes.cron. Et on
n'a pas envie qu'il nous le demande tous les jours, chaque fois qu'il lance la procdure de
sauvegarde automatique!
L'astuce est donc d'utiliser les cls privs/publiques de SSH de la faon suivante:
#
#
#
#
#
Files\cwRsync\bin
@echo off
set PATH=c:\PROGRA~1\cwRsync\bin
date /T >>rsync.log
time /T >>rsync.log
rsync -e ssh -av --delete --progress "/cygdrive/c/Sauvegardes/"
user1@BACKUP.domaine.com:./sauvegardes/ >> rsync.log
echo TERMINE
Attention, placer sur une mme ligne l'instruction qui commence par rsync et qui finit par
rsync.log.
Remplacer bien entendu BACKUP.domaine.com par le nom de votre machine BACKUP (ou par son
adresse IP donne par la commande ipconfig tape dans une fentre de commande DOS).
Dans Dmarrer/Panneau de configuration/Performances et maintenance/Tches planifies, crer une
tche planifie tous les jours de la semaine la mme heure pour executer backup.bat.
Choisir une heure o votre ordinateur est connect au rseau et o vous ne vous en servez pas. Entre
midi et deux par exemple.
La mme procdure que sous Linux concernant les cls privs/publiques de SSH devra tre mise en
place.
Remarque: Avant la premire excution du fichier backup.bat, vous devriez copier la main tous
vos dossiers et fichiers directement sur le serveur distant BACKUP.domaine.com dans le dossier
Sauvegardes. En effet, il semble qu'il y ait un sorte de bug dans la version rsync de Windows qui fait
qu'il n'est pas capable de transfrer un nombre trop important de fichiers d'un seul coup.
Liens
Excellent site en anglais sur le sujet: http://www.mikerubel.org/computers/rsync_snapshots/