I. Introduction

À la recherche d'une solution souple et adaptable pour effectuer des sauvegardes de données de stations de travail et de serveurs sur un gros serveur de fichiers distant avec une grappe raid6 de 1,2 To (8 disques), la logique me fit lancer un coup d'apt-get lorsque je tombai sur Unison Le man, Unison me donna alors cette brève description : « a file-synchronization tool for Unix and Windows » Toutes mes informations sont sur le site web d'Unison : cliquez ici. Il y a entre autre l'User Manual and Reference qu'il est indispensable de lire. Il débute par quelques exercices faciles pour comprendre le principe de base. Faites vos tests dans un coin pour mieux appréhender l'outil.

II. Installation sur différentes plate-formes

Installation Linux Debian

L'installation sous Debian est toujours aussi facile :

 
Sélectionnez
apt-get install Unison

Installation sous Windows XP

Il y a différents binaires disponibles en téléchargement sur le site d'Unison mais je recommande de prendre la version stable en ligne de commande, facile à installer et à utiliser en batch avec l'ordonateur de tâche. Comme cette version porte le nom d'Unison.win32-textui.exe je vous recommande de le renommer en Unison.exe et de ke placer dans c:/windows/system32/ afin qu'il soit disponible via les variables d'environnement (path).

Installation sous Aix

Unison est disponible sous IBM Aix également, vous pouvez le télécharger sur la page bullfreeware.com. Les intructions d'installation via smitty sont disponibles sur le même site.

III. Première utilisation

Simple comme bonjour si vous avez au moins regardé l'User Manual and Reference qu'il est indispensable de lire.

 
Sélectionnez
Unison dir1 dir2

Par défaut Unison travaille en mode interactif. Il va donc préparer une liste des fichiers et répertoires présents dans dir1 avec leurs attributs (date, taille), puis il vous demandera pour chacun des différences avec dir2, la marche à suivre.

Par exemple pour recopier le fichier file-exemple de dir1 a dir2 voici le dialogue :

 
Sélectionnez
/dir1          /dir2        

new file-exemple  ---->            /  [f] f

La commande f pour flush indique de procéder.

À la suite de cela il vous demande de valider la globalité de la synchronisation, répondez y.

 
Sélectionnez
Proceed with propagating updates? []

Attention à l'ordre de présentation des répertoires à synchroniser ! Présenter dir2 avant dir1 implique que c'est le répertoire dir2 qui est le référent. Si celui-ci est vide, Unison supprimera tout de dir1.

Regardez bien avant de valider.

 
Sélectionnez
/dir2          /dir1        

      ---->   delete file-exemple          /  [f] f

IV. Méthode : De disque à disque

Le plus facile reste encore de faire une synchronisation de disque à disque sur une même machine. Il est possible de le faire au travers d'un montage NFS également.

Voici deux exemples de scripts à placer dans la crontab ou dans l'ordonnateur de tâches.

IV-A. Sous Linux avec NFS

 
Sélectionnez
#!/bin/sh



/usr/bin/Unison /var/lib -path=mysql /mnt/serveur/host/ -batch -force /var/lib

/usr/bin/Unison /var -path=www  /mnt/serveur/host/ -batch

Ici en deux lignes je sauvegarde :

  • Mes bases de données présentes dans /var/lib/mysql ;
  • Mon site web dans /var/lib/www.

J'ai pris soin de monter un partage NFS du serveur dans /mnt/serveur. Pour cela ajoutez la ligne suivante à /etc/fstab et lancer la commande mount -a : serveur.karlesnine.com:/partageNFS /mnt/serveur NFS defaults 0 0

Les options utilisées :

  • -patch=mysql pour ne prendre en compte qu'un repertoire ou fichier dans un dossier racine pouvant en présenter plusieurs comme dans le cas de /var/lib ;
  • -force /var/lib oblige Unison à synchroniser dans un seul sens. ici ne prenant en compte que les modifications locales force /var/lib et les imposant sur le partage NFS ;
  • -batch mode batch, toutes les modifications sont validées par défaut il n'y a donc de confirmation à donner.

IV-B. Sous Windows

Sous windows, il est possible de faire de même via un partage de fichier smb / samba préalablement activé. Je ne détaille pas ici cette manipulation propre a windows.

 
Sélectionnez
>Unison "C:\Documents and Settings\Nat\Bureau" "Z:\Nat\Bureau" -batch -force "C:\Documents and Settings\Nat\Bureau"



