Mécanisme de sauvegarde vers disque externe

Bonjour,

Si vous n’avez pas de temps à perdre, ne lisez que ce que j’ai mis en gras :slightly_smiling:

Actuellement, sur mon serveur, j’ai la configuration suivante :
[ul][li]/dev/sda1 -> swap[/li]
[li]/dev/sda2 -> /[/li]
[li]/dev/sda3 -> /home[/li]
[li]/dev/sdb1 -> /srv[/li][/ul]

Un gros disque dur est donc monté sur /srv où le serveur stocke les données de mes services (j’y redirige par lien symbolique quelques petites choses comme /var/www) :
[ul][li]/srv/svn[/li]
[li]/srv/www[/li]
[li]/srv/rsync[/li]
[li]/srv/nfs[/li]
[li]/etc/et-caetera :slightly_smiling:[/li][/ul]

/srv/rsync est déjà une sauvegarde… Sur le principe, ce n’est pas critique puisque déjà existant ailleurs (bien que je suis du genre à croûter mes données le jour où j’ai également croûter mes sauvegardes 0_o). Par contre, le reste est plus précieux à mes yeux et je voudrais le sauvegarder. J’ai par exemple des données qui ne sont pas “les miennes”. Pour le coup, j’ai d’autant plus peur de les perdre.

J’ai donc cassé mon cochon pour acheter un sosie de mon premier gros disque dur mais je ne sais pas trop comment m’y prendre. Mes premières sauvegardes sur /srv sont gérées automatiquement par le serveur et sont différentielles. Sur le deuxième, je ne veux rien de tout ça : je pense qu’il me suffirait de simplement le dupliquer par rsync (j’aime bien rsync :p) mais j’aimerais que ce soit un minimum automatisé.

[b]Ma petite idée serait de détecter dans les logs du serveur le branchement du disque externe et de le monter automatiquement pour déclencher un rsync, m’envoyer un mail quand c’est fini et le démonter. Pour détecter le branchement du disque, j’ai pensé à utiliser incron : un paquet inspiré de cron mais qui utilise des événements sur la mise à jour de fichiers plutôt que sur des heures.

Pensez-vous qu’il faille s’y prendre autrement ? Y’a-t-il une meilleure alternative que je ne connais pas ? Comment feriez-vous ? A vrai dire, le scénario que je viens de décrire me paraît un peu “artisanal”…[/b]

Les contraintes :

  • Ce nouveau disque sera externe, je ne veux le brancher que le temps de la sauvegarde et le ranger ensuite ;
  • Il faut que ce soit libre :wink: évidemment.

Merci pour tout commentaire qui m’aiderait à démarrer (pas besoin d’entrer dans les détails, je veux juste des conseils sur “l’architecture”, “le mode opératoire” - au pire, j’ouvrirai un autre topic si j’ai besoin d’aide ^^).

Bonjour,

On m’a soufflé l’astuce : utiliser udev !

Voici ce que j’ai fait :

server-bl:/etc/udev/rules.d# cat 99-backup.rules KERNEL=="sd?1", ATTRS{model}=="EADS-00R6B0", RUN+="/srv/scripts/backup.sh"

server-bl:/srv/scripts# ls -l backup.sh -rwxr-xr-x 1 root root 371 avril 17 17:34 backup.sh

J’ai dû ajouter les droits +x car u+x ne suffisait pas : ce n’est pas root qui lance le script apparemment.

[code]server-bl:/srv/scripts# cat backup.sh
#!/bin/bash

On declare un fichier de log

log=$(tempfile)
:>$log

On monte le disque dur sur /media/backup

mount -t ext3 /dev/sdd1 /media/backup 1>>&2 2>>$log

rsync -aH /srv/ /media/backup/ 1>>&2 2>>$log
mail -s “Sauvegarde sur le disque dur externe” mon@mail.fr < $log

On demonte le disque

umount /media/backup

On supprime le log

rm -f $log

exit 0[/code]

Le disque ne se monte pas… Il ne se passe rien pourtant mon fichier log est vide. Vous avez une idée ?

Merci d’avance !

EDIT : Je précise que udevadm test m’indique que le script est exécuté et pour preuve, le fichier log est créé mais reste vide.

J’ai changé ma configuration udev pour créer un lien /dev/backup vers mon device. Comme ça, je sais quoi monter dans mon script.

Ce dernier a changé un peu :

[code]server-bl:/srv/scripts# cat backup.sh
#!/bin/bash

On declare un fichier de log

log=$(tempfile)
:>$log

echo “le log est ok” >>$log

echo “test de l’utilisateur” >>$log

whoami >>$log

echo “mkdir du point de montage” >>$log

On monte le disque dur sur /mnt/backup

mkdir /mnt/backup 2>>$log

echo “mount…” >>$log
mount -t ext3 /dev/backup /mnt/backup 2>>$log

echo “sauvegarde” >>$log

Sauvegarde

rsync --exclude=’*~’ --delete-before --delete-excluded --stats -rlpthHP /srv/ /mnt/backup/ 1>>&2 2>>$log

echo “mail” >>$log

Envoi du log par e-mail

mail -s “Sauvegarde sur le disque dur externe” mon@mail.fr < $log

echo “umount” >>$log

On demonte le disque

umount /mnt/backup

echo “rmdir” >>$log
rmdir /mnt/backup

echo “rm log” >>$log

On supprime le log

rm -f $log

exit 0

[/code]

Il y a beaucoup de commandes echo car je suis en plein debugage :frowning: Le log montre que tout s’arrête à “sauvegarde”. Sauf qu’aucun processus rsync n’est lancé.

Le montage n’a pas tellement l’air effectif, je m’explique :

  • il n’y a pas d’erreur
  • mais si je vais dans /mnt/backup et que je fais un “ls”, je dois attendre une petite seconde la première fois, comme si c’était seulement maintenant que je le réveillais.

Serait-ce pour ça que mon rsync échoue ? Vous avez une idée sur ce qu’il se passe ?

Bonjour tout le monde,

Après quelques tests d’affilée, je pense avoir résolu mon problème.

Mon script est juste devenu :

[code]#!/bin/bash

echo “Nouveau fichier de log pour la sauvegarde.” >>$log
log=$(tempfile)
:>$log

echo “Utilisation de /mnt/backup comme point de montage.” >>$log
mkdir /mnt/backup 2>>$log

echo “Montage de la partition de sauvegarde.” >>$log
mount -t ext3 /dev/backup /mnt/backup 2>>$log

On patiente pour laisser le temps au mount d’etre effectif

sleep 5

echo “Sauvegarde…” >>$log
rsync --exclude=’*~’ --delete-before --delete-excluded --stats -rlpthHP /srv/ /mnt/backup/ 1>>$log 2>>$log

echo “Retrait de la partition de sauvegarde.” >>$log
umount /mnt/backup 2>>$log

echo “Suppression du point de montage.” >>$log
rmdir /mnt/backup 2>>$log

echo “Envoi du log par e-mail.” >>$log
mail -s “Sauvegarde sur le disque dur externe” mon@mail.fr < $log

On supprime le log

rm -f $log

exit 0
[/code]

rsync s’est mis à fonctionner après que j’ai changé la façon de gérer ses sorties (flux standard et d’erreur) mais ensuite, je me suis aperçu qu’une partie des mes fichiers étaient sauvegardés dans /mnt/backup avant que le mount ne soit effectif (sur mon disque / pas sur mon disque externe). J’ai donc ajouté un sleep car je les avais retirés pour mes tests.

Désormais, tout fonctionne… Par contre, si quelqu’un comprend ce qui s’est passé, je suis vraiment preneur ! D’où mon message :slightly_smiling:

Merci.