>Unison "C:\Documents and Settings\Nat\Mes documents" "Z:\Nat\Mes documents" -batch -force 

"C:\Documents and Settings\Nat\Mes documents"



>Unison "C:\Documents and Settings\Nat\Application Data\Thunderbird" "Z:\Nat\Thunderbird" -batch -force 

"C:\Documents and Settings\Nat\Application Data\Thunderbird"

Sous Windows la syntaxe reste la même, seule change la présentation des chemins de répertoire. Cependant, faites attention aux doubles quotes.

V. Sous Linux via SSH

V-A. Quels avantages ?

Sauvegarder via une connexion SSH offre l'avantage de ne pas utiliser de NFS. On évite donc l'administration de montages non sécurisés par l'utilisation d'un tunnel crypté avec identification par clef.

Pas de NFS pour éviter :

  • Les accès root sur un serveur de fichiers distant ;
  • Les problèmes de montage ;
  • La simple indication donnée par la présence ou le parcours d'une arborescence ;
  • Palier à la faible sécurité de NFS V3.

SSH pour :

  • Avoir des connexions ponctuelles, automatisées et masquées ;
  • Limiter les droits de connexion ;
  • Crypter les tunnels de connexion. ;
  • Avoir une compression minimum du transfert de donnée ;
  • Pouvoir révoquer les droits de connexion de façon centralisé ;

Unison pour :

  • La synchronisation bi-directionnelle ;
  • Le filtrage sur les noms de fichiers ;
  • L'intégration avec SSH.

V-B. Serveur de fichiers

Sur le serveur de fichiers, copiez la clef SSH publique créée spécialement pour cette connexion de backup en ajoutant l'option no-pty dans le fichier $HOME/.SSH/authorized_keys du compte choisi pour recevoir la connexion . Ceci, pour bloquer l'ouverture d'un shell (apportant un petit plus de sécurité) comme dans cet exemple :

 
Sélectionnez
no-pty SSH-dss AAAAB3NzaC...../ /...qxX/27ZZ9X5vAVA== backup

Attention à bien choisir le compte utilisé et à configurer les droits d'écriture sur l'arborescence de destination choisie. Dans mon architecture j'ai pris le compte admin qui est qu'un simple compte utilisateur lamba. Ce fichier de configuration apporte le filtrage sur différents noms de fichiers qu'il est trop difficile à sauvegarder ou inutile.

  • ignore = Name pour exclure de la synchronisation des fichiers trop souvent modifiés ou volumineux ;
  • ignore = Path .Unison pour le pas synchroniser le répertoire d'Unison présent dans le compte utilisateur qui lance la synchronisation. En effet Unison stocke ici ses tables de mise à jour qu'il modifie durant chaque synchronisation ;
  • Logfile Pour que Unison sauvegarde les logs ailleurs que dans l'environnement utilisateur.

V-C. Serveur client

Ajouter dans le répertoire .SSH du compte servant à faire le backup, ici root pour parcourir l'arborescence quel que soit le propriétaire des répertoires, le fichier de configuration particulier nommé config suivant :

  • Host backup ;
  • Compression yes ;
  • ForwardAgent no ;
  • Cipher blowfish ;
  • User admin ;
  • IdentityFile ~/.SSH/backup ;
  • HostName serveur.karlesnine.com.

Ce fichier apporte l'utilisation d'un alias backup pour un ensemble de paramètres. En voici l'explication dans l'ordre :

  • La compression ;
  • Le blocage du forward de clé ;
  • Une cryptographie légère blowfish ;
  • Le compte utilisateur cible ;
  • la définition de la clé ;
  • Le serveur de destination ;
  • Etc.

Je ne peux que vous conseiller de vous reporter au site officiel OpenSSH pour plus de documentation.

V-C-1. Fichier de configuration Unison

La configuration d'Unison se fait avec un fichier default.prf placé dans le répertoire $HOME/.Unison du compte servant à faire le backup.

 
Sélectionnez
# Unison preferences file

ignore = Name {core,*.pyc,*.dat,*.xcu, *.dvi, *.log, *.pid, *.out, Unison.log}

ignore = Path .Unison

ignore = Name toto

ignore = Name tutu

ignore = Name tmp

ignore = Name temp

logfile = /var/log/Unison.log

V-C-2. Exemple d'un shell script dee backup

 
Sélectionnez
#!/bin/sh

#

# Backup avec Unison

# http://www.cis.upenn.edu/~bcpierce/Unison/

# Charles-Christian CROIX

# 15/01/2005

# 15/07/2005



Unison="/usr/bin/Unison"

MYSQLDUMP="/usr/bin/mysqldump"

VARSQLDUMP="/var/lib/mysql/dump"



$Unison /etc SSH://backup//home/backupbyhost/$HOSTNAME/etc  -silent -backups -maxbackups 3 -batch -force /etc

$Unison /root SSH://backup//home/backupbyhost/$HOSTNAME/root -silent -backups -maxbackups 3  -batch -force /root



$MYSQLDUMP -u root  --all-databases | gzip > /var/lib/mysql/dump/FullDatabasesBackup_$HOSTNAME.sql.gz

$Unison /var/lib/mysql/dump SSH://backup//home/backupbyhost/$HOSTNAME/var/lib/mysql/dump/ -silent -batch -force $VARSQLDUMP



cat /var/log/Unison.log | mail admin@webank.fr -s "[$HOSTNAME] Backup"

cat /dev/null > /var/log/Unison.log

Option d'Unison :

  • SSH ://backup//home/backupbyhost/$HOSTNAME/etc dans cette ligne nous voyons l'alias SSH backup utilisé ;
  • -silent pour éviter que le cron utilisé pour lancer ce script ne vous spamme ;
  • -batch pour éviter l'interactivité ;
  • -force pour forcer la mise à jour du serveur de backup même si celui-ci semble être plus récent ;
  • -backups pour demander de sauvegarder la version précédente d'un fichier devant être synchronisé avant son écrasement. Sur le serveur distant un fichier test.txt sera ainsi recopié en .test.txt.0.Unison.bak avant que la nouvelle version de test.txt ne soit écrite ;
  • -maxbackups 3 Nombres maximum de sauvegarde avec l'option -backups. Ici trois versions comme dans cet exemple : .test.txt.0.Unison.bak .test.txt.1.Unison.bak .test.txt.2.Unison.bak ;
  • Etc.

Concernant l'utilisation de mysqldump :

Dans cet exemple j'ai fait le choix d'extraire l'intégralité des informations des bases de données (data et structure) dans un fichier .sql que le gzip par la suite. C'est ce fichier qui est placé dans un répertoire devant être synchronisé. Plus facilement il est possible de sauvegarder l'arborescence de mysql en entier afin de disposer des fichiers base par base de données et table par table. Attention de stopper mysql si besoin pour accéder au fichier en dehors de toute écriture.

V-C-3. Exemple d'un shell script aix de backup

Voici le même script que précédement mais adapté a l'environnement Aix qui ne comporte pas les mêmes variables d'environement ($HOSTNAME) ni les mêmes emplacements pour Unison. En outre la commande Mail ne répond pas à la même syntaxe.

 
Sélectionnez
#!/bin/sh

#

# Backup avec Unison

# http://www.cis.upenn.edu/~bcpierce/Unison/

# Charles-Christian CROIX

# 15/01/2005

# 15/07/2005

# 04/08/2005 Aix version



HOSTNAME="aix3"

Unison="/usr/local/bin/Unison"



cat /dev/null > /root/.Unison/Unison.log

date > /root/.Unison/Unison.log





for I in `ls -l /home | grep ^d | grep -v lost+found | awk '{print $9}'`;

 do /usr/local/bin/Unison /home/$I  SSH://backup//home/backupbyhost/$HOSTNAME/home/$I -silent -backups -maxbackups 2  -batch -force /home/$I;

done;



$Unison /etc SSH://backup//home/backupbyhost/$HOSTNAME/etc  -silent -backups -maxbackups 3 -batch -force /etc

$Unison /root SSH://backup//home/backupbyhost/$HOSTNAME/root -silent -backups -maxbackups 3 -batch -force /root 



mail -s "[Aix3] Backup" admin@mon_mail.fr < /root/.Unison/Unison.log

La boucle for en shell est destinée à obtenir la liste des seuls répertoires présents dans /home (donc à l'exclusion des fichiers) et à filtrer ceux-ci par un grep -V pattern en fonction de l'environnement particulier de chaque machine aix, puis pour chaque élément de cette liste, réaliser une synchronisation.

VI. Remerciements et autres.

Adapté par Katyucha.

Merci à Pharaonix pour sa relecture.